Вы находитесь на странице: 1из 7

MICROCONTROLADORES Y SISTEMAS EMBEBIDOS

ADCs en dspic30f y dspic33f

Los dispositivos dsPic ofrecen un potente módulo ADC (convertidor analógico a digital) que
puede muestrear a velocidades de hasta 1 Msps. Se puede usar en una variedad de formas y
modos diferentes para satisfacer las necesidades de su proyecto.

Esta separata está dirigido a enseñar los conceptos básicos de los módulos de conversión A / D
a todos aquellos que están comenzando sus proyectos con los dsPics.

microcontrolador dsPic30f4013 junto con su programador

Cómo dar entrada al ADC

El primer paso es configurar el hardware requerido para dar entrada al ADC.

Muestreo de una señal de CC:

Para la prueba inicial, puede usar un potenciómetro conectado a través de un suministro de 5


V y dar entrada a los pines analógicos ADC directamente.

Muestreo de una señal de CA con ADC:

Para muestrear una señal de CA (voltajes o corrientes de línea), deberá:

Reduzca la señal al nivel de voltaje requerido con la ayuda de transformadores.

Cambie el nivel de la señal para que los valores negativos debajo de cero se cambien hacia
arriba. Los ADC en las imágenes no pueden muestrear señales negativas.

Este diseño de circuito de referencia puede ayudarlo con los circuitos de cambio de nivel:

SENSADO DE SEÑAL AC

JACOB ASTOCONDOR VILLAR pág. 1


MICROCONTROLADORES Y SISTEMAS EMBEBIDOS

Muestreo de una señal de CA con ADC. (La ganancia del amplificador operacional puede
sintonizarse a través de la resistencia variable para lograr una salida en el rango de 0 a 5 V, sin
embargo, uso un valor de 2.7 kOhms en su lugar). (Haga clic para agrandar).

Probando el ADC

Después de configurar el hardware y el código necesarios, deben ser una forma de comprobar
si el ADC está realmente muestreando correctamente de la manera requerida o no. Como no
se puede mirar dentro de la MCU para ver si todo funciona correctamente, sugiero dos
maneras:

1. Puede conectar un depurador con Pic como el que se muestra arriba. En el modo de
depuración, puede verificar el valor en los registros ADCBUF0 a 10 para ver si se están
cargando con valores muestreados correctamente.
2. Puede enviar los valores del registro ADCBUF a través de UART y supervisarlos en una
PC con la ayuda de un monitor en serie.

Código de ejemplo ADC para dsPIC

#include "xc.h"
#define FCY 20000000
#define FPWM 3600
#include <xc.h>
#include <stdio.h>
#include <delay.h>
#include <libpic30.h>
#include <dsp.h>
#include <math.h>

_FOSC( CSW_FSCM_OFF & XT_PLL8 ); // External Oscillator, PLLx8


_FWDT( WDT_OFF ); // Watchdog timer off
_FBORPOR( MCLR_DIS ); // Disable reset

int ADCValue;

void init_ADC( void )


{
TRISB = 0xFFFF; //Set as Input Port
ADPCFG = 0x0000; //Selecting all analogue pins to analogue mode

ADCHSbits.CH0SA = 1;
ADCHSbits.CH0NA = 0;
//ADCHSbits.CH123SA = 0;
//ADCHSbits.CH123NA = 0;

IEC0bits.ADIE = 1; //Enable ADC Interrupt


IPC2bits.ADIP = 1; //set interrupt priorty-6

ADCSSLbits.CSSL0 = 0; //Skip input scan for analoge pin AN0,AN1,AN2


ADCSSLbits.CSSL1 = 0;
ADCSSLbits.CSSL2 = 0;

ADCON3bits.SAMC = 0; //Auto sample time 6TAD//max sample time


ADCON3bits.ADRC = 0; //selecting Conversion clock source derived from system clock
ADCON3bits.ADCS = 9; //Selecting conversion clock 6Tcy

ADCON1bits.ADSIDL = 0; //Selecting continue mode operation in idle mode


ADCON1bits.FORM = 1; //Selecting data output in signed integer format
ADCON1bits.SSRC = 0; //Selecting Motor Control PWM interval ends sampling and starts conversion

JACOB ASTOCONDOR VILLAR pág. 2


MICROCONTROLADORES Y SISTEMAS EMBEBIDOS

ADCON1bits.SIMSAM = 0; // Samples CH0, CH1, CH2, CH3 simultaneously


ADCON1bits.ASAM = 0; //Selecting Sampling begins immediately after last conversion completes. SAMP bit is auto set
ADCON1bits.SAMP = 0; // At least one A/D sample/hold amplifier is sampling

ADCON2bits.VCFG = 0; //Voltage Reference Configuration bits


ADCON2bits.CSCNA = 0; //Disable input scan
ADCON2bits.CHPS = 0; //Selecting conversion channel CH0
ADCON2bits.SMPI = 0; //Selecting 1 conversion sample per interrupt
ADCON2bits.ALTS = 0; //Uses MUX A input multiplexer settings
ADCON2bits.BUFM = 0; // Buffer configured as one 16-word buffer ADCBUF(15...0)

ADCON1bits.ADON = 1; //A/D converter is ON


}

void readADC( )
{
//ADCON1bits.SAMP = 1; // start sampling, automatic conversion will follow
//__delay_ms( 100 );
ADCON1bits.SAMP = 0; // start sampling, automatic conversion will follow
while ( !ADCON1bits.DONE ); // wait to complete the conversion
ADCValue = ADCBUF0; // read the conversion result
}

void main( void )


{
init_ADC();
int data;

while( 1 )
{
readADC();
data = ADCValue;
}
}

Configurando el Módulo ADC

El módulo ADC se puede inicializar y configurar con la ayuda del código proporcionado
anteriormente. Sigue una guía paso a paso:

Los pasos 1 a 7 son esenciales. Después de 7 cualquiera o todos ellos pueden omitirse.

1) Configure el puerto como entrada y en modo analógico

El puerto B, en el que están presentes las patillas de entrada ADC, debe configurarse como un
puerto de entrada. (línea - 21).

Deben establecerse en el modo de entrada analógica mediante el registro ADPCFG. (línea - 22).

2) Seleccione entradas analógicas para muestreo

Las entradas analógicas deben conectarse a un 'canal ADC' para el muestreo. Generalmente
hay más cantidad de entradas analógicas en comparación con los canales, por ejemplo:
dsPic30f4011 tiene 09 entradas analógicas pero solo 04 canales ADC. Por lo tanto, ahora debe
seleccionar qué pin de entrada analógica está conectado a qué canal ADC. Esto se hace con la
ayuda del registro de ADCHS.

 Aquí AN1 se selecciona como la entrada de pin analógico al canal 0. (línea - 2).
 El número de canales determina la cantidad de muestras simultáneas posibles.
 El controlador puede muestrear alternativamente entre Mux A y Mux B.

JACOB ASTOCONDOR VILLAR pág. 3


MICROCONTROLADORES Y SISTEMAS EMBEBIDOS

Possible Resulting Analouge


Configurations of Input Pin Code line
ADCHS Configuaration

Se puede seleccionar
ADCHSbits.CH0SA = 1; o
cualquier pin anlouge de
cualquier otro número
Canal 0 -> Mux A AN0 - AN8 para dar entrada
dependiendo del pin
al canal 0 a través de Mux
A.

La entrada del canal 1 es


Canal 1, 2 y 3 -> Mux A
AN3, canal 2 -> AN4, canal ADCHSbits.CH123SA = 1;
3 -> AN5

Se puede seleccionar ADCHSbits.CH0SB = 1; o


Canal 0 -> Mux B cualquier pin anlouge de cualquier otro número
AN0 - AN8 para dar entrada dependiendo del pin
al canal 0 a través de Mux B

La entrada del canal 1


Canal 1, 2 y 3 -> Mux B
es AN3, canal 2 -> AN4, ADCHSbits.CH123SB = 1;
canal 3 -> AN5
Selección de diferentes combinaciones de entradas analógicas ADC y canales para dispositivos
dspic30f. (Los dispositivos dspic33f pueden tener más canales y entradas disponibles)
3) Seleccione la referencia de voltaje
Se debe seleccionar una referencia de voltaje para que coincida con el rango de entrada de las entradas
analógicas. Hay dos opciones para esto.

 bien Vcc y Gnd se pueden hacer límites de referencia superior e inferior.


 se puede aplicar un voltaje de referencia externo en el pin AVref.
Esto se hace con la ayuda del bit VCFG en el registro ADCON2. (línea - 47)

VCFG Vref (higher) Vref (lower)

0 AVdd AVss

1 External Vref + AVss

2 AVdd External Vref -

3 External Vref + External Vref -

4) Seleccione el Formato de salida de datos


El formato de salida de los datos muestreados a través de ADC también se puede especificar con la ayuda
del bit FORM en el registro ADCON1, de acuerdo con la tabla siguiente
FORM Data Output Format

0 integer

1 signed integer

2 fractional

JACOB ASTOCONDOR VILLAR pág. 4


MICROCONTROLADORES Y SISTEMAS EMBEBIDOS

FORM Data Output Format

3 signed fractional

5) Seleccione la fuente del disparador de conversión


La conversión de analógico a digital dentro del módulo ADC puede iniciarse por una cantidad de fuentes
de activación, determinadas por los bits SSRC en el registro ADCON1 de acuerdo con la siguiente tabla:

SSRC Conversion Trigger Source

La eliminación manual del bit SAMP finaliza el


0
muestreo y comienza la conversión.

La transición activa en el pin INT0 finaliza el


1
muestreo y comienza la conversión.

El temporizador 3 compara el muestreo de los


2
extremos del partido y comienza la conversión

El final del ciclo de PWM finaliza el muestreo y


3
comienza la conversión.

Conversión automática activada por el contador


7
interno.

6) Seleccione el modo de muestreo


El muestreo en canales ADC se puede iniciar con:

 Configurar el bit SAMP manualmente en el código, o:


 Automáticamente después del final de la última conversión.
Esto es decidido por el bit ASAM en el registro ADCON1.

ASAM Mode

El muestreo comienza cuando se establece el


0
bit SAMP

El muestreo comienza inmediatamente


1
después del final de la última conversión.

7) Seleccione el reloj de conversión


Cualquier conversión de Analouge a Digital con el módulo A / D requiere 12 períodos de reloj. El período
de un solo ciclo de reloj puede configurarse con la ayuda de bits ADCS en el registro ADCON3. El valor
colocado en ADCS es un valor de seis bits. Esto se puede calcular a partir de las siguientes fórmulas:

El valor mínimo de Tad que se puede usar es de 154 nanosegundos.

8) Decida si se requiere el muestreo simultáneo o no


(Paso opcional)

JACOB ASTOCONDOR VILLAR pág. 5


MICROCONTROLADORES Y SISTEMAS EMBEBIDOS

El muestreo simultáneo se puede habilitar con el bit SIMSAM en el registro ADCON1. El muestreo
simultáneo captura las muestras de todos los canales de entrada exactamente en el mismo instante. Si el
muestreo simultáneo está desactivado, los canales serán muestreados uno después del otro.

9) Seleccione la fuente del reloj de conversión


(Paso opcional)

En la mayoría de los casos, la fuente del reloj de conversión se selecciona para que sea el reloj del sistema
al establecer el bit ADRC en el registro ADCON3 en 0.

10) Determine si se requiere escaneo de entrada


(Paso opcional)

Este paso se puede omitir en la mayoría de las aplicaciones.


El escaneo de entrada puede ser habilitado por el bit CSNA en el registro ADCON2.
El canal 0 del módulo ADC puede configurarse para escanear múltiples entradas analógicas. Esto se
puede usar si son varias fuentes de entrada y no todas están activas al mismo tiempo.

La interrupción de ADC en dspic30f y dspic33f


En lugar de utilizar la función readADC () en el cuerpo principal para leer los valores del módulo ADC,
se usa una interrupción para realizar la misma función en la mayoría de las aplicaciones avanzadas.

Para obtener más información sobre las interrupciones, consulte este tutorial detallado - Cómo usar
interrupciones en Pic MicroControllers

Código basado en interrupciones para ADCs en dspic30f y dspic33f

#define FCY 30000000


#include <xc.h>
#include <stdio.h>
#include <delay.h>
#include <libpic30.h>
#include <math.h>
#include <p30F4011.h>

_FOSC(CSW_FSCM_OFF & FRC_PLL16); // Fosc=16x7.5MHz, i.e. 30 MIPS


_FWDT(WDT_OFF); // Watchdog timer off
_FBORPOR(MCLR_DIS);

void Interrupt_Init( void )


{
IEC0bits.ADIE = 1; //Enable ADC Interrupt
IPC2bits.ADIP = 6; //set interrupt priority = 6
}

void __attribute__((interrupt, auto_psv))_ADCInterrupt (void)


{
while ( !ADCON1bits.DONE ); // wait to complete the conversion
sample.Va = ADCBUF0;
sample.Vb = ADCBUF1;

IFS0bits.ADIF = 0;
}

int main( void )


{
// Make RD0 a digital output
_TRISD0 = 0;

Interrupt_Init();
ADC_Init();

while( 1 )
{

JACOB ASTOCONDOR VILLAR pág. 6


MICROCONTROLADORES Y SISTEMAS EMBEBIDOS

_LATD0 = 1;
__delay32(15000000);
_LATD0 = 0;
__delay32(15000000);
}
}

 Se debe seleccionar una fuente de activación de conversión para que la interrupción de ADC
funcione correctamente como se indica en el paso 5.
 El muestreo debe hacerse en modo automático. (Bit ASAM)
 La frecuencia del disparo de la interrupción de ADC se puede controlar con la ayuda de bits
SMPI en el registro ADCON2. (línea 50).

JACOB ASTOCONDOR VILLAR pág. 7

Вам также может понравиться