Programación ADC. Microcontrolador ATmega8 ADC, voltímetro digital. Macro para iniciar la conversión

Muchos AVR tener a bordo CAD aproximaciones sucesivas.
CAD esto es de diez bits, pero con una precisión de +/- 2 dígitos menos significativos, se puede considerar con seguridad de ocho bits :) Dado que los dos dígitos inferiores son siempre una especie de basura, no similar a una señal útil. Sin embargo, esta es una buena herramienta para monitorear el voltaje, en modo de ocho bits tiene 256 cuentas y emitiendo la frecuencia de muestreo hasta 15kHz(15 mil muestras por segundo).

Configuración de origen
Señal de entrada CAD suministrado a través de un multiplexor, desde una de las ocho (en el mejor de los casos, a menudo menos) entradas. La selección de entrada se realiza mediante registro. ADMUX, o más bien sus bits MUX3…MUX0. El número escrito allí determina la entrada seleccionada. Por ejemplo, si MUX3..0 = 0100 , entonces la salida está conectada ADC4.

Además, existen varias combinaciones de bits de servicio. MUX, utilizado para la calibración.
Por ejemplo, 1110 se conecta a CAD referencia interna de 1,22 voltios. Y si escribimos en MUX3..0 todas las unidades, entonces CAD Se plantará en el suelo desde el interior. Esto es útil para identificar diversos ruidos e interferencias.

en los mayores AVR familias Mega(8535, 16, 32, 128) es posible habilitar CAD en modo entrada diferencial. Aquí es cuando vienen dos entradas. diferentes voltajes. Uno se resta del otro y también se puede multiplicar por el factor de ganancia. ¿Por qué es esto necesario? Y, por ejemplo, cuando es necesario medir el desequilibrio de tensión del puente de medición. Con algún puente extensímetro, con un voltaje de entrada de cinco voltios, las señales de salida diferirán entre sí en solo 30 mV, así que fíjate. ¡Y entonces apliqué la entrada diferencial, ajusté la ganancia y la belleza requeridas!

tabla de valores MUX3..0 No enumeraré el interruptor diferencial aquí, se encuentra fácilmente en la hoja de datos, se llama " Selecciones de canal de entrada y ganancia". Explicaré sólo un punto sutil. En el modo de selección de entrada diferencial, ocurren las siguientes combinaciones: la primera entrada es ADC0 y la segunda entrada también es ADC0 Bueno, y el factor de ganancia también. ¿Cómo es eso? Después de todo, para la entrada diferencial necesitas dos diferentes¡entrada! Al principio pensé que había un error tipográfico, saqué la hoja de datos de otro AVR, el mismo arriba. Luego miré el texto a continuación y me di cuenta de que esto es para calibración cero. Aquellos. Antes de comenzar a recopilar datos diferenciales, debemos cortocircuitar las entradas para comprender que tenemos cero. Entonces, la combinación cuando dos entradas están conectadas a una pata es el mismo cortocircuito de calibración de las entradas. Si haces la primera transformación en esa basura, obtienes desplazamiento cero. Y luego lo restas de todos los valores obtenidos, lo que aumenta drásticamente la precisión.

La multiplexación de canales se lleva a cabo solo después de que se completa la conversión, por lo que puede comenzar de manera segura CAD para calcular los valores de entrada, escriba los parámetros de otra entrada en MUX3..0 y prepárese para tomar datos de allí.

Selección de señal de referencia
Este es el voltaje máximo que se tomará como máximo durante las mediciones. El voltaje de referencia debe ser lo más estable posible, sin interferencias ni fluctuaciones; la precisión del funcionamiento depende dramáticamente de esto. CAD. Está especificado en bits. REFS1..0 registro ADMUX.

  • Por defecto está ahí REFS1..0 = 00- externo Y EL, conectado a la entrada AREF. Este puede ser el voltaje de un microcircuito de voltaje de referencia especial o de algún diodo Zener, si necesita medir un voltaje pequeño, notablemente menor que el voltaje de suministro, digamos de 0 a 1 voltio, entonces para ser más preciso y para que no se pierde en el contexto de una fuente de alimentación de cinco voltios, luego en AREF establecemos el voltaje de referencia en 1 voltio.
  • REFS1..0 = 01- aquí simplemente se toma la tensión de alimentación. Casi todo el mundo tiene a Meg con CAD hay una entrada AVCC- esta es la tensión de alimentación para CAD y el puerto en el que se encuentra CAD colgado. Es recomendable servir comida adicional allí a través de LC filtro para evitar distorsiones.
  • REFS1..0 = 11- referencia de tensión interna a 2,56 voltios. Para ser honesto, realmente no me gustó la calidad de esta fuente. Testimonio con el CAD Nadan como mierda en un agujero de hielo. Pero si es imposible garantizar un suministro de voltaje fluido y estable a AREF o AVCC entonces saldrá a dar una vuelta. Por cierto, interno. Y EL conectado a la salida AREF así que puedes colgar el conder allí e intentar alisarlo un poco. Un poco, pero ayuda.
Seleccionar el modo de inicio de la conversión
en el registro SFIOR bajo CAD se asignan hasta tres bits. ADTS2..0 que controlan los modos de lanzamiento CAD.
  • Por defecto ADTS2..0 = 000 y esto significa que la transformación está en curso. Bueno, o mediante arranque manual.
  • ADTS2..0 = 001- lanzamiento CAD de un comparador analógico. Muy conveniente. Por ejemplo, para no medir constantemente el valor de entrada, sino programar el comparador de modo que tan pronto como supere el umbral, inmediatamente tomará este asunto para CAD.
  • ADTS2..0 = 010— disparo por interrupción externa INT0
  • ADTS2..0 = 011- por coincidencia del temporizador T0
  • ADTS2..0 = 100- en el desbordamiento del temporizador T0
  • ADTS2..0 = 101- por coincidencia con el temporizador T1
  • ADTS2..0 = 110— En desbordamiento del temporizador T1
  • ADTS2..0 = 111— Por evento “captura” del temporizador T1
Velocidad de funcionamiento del ADC
Frecuencia de muestreo CAD especificado en bits de preescalador ADPS2…0 registro ADCSR. La tabla en sí se puede consultar en la hoja de datos del MK correspondiente; solo diré que la precisión más óptima del funcionamiento del módulo es CAD esta dentro 50…200kHz, por lo que el preescalador debe ajustarse en función de estas consideraciones. A medida que aumenta la frecuencia, la precisión disminuye.

Interrumpe.
Naturalmente CAD hay interrupciones. En este caso, se trata de una interrupción al final de la conversión. Se puede habilitar con un poco UNA MUERTE, y descaradamente dispara manualmente a la bandera. ADIF(registro ADCSRA). Bandera ADIF eliminado automáticamente al ir al vector de interrupción CAD.

Datos de CAD colapsar en un par de registros ADCH: ADCL donde se pueden recoger? Y hay un momento genial aquí. Nuestro par de registros es de 16 bits, pero CAD tiene un poco de profundidad 10 bits. Como resultado, sólo un registro está completamente ocupado y el segundo ocupa sólo los dos bits restantes. Entonces, la alineación puede ser alineada a la derecha: los dos bits más significativos en ADCH, y los más jóvenes en ADCL, o izquierda: los bits más significativos en ADCH, y los dos bits menos significativos en ADCL.

[x][x][x][x][x][x] : o : [x][x][x][x][x][x]


¿Por qué se hizo esto? Y esto muestreo de profundidad de bits tan singularmente organizado. Como ya dije, en los rangos inferiores todavía hay basura y ruido (al menos yo no pude deshacerme de ellos, por mucho que lo intenté). Asi que aqui esta. Alinear a la izquierda. Y llegamos a los rangos superiores sólo del registro ADCH, y le puntuamos al más joven. En total, nuestro número de muestras es 256. El bit es responsable de la alineación. ADLAR en el registro ADMUX 0 - alineación hacia el borde derecho, 1 - hacia la izquierda.

Inicie la conversión de forma manual o continua.
Para iniciar la conversión primero debes habilitar el trabajo. CAD, ajustando el bit ADÉN en el registro ADCSR y en el mismo registro pinchar un poco ADSC. Para iniciar una conversión continua (una tras otra), también es necesario configurar el bit ADFR (UNA CITA En algunos AVR).

Aumento de la precisión al entrar en hibernación.
Para mejorar la precisión, de modo que los circuitos internos CAD no te metas con tu ruido, puedes empezar CAD V modo de sueño. Aquellos. el proceso se detiene, todo se congela. Sólo funciona Perro guardián y bloquear CAD. Tan pronto como se cuentan los datos, se genera una interrupción que despierta el procesador, va al manejador de interrupciones desde CAD y luego todo sigue su curso.

Ahora daré un par de ejemplos de inicialización simple y trabajo con CAD. Microcontrolador ATMega16

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 < La señal de entrada proviene del canal cero del ADC.

; Mi macro favorita para escribir en puertos:)))) .MACRO outi LDI R16,@1 OUT @0,R16 .ENDM ; ADC Init: inicializa el ADC. Esto se puede poner en algún lugar al principio del código OUTI ADCSRA,(1< La señal de entrada proviene del canal cero del ADC.

¿Qué hacer a continuación? ¡Nada! ¡Siéntate y espera la interrupción!
Cuando llegue, el procesador lo arrojará al vector y luego podrá reescribir los datos desde ADCH: ADCL a otro lugar, o algún trámite sencillo allí mismo, sin salir de la caja registradora. Como promediar.

Opción dos, con hibernación. En principio, todo es igual, solo necesita desactivar el reinicio automático de la conversión. Siguiente en el registro MCUCR en pedazos SM2..0 Seleccionar modo Reducción de ruido ADC SM2..0 = 001 y luego, inmediatamente después del inicio, envíe el procesador a hibernación con el comando DORMIR. Tan pronto como se duerma funcionará. ADC, hará la conversión y se despertará con la interrupción.

Se parece a esto:

; ADC Init: inicializa el ADC. Esto se puede poner en algún lugar al principio del código OUTI ADMUX, 0b01000101; y aquí elegimos de dónde obtendremos la señal; REFS --0b000101 los primeros dos bits son el voltaje de la entrada AVCC; ADLAR --0b0100101 el siguiente el bit está alineado a la derecha; MUX - 0b010 La señal de entrada llega desde el quinto tramo. SALIDA MCUCR,0b10010000; Configure los bits del modo de suspensión en Reducción de ruido; Y este es el cuerpo del programa principal Main Prog: OUTI ADCSRA,(1<

Bueno, para aumentar la precisión, debes seguir una serie de reglas para conectar la energía a CAD módulo, por ejemplo, suministra voltaje a la entrada AVCC A través del estrangulador, instale condensadores y más tierra alrededor. Todo sobre esto está en la hoja de datos. Pronto publicaré un ejemplo de un programa de trabajo, un ejemplo para CAD Y UART.

ADC – convertidor analógico a digital (ADC-Analog-to-Digital Converter). Convierte una señal analógica a digital. Profundidad de bits CAD Determina la precisión de la conversión de la señal. El tiempo de conversión es la velocidad de funcionamiento del ADC correspondiente. El ADC está integrado en muchos microcontroladores de la familia. AVR y simplifica el uso del microcontrolador en cualquier circuito de control donde sea necesario digitalizar una determinada señal analógica.

Consideremos el principio de funcionamiento. CAD. Para la conversión, necesitamos una fuente de voltaje de referencia y el voltaje real que queremos digitalizar (el voltaje que se convierte debe ser menor que el de referencia). También necesitamos un registro donde se almacenará el valor convertido, llamémoslo z. Voltaje de entrada = Voltaje de referencia*Z/2^N, donde N es el tamaño de bits del ADC. Aceptemos que este registro, como el ATmega8, es de 10 bits. La transformación en nuestro caso se produce en 10 etapas. MSB Z9 se establece en uno. A continuación, se genera voltaje. (Tensión de referencia*Z/1024), este voltaje se compara con la entrada mediante un comparador analógico, si es mayor que la entrada, bit Z9 se vuelve igual a cero y, si es menor, sigue siendo uno. A continuación pasamos al bit. Z8 y utilizando el método descrito anteriormente obtenemos sus valores. Después del cálculo del registro z completada, se establece una determinada bandera, que indica que la conversión se completó y el valor resultante se puede leer. La precisión de la conversión puede verse muy influenciada por interferencias e interferencias, así como por la velocidad de conversión. Cuanto más lenta se produce la transformación, más precisa es. El ruido y las interferencias deben abordarse mediante inductancia y capacitancia, como aconseja el fabricante en la hoja de datos:

En microcontroladores AVR El pin se puede utilizar como fuente de voltaje de referencia. AREF, o fuentes internas de 2,56V o 1,23V. Además, la fuente del voltaje de referencia puede ser el voltaje de suministro. Algunos casos y modelos de microcontroladores tienen pines separados para alimentar el ADC: AVCC Y AGND. conclusiones ADCN– canales CAD. Desde qué canal se digitalizará la señal se puede seleccionar mediante un multiplexor.
Ahora demostremos con un ejemplo lo dicho anteriormente. Construyamos un modelo que funcione como un voltímetro con escala digital. Acordemos que el voltaje máximo medido será de 10V. También permita que nuestro diseño muestre el contenido del registro en la pantalla LCD. CAD.

Para ampliar, haga clic en el diagrama.

Conexión del microcontrolador y la pantalla LCD WH1602A estándar. X1– Resonador de cuarzo de 4 MHz, condensadores. C1, C2– 18-20 pF. R1-C7 el circuito en el pin de reinicio es de 10 kOhm y 0,1 µF, respectivamente. LED de señal D1 y resistencia limitante R2 200 ohmios y R3– 20 ohmios. Ajuste del contraste de la pantalla LCD – VR1 a 10 kOhmios. Usaremos la fuente de voltaje de referencia incorporada de 2.56V. Usando un divisor R4-R5 conseguiremos una tensión máxima de 2,5V en la entrada PC0, con una tensión en la sonda de 10V. R4– 3 kOhmios, R5– 1 kOhm, su clasificación debe tomarse con cuidado, pero si no es posible seleccionar exactamente lo mismo, puede hacer cualquier divisor resistivo 1:4 y corregir las lecturas mediante programación si es necesario. Un inductor de 10 µH y un condensador de 0,1 µF para eliminar ruido e interferencias. CAD no se muestra en el diagrama. Su presencia está implícita por sí misma si se usa. CAD. Ahora le toca al programa:

(estilo de cita de código="pincel: xml;") #include

#definir RS 2 //RS=PD2
#definir E 3 //E=PD3

#define TIME 10 //Constante de retardo de tiempo para LCD
//Frecuencia de reloj MK - 4 MHz

#definir R_division 3.837524 //=Constante R4/R5

Int sin signo u=0; //Variable global con el contenido de la transformación

Pausa vacía (unsigned int a)
{
int sin firmar yo;
para (i=a;i>0;i--);
}

Void lcd_com (LCD de caracteres sin firmar) //Transmitiendo comando LCD
{
temperatura de carbón sin firmar;

Temperatura=(lcd&~(1<PUERTO=temperatura; //Envía la tétrada más significativa del comando, señales RS, E al puertoD
PUERTO=temperatura&~(1<
temperatura=((LCD*16)&~(1<PUERTO=temperatura; //Emite la tétrada de orden inferior del comando, señala RS, E al puertoD
asm("no"); //Pequeño retraso de 1 ciclo MK, para estabilización
PUERTO=temperatura&~(1<
pausa(10*TIEMPO); //Pausa para la ejecución del comando
}

Void lcd_dat (LCD de caracteres sin firmar) //Escribir datos en la pantalla LCD
{
temperatura de carbón sin firmar;

Temperatura=(lcd|(1<PUERTO=temperatura; //Envía las señales de tétrada, RS y E de datos más importantes al puertoD
asm("no"); //Pequeño retraso de 1 ciclo MK, para estabilización
PUERTO=temperatura&~(1<
temperatura=((lcd*16)|(1<PUERTO=temperatura; //Envía las señales de tétrada, RS, E de datos de orden inferior al puertoD
asm("no"); //Pequeño retraso de 1 ciclo MK, para estabilización
PUERTO=temperatura&~(1<
tiempo de pausa); //Pausa para salida de datos
}

Void lcd_init (void) //Inicialización de LCD
{
lcd_com(0x2c); //interfaz de 4 hilos, tamaño de caracteres 5x8
pausa(100*TIEMPO);
lcd_com(0x0c); //Muestra la imagen, no muestra el cursor
pausa(100*TIEMPO);
lcd_com(0x01); //Borra DDRAM y establece el cursor en 0x00
pausa(100*TIEMPO);
}

Unsigned int getADC(void) //Leyendo el ADC
(int sin signo v;

ADCSRA|=(1<
while ((ADCSRA&_BV(ADIF))==0x00) //Espera hasta que se complete la conversión
;

V=(ADCL|ADCH<<8); br="">volver v;
}

void write_data (unsigned int u)
(carácter sin firmar i;
doble voltaje=0;

Lcd_com(0x84); //Salida del registro ADC en la pantalla LCD
para (i=0;yo<10;i++) br="">if ((u&_BV(9-i))==0x00) lcd_dat (0x30);
de lo contrario lcd_dat(0x31);

Lcd_com(0xc2);
voltaje= R_división*2,56*u*1,024; //cálculo de voltaje

I=tensión/10000; //Mostrar voltaje en LCD
voltaje=voltaje-i*10000;
si (i!=0) lcd_dat(0x30+i);

I=tensión/1000;
voltaje=voltaje-i*1000;
lcd_dat(0x30+i);

I=tensión/100;
voltaje=voltaje-i*100;
lcd_dat(0x30+i);

I=tensión/10;
voltaje=voltaje-i*10;
lcd_dat(0x30+i);

Lcd_dat("v");
}

Int principal (vacío)
{
DDRD=0xfc;

Pausa(3000); //Retraso para encender la pantalla LCD
lcd_init(); //Inicialización de LCD

Lcd_dat("A"); //Escribe "ADC=" y "U=" en la pantalla LCD
lcd_dat("D");
lcd_dat("C");
lcd_dat("=");
lcd_com(0xc0);
lcd_dat("U");
lcd_dat("=");

ADCSRA=(1<//Enciende el ADC, frecuencia de reloj del convertidor =/8 del reloj del microcontrolador
ADMUX=(1<//Voltaje de referencia interno Vref=2.56, la entrada ADC es PC0

Mientras(1)
{
u=obtenerADC(); //Leer los datos
escribir_datos(u); //Mostrarlos en la pantalla LCD
pausa(30000);
}

Devolver 1;
}

El programa es sencillo. Primero inicializamos los puertos de E/S. Para servir de entrada CAD, alfiler PC0 Debería funcionar para la entrada. A continuación realizamos la inicialización. LCD Y CAD. Inicialización CAD es encenderlo con un poco ADÉN en el registro ADCSRA. Y seleccionando la frecuencia de conversión de bits. ADPS2, ADPS1, ADPS0 en el mismo registro. Seleccionamos también la fuente de tensión de referencia, bits REFS1 REFS0 en el registro ADMUX y entrada CAD: bits MUX0, MUX1, MUX2, MUX3(en nuestro caso, la entrada CAD es PC0, Es por eso MUX0.3=0). A continuación, en un bucle eterno, comenzamos la transformación configurando el bit ADSC en el registro ADCSRA. Esperamos el final de la conversión (bit ADIF V ADCSRA se vuelve igual a 1). A continuación, eliminamos los datos del registro. CAD y llevarlos a LCD. Extraer datos de CAD Necesito en este orden: v=(ADCL+ADCH*256); si se usa v=(ADCH*256+ADCL);- No funciona a quemarropa. También existe un truco para evitar trabajar con números fraccionarios. Cuándo calcular el voltaje de entrada en voltios. Simplemente almacenaremos nuestro voltaje en milivoltios. Por ejemplo, el valor de la variable Voltaje 4234 significa que tenemos 4,234 voltios. En general, las operaciones con números fraccionarios consumen mucha memoria del microcontrolador (el firmware de nuestro voltímetro pesa un poco más de 4 kilobytes, esto es la mitad de la memoria del programa). ATmega8!), se recomienda utilizarlos sólo cuando sea absolutamente necesario. Calcular el voltaje de entrada en milivoltios es simple: voltaje=R_división*2,56*u*1,024;
Aquí R_división– coeficiente divisor resistivo R4-R5. Dado que el coeficiente divisor real puede diferir del calculado, nuestro voltímetro mentirá. Pero es fácil de corregir. Usando un probador medimos un cierto voltaje, obtenemos X voltio, y deje que nuestro voltímetro muestre Y voltio. Entonces R_división = 4*X/Y, Si Y es mayor que X Y 4*Y/X Si X es mayor que Y. Esto completa la configuración del voltímetro y puede usarlo.
Descargue el firmware como proyecto para AVR Studio 4.
Puedes ver cómo funciona un voltímetro en el vídeo:

También puedes modificar tu fuente de alimentación. Insertando en él un voltímetro-amperímetro digital en la pantalla LCD y protección contra sobrecargas (para medir la corriente necesitamos una derivación potente con una resistencia de aproximadamente 1 ohmio).

También incorporé protección contra sobrecargas en mi fuente de alimentación; cuando la corriente excede los 2A, el tweeter piezoeléctrico comienza a emitir un pitido fuerte, indicando una sobrecarga:

El microcontrolador se comunica con el mundo exterior a través de puertos de E/S. En general, sólo puede “percibir” señales digitales: cero lógico o uno lógico. Por ejemplo, para el microcontrolador ATmega8535 con una tensión de alimentación de 5 V, el cero lógico es un voltaje de 0 a 1,3 V y el lógico es de 1,8 a 5 V. Muy a menudo es necesario medir voltajes que pueden tomar cualquier valor. en el rango de 0 a la tensión de alimentación. Para estos fines, los microcontroladores AVR contienen un convertidor analógico-digital (ADC).

Sin entrar en detalles sobre la estructura interna del ADC, imaginemoslo como una caja negra. Se suministra una señal analógica continua a la entrada del ADC y en la salida se obtiene una secuencia de valores digitales. Un ADC tiene muchas características, pero las principales incluyen resolución, precisión absoluta, frecuencia máxima de muestreo y rango de voltaje de entrada.

Resolución(resolución) es la capacidad del ADC para distinguir entre dos valores de señal de entrada. Se define como el recíproco del número máximo de combinaciones de códigos en la salida del ADC. AVR tiene un ADC de 10 bits. El número máximo de combinaciones de códigos será igual a 2 · 10 = 1024. La resolución es igual a 1/1024 de toda la escala de voltajes de entrada permitidos.

Para que el ADC funcione, se requiere una fuente de voltaje de referencia (VS). Para él, este es el estándar con el que mide las señales de entrada. Los microcontroladores AVR le permiten utilizar el voltaje de suministro, una fuente de referencia interna de 2,56 V y el voltaje en el pin AREF (referencia externa) como referencia.

El voltaje de alimentación en nuestro circuito es de 5 V, entonces 1/1024 de toda la escala es 5 * 1/1024 = 0,0048 V o aproximadamente 5 mV. Con este paso (se llama paso de cuantificación), el ADC medirá el voltaje de entrada. Si los dos valores de señal más cercanos en la entrada del ADC difieren en la cantidad< 5 мВ, АЦП воспримет их как одинаковые. На практике разрешающая способность АЦП ограничена его шумами.

Precisión absoluta– desviación de la transformación real de la ideal. Este es un resultado compuesto de varios errores de ADC. Expresado en el número de bits menos significativos (LSB) del ADC. Para AVR, el error absoluto del ADC = ±2LSB. Para nuestro ejemplo, la precisión absoluta será 2 * 5 mV = ±10 mV.

Limitar la frecuencia de muestreo determina la velocidad del ADC y se mide en hercios o muestras por segundo (SPS – muestras por segundo). Para los microcontroladores AVR, este valor es de 15 kSPS (kilo de muestras por segundo). En la práctica, el AVR ADC funciona más rápido, pero al mismo tiempo su precisión se deteriora.

El teorema de Kotelnikov (teorema de Nyquist-Shannon, teorema de muestreo) establece que una señal analógica que tiene un espectro limitado se puede restaurar de forma única y sin pérdida a partir de sus muestras discretas si la frecuencia de muestreo (muestreo) excede la frecuencia máxima del espectro de la señal en más de 2 veces. En pocas palabras, si necesita digitalizar una señal analógica con una banda de espectro de 0 a 7 KHz, lo ideal es que la frecuencia de muestreo sea > dos veces la frecuencia máxima del espectro de esta señal, es decir, > 14 KHz. En la práctica todo es mucho más complicado. Siempre se coloca un filtro de paso bajo antes de la entrada del ADC para limitar el espectro de la señal y la frecuencia de muestreo se elige aún más alta.

Rango de voltaje de entrada– este es el valor de voltaje mínimo y máximo que se puede suministrar a la entrada del ADC. Para el microcontrolador AVR es 0 – Vcc (voltaje de alimentación)


Si comparamos un ADC con una regla, entonces el valor de escala mínimo y máximo es el rango de voltaje de entrada, el número de divisiones de la regla es el número de combinaciones de códigos (el número de niveles de cuantificación), la distancia entre dos divisiones adyacentes es el paso de cuantificación, y el paso de cuantificación dividido por el rango de voltaje de entrada es la resolución.

Explicaciones para el diagrama.

Para familiarizarme con el módulo ADC del microcontrolador AVR, elegí un circuito simple pero interesante. Echa un vistazo a la imagen. Cuatro botones están conectados a un divisor de voltaje (resistencias R8…R11). Cuando se presionan, cambian diferentes voltajes a la entrada del canal cero del ADC. Al medir estos voltajes en la interrupción del ADC y determinar en qué rango se encuentran, el microcontrolador reconocerá el número del botón presionado.

Se necesita la resistencia R7 para que la entrada ADC no "cuelgue en el aire" cuando se sueltan todos los botones. Si no se hace esto, el ADC detectará interferencias. El valor de la resistencia R7 se elige para que sea grande para no afectar el divisor de voltaje.

R6 y C7: filtro de baja frecuencia para proteger contra el rebote y las interferencias de los botones. (En general, los filtros de paso bajo delante del ADC se suelen utilizar para proteger contra fenómenos como el aliasing, pero esa es una historia diferente). Además, la resistencia R6 desempeña una función limitadora de corriente; sin ella, al presionar el botón S4, la salida del microcontrolador se conectaría directamente al positivo de la fuente de alimentación. Y esto es indeseable.

Para indicar el número del botón presionado, el circuito utiliza 4 LED.
Microcontrolador - ATMega8535. La descripción de los registros ADC a continuación en el texto se proporciona específicamente para ello. Puede haber algunas diferencias con otros microcontroladores.

Tarea

Para el diagrama anterior, escriba un programa que determine el número del botón presionado.

El algoritmo del programa es el siguiente:

Programa principal
Inicializando puertos
Inicializando el ADC
Habilitar interrupciones
ciclo sin fin
{
Si se presiona el botón, enciende el LED deseado.
Si no, apague todos los LED.
}

Manejador de interrupciones ADC
Lea el voltaje en la entrada del ADC
Determinar en qué rango cae
Escribe el número del botón en el buffer.

Código de programa inicial

//programación de microcontroladores AVR en C - dominio del ADC

#incluir
#incluir

//macro para iniciar la transformación
#define StartConvAdc() ADCSRA |= (1<

En t principal( vacío )
{

ADMUX = (0<

//en ADC, modo de convertidor único, resolución de interrupción, frecuencia del convertidor. = FCPU/128

ADCSRA = (1<


__enable_interrupt
();
IniciarConvAdc();
mientras(1)
{

//algún código

}
devolver 0;
}

// manejador de interrupciones ADC
#pragma vector=ADC_vect
__interrumpir vacío adc_mi( vacío)
{
carácter sin firmar AdcBuf = ADCH;

//algún código

IniciarConvAdc();
}

Explicaciones para el código.

Macro para iniciar la conversión

StartConvAdc() es una macro para iniciar una conversión ADC. Establece el bit ADSC en el registro de estado y control ADCSRA.

Inicializando el ADC

Para ejecutar el módulo ADC, primero debe configurarse. Tres registros son responsables de esto:
Registro de control del multiplexor - ADMUX
Registro de control y estado - ADCSRA
Registro de funciones especiales - SFIOR

Registro ADMUX

El módulo ADC necesita una fuente de voltaje de referencia (VR) para funcionar. Los bits REFS1, REFS0 son responsables de seleccionar el ION. En nuestro caso, el voltaje de referencia es el voltaje de suministro (es por eso que configuramos el pin AVcc en +5V), por lo que REFS1 - 0, REFS0 - 1

El ADC del microcontrolador AVR es de 10 bits y la piedra en sí es de 8 bits. Por tanto, el resultado de la conversión se almacena en dos registros (ADCH, ADCL). El bit ADLAR especifica la dirección de alineación del resultado de la conversión. 0 – alineación a la derecha (los 2 bits menos significativos en ADCH están ocupados, ADCL está completamente ocupado), 1 – alineación a la izquierda (ADCH está completamente ocupado, solo los 2 bits más significativos en ADCL están ocupados). Nuestro ejemplo no requiere una conversión de alta precisión, por lo que sería conveniente justificar el resultado a la izquierda y trabajar solo con el registro ADCH. Instalar ADLAR - 1

Físicamente, solo hay un ADC en el microcontrolador AVR. Pero frente a él hay un multiplexor que le permite conectar cualquiera de los 8 pines del puerto a la entrada ADC. El número del canal seleccionado actualmente se especifica mediante los bits ADMUX3, ADMUX2, ADMUX1, ADMUX0. Estamos usando el canal nulo, por lo que todos los bits son 0.

//ion - tensión de alimentación, alineación izquierda, canal cero
ADMUX = (0<

Registro ADCSRA

Para que el ADC funcione, debe estar encendido, es decir, el bit ADEN debe estar establecido en 1

La conversión se inicia configurando el bit ADSC -1. Durante la inicialización no ejecutaremos el ADC, por lo que ADSC es 0

El ADC puede funcionar en dos modos: conversión única (cuando cada conversión se inicia mediante software) y continua (cuando la conversión se inicia una vez mediante software y se reinicia automáticamente). En nuestro ejemplo, la conversión es única, el bit ADATE es 0.

Cuando el ADC ha terminado de convertir, emite una solicitud de interrupción. Para habilitar la interrupción, el bit ADIE debe estar establecido en 1.

El módulo ADC requiere una señal de reloj para funcionar. Se genera a partir de la señal del reloj del microcontrolador dividiéndola por coeficientes fijos. Los bits ADSP2, ADSP1, ADSP0 se utilizan para establecer los coeficientes del preescalador. Como interrogaremos a los botones usando un ADC y este es un dispositivo muy lento, seleccionamos el coeficiente más grande (es decir, la frecuencia más baja). Todos los bits son 1.

//en ADC, modo de convertidor único, habilitación de interrupción, convertidor F = FCPU/128
ADCSRA = (1<

Hablé de todos los bits excepto ADIF. ADIF es un indicador de interrupción. Se instala mediante hardware cuando se completa la conversión.

Registro SFIOR

Los bits ADTS2, ADTS1, ADTS0 determinan la fuente que inicia el procedimiento de conversión. Estos bits sólo deben configurarse en el modo de conversión continua. Tenemos un modo único, por lo que no tocamos la caja registradora.

Manejador de interrupciones ADC

#pragma vector=ADC_vect
__interrumpir vacío adc_mi( vacío)
{
carácter sin firmar AdcBuf = ADCH;

//algún código

ADC: Convertidor analógico a digital. Por el nombre se puede adivinar que se suministra una señal analógica a la entrada, que se convierte en un número.

Lo primero que hay que decir es que el ADC del microcontrolador sólo puede medir voltaje. Para medir otras cantidades físicas, primero se deben convertir a voltaje. La señal siempre se mide relativa a un punto llamado voltaje de referencia, este mismo punto es el máximo que se puede medir. Se recomienda elegir una fuente de voltaje altamente estable como fuente de voltaje de referencia (VS); de lo contrario, todas las mediciones bailarán junto con la referencia.

Una de las características más importantes es la resolución, que afecta la precisión de la medición. Todo el rango de medición se divide en partes. Mínimo cero, máximo voltaje ION. Para un ADC de 8 bits, esto es 2 ^ 8 = 256 valores, para un ADC de 10 bits es 2 ^ 10 = 1024 valores. Por tanto, cuanto mayor sea la profundidad de bits, con mayor precisión se podrá medir la señal.

Digamos que mides una señal de 0 a 10V. El microcontrolador que utilizamos es Atmega8, con un ADC de 10 bits. Esto significa que el rango de 10V se dividirá en 1024 valores. 10V/1024=0.0097V - con este paso podemos medir el voltaje. Pero hay que tener en cuenta que el microcontrolador considerará los valores 0.0097, 0.0098, 0.0099… iguales.

Sin embargo, un paso de 0,01 es bastante bueno. Sin embargo, existen varias recomendaciones sin las cuales no se alcanzará esta precisión, por ejemplo, para mediciones con una precisión de 10 bits, la frecuencia a la que opera el ADC debe ser de 50-200 kHz. La primera transformación requiere 25 ciclos y 13 ciclos posteriores. Por tanto, a una frecuencia de 200 kHz podemos exprimir el máximo
200.000/13 = 15.384 mediciones.

Se puede utilizar una fuente interna o una externa como fuente de tensión de referencia. No se recomienda utilizar el voltaje de la fuente interna (2,3-2,7 V) debido a su baja estabilidad. Se conecta una fuente externa al pin AVCC o Aref, según la configuración del programa.

Cuando se utiliza un ADC, el pin AVCC debe estar conectado. El voltaje AVCC no debe diferir del voltaje de suministro del microcontrolador en más de 0,3 V. Como se dijo, el voltaje máximo medido es igual al voltaje de referencia (Vref), está en el rango de 2V-AVCC. Entonces el microcontrolador no puede medir más de 5V.

Para ampliar el rango de medición, es necesario medir la señal a través de un divisor de voltaje. Por ejemplo, el voltaje máximo medido es 10 V, el voltaje de referencia es 5 V. Para ampliar el rango de medición, debe reducir la señal medida 2 veces.

La fórmula para calcular el divisor es la siguiente:

U fuera = U en R 2 /(R 1 + R 2)

Sustituyamos nuestros valores en la fórmula:

5 = 10*R2/(R1+R2)

aquellos. Puedes tomar dos resistencias idénticas y conectarlas según el diagrama.

Por lo tanto, cuando medimos el voltaje a través de un divisor, necesitamos multiplicar el valor ADC resultante por el coeficiente = Uout/Uin.

La fórmula completa para calcular el voltaje medido se verá así:
U=(voltaje de referencia*valor ADC*coeficiente divisor)/número de bits ADC

Ejemplo: referencia 5 V, valor ADC medido = 512, factor divisor = 2, ADC de 10 bits.

(5*512*2)/1024=5V - valor de voltaje medido real.

Algunos programadores escriben un programa para que el microcontrolador calcule automáticamente el coeficiente divisor, para ello se mide la señal de salida con un dispositivo estándar y este valor se ingresa en el programa. El propio microcontrolador correlaciona el voltaje real con cada valor del ADC; el proceso en sí es único y se llama calibración.

Pasemos a la implementación del software. Cree un proyecto con los parámetros especificados. También conectaremos un display al puerto D para mostrar información.

La medición se realizará en modo automático, el código se procesa en una interrupción, el voltaje de referencia se conecta al pin AVCC. Básicamente, sólo necesitamos procesar los datos recibidos. Los datos medidos se almacenan en la variable adc_data. Si necesita escanear varios canales, seleccione qué canales escanear y los datos serán para el pin 0 en adc_data, para el pin 1 en adc_data, etc.

En el bucle principal, agregue las líneas:

resultado=((5.00*adc_data)/1024.00); //convierte el valor ADC en voltios
sprintf(lcd_buffer,"U=%.2fV",resultado); //ponemos el resultado en una variable temporal
lcd_puts(lcd_buffer); //mostrar

Una pequeña nota: para usar números de coma flotante, necesita cambiar (s)printf Funciones: int, ancho para flotar, ancho, precisión en la configuración del proyecto. Si no se hace esto, no veremos décimas ni centésimas.

Por lo tanto, simplemente convertimos el valor ADC en voltios y lo mostramos en la pantalla. El resultado en Proteus se ve así:

La resistencia se puede utilizar para cambiar el voltaje; el voltaje medido se muestra en la pantalla. Al realizar el montaje en hardware real, es necesario conectar un condensador de 0,1 µF a la pata Aref. La lección resultó un poco difícil, pero creo que te gustará.

Archivo Proteus y firmware:

Actualizar:
Medición actual:

Características distintivas:

  • resolución de 10 bits
  • No linealidad integral 0,5 ml. resolución
  • Error absoluto ±2 ml. resolución
  • Tiempo de conversión 65 - 260 µs.
  • Frecuencia de conversión de hasta 15 mil conversiones. por segundo a máxima resolución
  • 8 entradas unipolares multiplexadas
  • 7 canales de entrada diferencial
  • 2 canales de entrada diferencial con ganancia opcional de 10 y 200
  • Representación del resultado con alineación izquierda o derecha en 16 bits. palabra
  • Rango de voltaje de entrada del ADC 0…VCC
  • Referencia interna selectiva a 2,56 V
  • Modos de conversión única y reinicio automático
  • Interrumpir al finalizar la conversión de ADC
  • Mecanismo de reducción de ruido en modo de suspensión.

ATmega128 contiene 10 bits. Aproximación sucesiva ADC. El ADC está conectado a un multiplexor analógico de 8 canales, cuyas 8 entradas unipolares están conectadas a las líneas del puerto F. La señal de entrada común debe estar en un potencial de 0 V (es decir, conectada a GND). El ADC también admite 16 entradas de voltaje diferencial. Dos entradas diferenciales (ADC1, ADC0 y ADC3, ADC2) contienen una etapa con ganancia programable por pasos: 0 dB (1x), 20 dB (10x) o 46 dB (200x). Los siete canales analógicos diferenciales comparten una entrada inversora común (ADC1) y todas las demás entradas ADC sirven como entradas no inversoras. Si se selecciona una ganancia de 1x o 10x, puede esperar 8 bits. resolución, y si es 200x, entonces 7 bits.

El ADC contiene un dispositivo de muestreo y retención que mantiene un voltaje constante en la entrada del ADC durante la conversión. El diagrama funcional del ADC se muestra en la Figura 108.

El ADC tiene un pin de alimentación AVCC (alimentación analógica) separado. AVCC no debe diferir en más de ±0,3 V de VCC. Consulte el párrafo “ ” para obtener recomendaciones sobre cómo conectar este pin.

El voltaje de referencia interno puede ser el voltaje del ION interno de 2,56 V o el voltaje AVCC. Si se requiere una referencia externa, se debe conectar al pin AREF con un condensador de bloqueo conectado a este pin para mejorar el rendimiento del ruido.

Figura 108 - Diagrama funcional de un convertidor analógico a digital

Principio de operación

El ADC convierte el voltaje analógico de entrada a 10 bits. código utilizando el método de aproximaciones sucesivas. El valor mínimo corresponde al nivel GND y el nivel máximo AREF menos 1 ml. resolución El pin AREF se puede conectar opcionalmente al voltaje AVCC o a un ION interno de 1,22 V escribiendo los valores correspondientes en los bits REFSn en el registro ADMUX. A pesar de que el ION de 2,56 V está ubicado dentro del microcontrolador, se puede conectar un condensador de bloqueo a su salida para reducir la sensibilidad al ruido, porque está asociado con el pin AREF.

El canal de entrada analógica y la etapa de ganancia diferencial se seleccionan escribiendo el bit MUX en el registro ADMUX. Como entrada analógica unipolar del ADC se puede seleccionar una de las entradas ADC0...ADC7, así como GND y la salida de una fuente de tensión de referencia fija de 1,22 V. En el modo de entrada diferencial, es posible seleccionar Entradas inversoras y no inversoras al amplificador diferencial.

Si se selecciona el modo de entrada analógica diferencial, el amplificador diferencial amplificará la diferencia de voltaje entre el par de entradas seleccionado según la ganancia especificada. El valor amplificado de esta manera se envía a la entrada analógica del ADC. Si se selecciona el modo de entrada analógica unipolar, se omite la etapa de ganancia.

La operación ADC se habilita configurando el bit ADEN en ADCSRA. La selección de fuente de referencia y canal de conversión no se puede realizar hasta que se configure ADEN. Si ADEN = 0, entonces el ADC no consume corriente, por lo tanto, al cambiar a modos de suspensión económicos, se recomienda desactivar primero el ADC.

El ADC genera un resultado de 10 bits que se coloca en un par de registros de datos del ADC, ADCH y ADCL. De forma predeterminada, el resultado de la conversión se coloca en los 10 bits inferiores de los 16 bits. palabras (justificadas a la derecha), pero opcionalmente se pueden colocar en los 10 bits superiores (justificadas a la izquierda) configurando el bit ADLAR en el registro ADMUX.

La utilidad práctica de presentar el resultado con alineación a la izquierda existe cuando la resolución de 8 bits es suficiente, porque en este caso, sólo es necesario leer el registro ADCH. En caso contrario, es necesario leer primero el contenido del registro ADCL y luego el registro ADCH, lo que asegura que ambos bytes son resultado de la misma conversión. Tan pronto como se lee el ADCL, se bloquea el acceso a los registros de datos desde el ADC. Esto significa que si se lee ADCL y la conversión se completa antes de leer el registro ADCH, ninguno de los registros se puede modificar y el resultado de la conversión se pierde. Después de leer ADCH, se permite nuevamente el acceso a los registros ADCH y ADCL por parte del ADC.

El ADC genera su propia solicitud de interrupción cuando se completa la conversión. Si el acceso a los datos al ADC se desactiva entre la lectura de los registros ADCH y ADCL, se producirá una interrupción incluso si se pierde el resultado de la conversión.

Comenzando la conversión

Una única conversión se inicia escribiendo el registro. Bit de inicio de conversión de 1 a ADSC ADC. Este bit permanece alto durante el proceso de conversión y se borra cuando se completa la conversión. Si el canal de entrada analógica se cambia durante la conversión, el ADC completará automáticamente la conversión actual antes de cambiar el canal.

En el modo de reinicio automático, el ADC digitaliza continuamente la señal analógica y actualiza el registro de datos del ADC. Este modo se establece escribiendo el registro. 1 en el bit ADFR del registro ADCSRA. La primera conversión se inicia escribiendo el registro. 1 en el bit ADSC del registro ADCSRA. En este modo, el ADC realiza conversiones en serie, independientemente de si el indicador de interrupción ADIF del ADC está borrado o no.

Diagrama de tiempos de conversión y preescalador


Figura 109 – Preescalador ADC

Si se requiere una resolución máxima (10 bits), entonces la frecuencia en la entrada del circuito de aproximación sucesiva debe estar en el rango de 50...200 kHz. Si una resolución de menos de 10 bits es suficiente, pero se requiere una frecuencia de conversión más alta, entonces la frecuencia de entrada del ADC se puede configurar por encima de 200 kHz.

El módulo ADC contiene un preescalador que genera frecuencias derivadas por encima de 100 kHz con respecto a la frecuencia de reloj de la CPU. La relación de división se establece utilizando el bit ADPS en el registro ADCSRA. El preescalador comienza a contar desde el momento en que se enciende el ADC configurando el bit ADEN en el registro ADCSRA. El preescalador funciona mientras el bit ADEN está en 1 y se reinicia cuando ADEN = 0.

Si la conversión unipolar se inicia configurando el bit ADSC en el registro ADCSRA, la conversión comienza en el siguiente flanco ascendente del reloj ADC. Las características del diagrama de tiempos de conversión diferencial se presentan en “ ”.

La conversión normal requiere 13 ciclos de reloj ADC. La primera conversión después de encender el ADC (configurar ADEN en ADCSRA) requiere 25 ciclos de reloj del ADC debido a la necesidad de inicializar el circuito analógico.

Después del inicio de la conversión normal, se gastan 1,5 ciclos de reloj ADC en la muestra a la tienda, y después del inicio de la primera conversión, se gastan 13,5 ciclos de reloj. Una vez que se completa la conversión, el resultado se coloca en los registros de datos del ADC y se establece el indicador ADIF. En el modo de conversión única, el bit ADSC se borra al mismo tiempo. Mediante software, el bit ADSC se puede configurar nuevamente y se iniciará una nueva conversión con el primer flanco ascendente de la señal de reloj ADC.

En el modo de reinicio automático, comienza una nueva conversión tan pronto como se completa la anterior, mientras ADSC permanece en un estado alto. Los tiempos de conversión para varios modos de conversión se presentan en la Tabla 95.


Figura 110: Diagrama de tiempos del funcionamiento del ADC durante la primera conversión en modo de conversión única


Figura 111 – Diagrama de tiempos del funcionamiento del ADC en modo de conversión única


Figura 112 – Diagrama de tiempos del funcionamiento del ADC en modo de reinicio automático

Tabla 95 – Tiempo de conversión del ADC

Canales de ganancia diferencial

Si se utilizan canales de ganancia diferencial, hay algunas consideraciones que deben tenerse en cuenta.

Las conversiones diferenciales están sincronizadas con respecto al reloj interno del SDADC2, cuya frecuencia es igual a la mitad de la frecuencia del reloj del ADC. Esta sincronización la realiza automáticamente la interfaz ADC de modo que el muestreo y retención se activa mediante un borde específico del ADC2. Si el usuario inició la conversión (todas las conversiones individuales y la primera conversión en modo de reinicio automático) mientras SDA/DC2 estaba en registro bajo. estado, entonces su duración será equivalente a la conversión unipolar (13 ciclos de reloj ADC). Si la conversión la inicia el usuario, cuando SDADC2 es igual a log. 1, durará 14 ciclos de reloj ADC debido al funcionamiento del mecanismo de sincronización. En el modo de reinicio automático, se inicia una nueva transformación inmediatamente después de completar la anterior, y desde en este momento SKADC2 es igual a log. 1, todas las conversiones que se reiniciaron automáticamente (es decir, todas menos la primera) durarán 14 ciclos de reloj ADC. La etapa del amplificador está optimizada para un rango de frecuencia de hasta 4 kHz para cualquier ganancia. La amplificación de señales de mayor frecuencia será no lineal. Por lo tanto, si la señal de entrada contiene componentes de frecuencia por encima del rango de frecuencia de la etapa amplificadora, entonces es necesario instalar un filtro de paso bajo externo. Tenga en cuenta que la frecuencia del reloj del ADC no está relacionada con la limitación del rango de frecuencia de la etapa del amplificador. Por ejemplo, el período de sincronización del ADC puede ser de 6 μs, en el cual la frecuencia de conversión del canal es igual a 12 mil conversiones. por segundo, independientemente del rango de frecuencia de este canal.

Cambiar de canal o seleccionar fuente de referencia

Los bits MUXn y REFS1:0 en el registro ADMUX admiten el almacenamiento en búfer de una sola etapa a través de un registro temporal. Esto garantiza que la nueva configuración del canal de conversión y de la fuente de referencia entre en vigor en un momento seguro para la conversión. Antes de que comience la conversión, cualquier cambio en el canal y la fuente de referencia entrará en vigor inmediatamente después de su modificación. Tan pronto como comienza el proceso de conversión, se bloquea el acceso para cambiar el canal y la fuente de referencia, garantizando así que el ADC tenga suficiente tiempo de conversión. La continuidad de la modificación regresa en el último ciclo de reloj del ADC antes de que se complete la conversión (antes de que se establezca el indicador ADIF en el registro ADCSRA). Tenga en cuenta que la conversión comienza con el siguiente flanco ascendente del reloj ADC después de la escritura ADSC. Por lo tanto, se recomienda que el usuario no escriba un nuevo canal o valor de referencia en ADMUX hasta el primer ciclo de reloj ADC después de escribir ADSC.

Se debe tener especial cuidado al cambiar el canal diferencial. Una vez seleccionado un canal diferencial, la etapa del amplificador requiere 125 µs para estabilizar el nuevo valor. Por lo tanto, durante los primeros 125 µs después de cambiar el canal diferencial, la conversión no debería comenzar. Sin embargo, si se llevaron a cabo transformaciones durante este período, entonces se deben ignorar sus resultados.

Se debe introducir el mismo retraso de establecimiento durante la primera conversión diferencial después de cambiar la fuente de referencia del ADC (cambiando el bit REFS1:0 en ADMUX).

Si la interfaz JTAG está habilitada, las funciones de los canales ADC en el puerto F 7...4 pines se cancelan. Ver tabla. 42 y “Funciones alternativas del puerto F”.

Canales de entrada ADC

A la hora de cambiar un canal de entrada, es necesario tener en cuenta algunas recomendaciones que evitarán una conmutación incorrecta.

En el modo de conversión única, se debe realizar el cambio de canal antes de iniciar la conversión. El cambio de canal solo puede ocurrir durante un ciclo de reloj ADC después de registrar el registro. 1 en ADSC. Sin embargo, el método más sencillo es esperar a que se complete la conversión antes de seleccionar un nuevo canal.

En el modo de reinicio automático, se debe seleccionar un canal antes de iniciar la primera conversión. El cambio de canal se produce de la misma manera: durante un ciclo de sincronización del ADC después de grabar el registro. 1 en ADSC. Pero el método más sencillo es esperar a que se complete la conversión del lápiz y luego cambiar de canal. Dado que la siguiente transformación ya comenzó automáticamente, el siguiente resultado corresponderá al canal anterior. Las conversiones posteriores reflejan el resultado del nuevo canal.

Al cambiar a un canal diferencial, la primera conversión tendrá poca precisión debido al proceso transitorio en el circuito de control de polarización automático. Por lo tanto, se recomienda ignorar el primer resultado de dicha conversión.

Fuente de voltaje de referencia ADC

La fuente de voltaje de referencia (RPS) para el ADC (VRES) determina el rango de conversión del ADC. Si el nivel de la señal unipolar está por encima de VION, el resultado de la conversión será 0x3FF. El VION puede ser AVCC, ION interno de 2,56 V o ION externo conectado al pin. AREF. El AVCC está conectado al ADC mediante un interruptor pasivo. El voltaje de referencia interno de 2,56 V es generado por la fuente de referencia interna VBG, amortiguada por el amplificador interno. En cualquier caso, el pin AREF externo está conectado directamente al ADC y, por lo tanto, el efecto del ruido en la fuente de referencia se puede reducir conectando un condensador entre el pin AREF y tierra. El voltaje VION también se puede medir en el pin AREF con un voltímetro de alta impedancia. Tenga en cuenta que VION es una fuente de alta impedancia y, por lo tanto, solo se puede conectar externamente una carga capacitiva.

Si el usuario está utilizando una fuente de referencia externa conectada al pin. AREF, entonces no se permite usar otra opción de fuente de referencia porque esto desviará el voltaje de referencia externo. Si para fijar. No se aplica el voltaje AREF, entonces el usuario puede seleccionar AVCC y 2.56 como fuente de referencia. El resultado de la primera conversión después de cambiar la fuente de referencia puede tener poca precisión y se recomienda al usuario que lo ignore.

Si se utilizan canales diferenciales, la fuente de referencia seleccionada debe ser inferior al nivel AVCC, como se muestra en la tabla. 136.

Supresor de ruido ADC

El ADC se caracteriza por la capacidad de suprimir el ruido causado por el funcionamiento del núcleo de la CPU y los dispositivos periféricos de E/S. El supresor de ruido se puede utilizar en modo de reducción de ruido ADC y en modo inactivo. Cuando utilice esta función, siga el siguiente procedimiento:

  1. Asegúrese de que el ADC esté habilitado y no esté convirtiendo. Seleccione el modo de conversión única y habilite la interrupción cuando se complete la conversión.
  2. Ingrese al modo de reducción de ruido ADC (o modo inactivo). El ADC iniciará la conversión tan pronto como se detenga la CPU.
  3. Si no se producen otras interrupciones antes de que se complete la conversión, el ADC provocará una interrupción de la CPU y el programa saltará al vector de interrupción cuando se complete la conversión del ADC. Si otra interrupción despierta el microcontrolador antes de que se complete la conversión, entonces esa interrupción se procesa y se genera una solicitud de interrupción correspondiente cuando se completa la conversión. El ADC permanece en modo activo hasta que se ejecuta el siguiente comando de suspensión.

Tenga en cuenta que el ADC no se apaga automáticamente cuando se pone en todos los modos de suspensión excepto en inactivo y reducción de ruido del ADC. Por lo tanto, el usuario debe proporcionar una entrada de registro. 0 en el bit ADEN antes de ingresar a dichos modos de suspensión para evitar un consumo excesivo de energía. Si el ADC se ha habilitado en estos modos de suspensión y el usuario desea realizar una conversión diferencial, el ADC debe encenderse y luego apagarse al despertar para iniciar la conversión extendida y garantizar que se obtenga un resultado válido.

El circuito de entrada analógica para canales unipolares se muestra en la Figura 113. Independientemente de qué canal esté conectado al ADC, la señal analógica está conectada al pin. ADCn, cargado con capacitancia de salida y resistencia de fuga de entrada. Una vez que el canal está conectado al ADC, la señal analógica se acoplará al condensador de muestreo y retención a través de una resistencia en serie cuya resistencia es equivalente a todo el circuito de entrada.

El ADC está optimizado para señales analógicas con una impedancia de salida de no más de 10 kOhm. Si se utiliza una fuente de señal de este tipo, el tiempo de muestreo es insignificante. Si se utiliza una fuente con una impedancia de entrada más alta, el tiempo de muestreo estará determinado por el tiempo que le toma a la fuente analógica cargar el capacitor de muestreo y retención. Se recomienda utilizar sólo fuentes con baja impedancia de salida y señales que cambian lentamente, porque en este caso, la carga del condensador de retención de muestra será bastante rápida.

En relación a canales con amplificación diferencial, se recomienda utilizar señales con resistencia interna de hasta varios cientos de kOhms. Se debe garantizar que en las etapas preliminares de la formación de la señal analógica, las frecuencias superiores a fADC/2 no se introduzcan en la entrada del ADC; de lo contrario, el resultado de la conversión puede ser incorrecto. Si existe la posibilidad de penetración de alta frecuencia, se recomienda instalar un filtro de paso bajo delante del ADC.


Figura 113 – Circuito de entrada analógica

El funcionamiento de componentes digitales dentro y fuera del microcontrolador está asociado con la generación de radiación electromagnética, que puede afectar negativamente la precisión de las mediciones de señales analógicas. Si la precisión de la conversión es un parámetro crítico, los niveles de ruido se pueden reducir siguiendo estas pautas:

  1. Mantenga la ruta de la señal analógica lo más corta posible. Mantenga las señales analógicas por encima del plano de tierra analógico (blindaje) y alejadas de conductores que transporten señales digitales de alta frecuencia.
  2. El pin AVCC debe conectarse a la fuente de alimentación digital VCC a través de un circuito LC como se muestra en la Fig. 114.
  3. Utilice la función para suprimir el ruido ADC introducido por el núcleo de la CPU.
  4. Si alguno de los pines del ADC se utiliza como salida digital, es extremadamente importante evitar que esa salida cambie durante el proceso de conversión.


Figura 114 – Conexión de la fuente de alimentación ADC

Métodos de compensación de compensación

La etapa amplificadora tiene un circuito de compensación de compensación incorporado que se esfuerza por mantener la compensación de la medición diferencial lo más cerca posible de cero. El desplazamiento restante se puede medir si se selecciona el mismo pin del microcontrolador como entradas diferenciales del ADC. La compensación residual medida de esta manera se puede restar mediante programación del resultado de la conversión. El uso de un algoritmo de corrección de sesgo de software puede reducir el sesgo por debajo de un ml. resolución

Definiciones de errores de conversión A/D

Un ADC unipolar de n bits convierte el voltaje linealmente entre GND y VION en pasos de 2n (millones de dígitos). Código mínimo = 0, máximo = 2n-1. Los principales errores de transformación son la desviación de la función de transformación real de la ideal. Éstas incluyen:

Inclinación– desviación de la primera transición (de 0x000 a 0x001) en comparación con la transición ideal (es decir, con una resolución de 0,5 ml). Valor ideal: 0 ml. resolución


Figura 115 – Error de compensación

Después de la corrección de compensación, el error de ganancia es la desviación de la última transición (de 0x3FE a 0x3FF) de la transición ideal (es decir, la desviación en el valor máximo menos 1,5 ml. res.). Valor ideal: 0 ml. resolución


Figura 116 – Error de ganancia

No linealidad integral (INL). Después de ajustar el error de compensación y ganancia, el INL representa la desviación máxima de la función de transformación real de la ideal para cualquier código. Valor INL ideal = 0 ml. resolución


Figura 117 - No linealidad integral (INL)

No linealidad diferencial (DNL). La desviación máxima entre el ancho del código real (el intervalo entre dos transiciones adyacentes) y el ancho del código ideal (1 ml. bit). Valor ideal: 0 ml. resolución


Figura 118 - No linealidad diferencial (DNL)

Error de cuantificación. Ocurre debido a la conversión del voltaje de entrada en un número finito de códigos. Error de cuantificación: intervalo de voltaje de entrada de 1 ml. resolución (paso de cuantificación de voltaje), que se caracteriza por el mismo código. Siempre igual a ±0,5 ml. resolución

Error absoluto. La desviación máxima de la función de conversión real (sin ajuste) de la real para cualquier código. Es el resultado de varios efectos: compensación, error de ganancia, error diferencial, no linealidad y error de cuantificación. Valor ideal: ±0,5 ml. resolución

Resultado de la conversión ADC

Una vez que se completa la conversión (ADIF = 1), el resultado se puede leer desde un par de registros de resultados de conversión ADC (ADCL, ADCH).

Para conversión unipolar:

donde Vin es el nivel de voltaje en la entrada conectada al ADC;

Vion es el voltaje de la fuente de voltaje de referencia seleccionada (consulte la Tabla 97 y la Tabla 98). El código 0x000 corresponde al nivel de tierra analógico y 0x3FF al nivel de voltaje de referencia menos 1 paso de cuantificación de voltaje. Cuando se utiliza un canal diferencial

V pos - voltaje en la entrada no inversora (invertida); V neg - ganancia; V ref es el voltaje del ION seleccionado.

El resultado se representa en código de complemento a dos, comenzando desde 0x200 (-512d) hasta 0x1FF (+511d). Tenga en cuenta que si necesita determinar rápidamente la polaridad del resultado, basta con sondear el bit más significativo del resultado de la conversión (ADC9 a ADCH). Si este bit es igual a log. 1, entonces el resultado es negativo, pero si log. 0 es positivo. La Figura 119 muestra la función de conversión ADC en modo diferencial.

La Tabla 96 presenta los códigos de salida resultantes para un par de canales diferenciales (ADCn - ADCm) con ganancia Ku y tensión de referencia VION.


Figura 119 – Función de conversión ADC al medir una señal diferencial

Tabla 96 - Relación entre voltaje de entrada y códigos de salida

V ADCN Código legible Valor decimal correspondiente
V ADCM + V ION /Ky 0x1FF 511
V ADCM + 0,999 V ION / Ky 0x1FF 511
V ADCN + 0,998 V ION / Ky 0x1FE 510
... ...
V ADcm + 0,001 V ION / Ky 0x001 1
V ADcm 0x000 0
V ADcm - 0,001 V ION / Ky 0x3FF -1
... ...
V ADcm - 0,999 V ION / Ky 0x201 -511
V ADCM – V ION / Ky 0x200 -512

Ejemplo: Sea ADMUX = 0xED (par de entrada ADC3 - ADC2, Ku=1, Vion=2.56V, resultado justificado a la izquierda), voltaje en la entrada ADC3 = 300 mV y en la entrada ADC2 = 500 mV, entonces:

Código ADC = 512 * 10 * (300 - 500) / 2560 = -400 = 0x270

Teniendo en cuenta el formato de colocación de resultados seleccionado (zurdos), ADCL = 0x00 y ADCH = 0x9C. Si se selecciona el formato de la derecha (ADLAR=0), entonces ADCL = 0x70, ADCH = 0x02.

Registro de control del multiplexor ADC – ADMUX

Descargar 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 ADMUX
Leer escribir R/E R/E R/E R/E R/E R/E R/E R/E
Árbitro. significado 0 0 0 0 0 0 0 0

Bit 7:6 – REFS1:0: Bits de selección de referencia

Estos bits determinan qué voltaje se utilizará como referencia para el ADC (consulte la Tabla 97). Si cambia los valores de estos bits durante el proceso de conversión, la nueva configuración entrará en vigor solo después de que se complete la conversión actual (es decir, cuando se establezca el bit ADIF en el registro ADCSRA). La referencia interna se puede omitir si se conecta una fuente de referencia externa al pin AREF.

Tabla 97 – Selección de fuente de referencia del ADC

Bit 5 – ADLAR: Bit de control de presentación del resultado de la conversión

El bit ADLAR afecta la representación del resultado de la conversión en un par de registros de resultados de la conversión ADC. Si ADLAR = 1, entonces el resultado de la conversión será para zurdos; de lo contrario, será para diestros. El bit ADLAR entra en vigor inmediatamente después del cambio, independientemente de cualquier conversión que se ejecute en paralelo. Se proporciona una descripción completa del funcionamiento de este bit en “Registros de datos ADC – ADCL y ADCH”.

Bit 4:0 – MUX4:0: Canal analógico y bits de selección de ganancia

Estos bits determinan cuáles de las entradas analógicas disponibles están conectadas al ADC. Además, se pueden utilizar para seleccionar la ganancia para canales diferenciales (ver Tabla 98). Si los valores de los bits se cambian durante el proceso de conversión, su mecanismo de acción entrará en vigor solo después de que se complete la conversión actual (después de que se establezca el bit ADIF en el registro ADCSRA).

Tabla 98 - Selección de canal de entrada y ganancia

MUX4..0 Entrada unipolar Entrada diferencial no inversora Entrada diferencial inversora Ganancia, Ku
00000 ADC0 No
00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
01000 No ADC0 ADC0 10
01001 ADC1 ADC0 10
01010 ADC0 ADC0 200
01011 ADC1 ADC0 200
01100 ADC2 ADC2 10
01101 ADC3 ADC2 10
01110 ADC2 ADC2 200
01111 ADC3 ADC2 200
10000 ADC0 ADC1 1
10001 ADC1 ADC1 1
10010 ADC2 ADC1 1
10011 ADC3 ADC1 1
10100 ADC4 ADC1 1
10101 ADC5 ADC1 1
10110 ADC6 ADC1 1
10111 ADC7 ADC1 1
11000 ADC0 ADC2 1
11001 ADC1 ADC2 1
11010 ADC2 ADC2 1
11011 ADC3 ADC2 1
11100 ADC4 ADC2 1
11101 ADC5ADC21
No111110V(TIERRA)
11110 1,23 V (VBG)

Registro de estado y control del ADC A – ADCSRA

Descargar 7 6 5 4 3 2 1 0
ADÉN ADSC ADFR ADIF UNA MUERTE ADPS2 ADPS1 ADPS0 ADCSRA
Leer escribir R/E R/E R/E R/E R/E R/E R/E R/E
Árbitro. significado 0 0 0 0 0 0 0 0

Bit 7 - ADEN: habilitación de operación ADC

Escriba en este registro de bits. 1 habilita el ADC. Si escribe un registro en este bit. 0, el ADC está deshabilitado, incluso si estaba en proceso de conversión.

Bit 6 - ADSC: iniciar la conversión de ADC

En el modo de conversión única, configurar este bit inicia el inicio de cada conversión. En el modo de reinicio automático, configurar este bit inicia solo la primera conversión y todas las demás se realizan automáticamente. La primera conversión después de habilitar el ADC, iniciada por el bit ADSC, se realiza mediante un algoritmo extendido y dura 25 ciclos de reloj del ADC, en lugar de los 13 ciclos de reloj habituales. Esto se debe a la necesidad de inicializar el ADC.

Durante el proceso de conversión, al sondear el bit ADSC, se devuelve un registro. 1, y al finalizar la conversión - log. 0. Escribir registro. 0 no está incluido en este bit y no tiene ningún efecto.

Bit 5 – ADFR: selección del modo de reinicio automático del ADC

Si escribe un registro en este bit. 1, el ADC entrará en modo de reinicio automático. En este modo, el ADC realiza automáticamente conversiones y modifica los registros de resultados de la conversión a intervalos fijos. Registro de registro. Un 0 en este bit detiene la operación en este modo.

Bit 4 – ADIF: Bandera de interrupción ADC

Este indicador se establece después de que se completa la conversión de ADC y se actualizan los registros de datos. Si los bits ADIE e I (registro SREG) están configurados, se produce una interrupción cuando se completa la conversión. El indicador ADIF se restablece mediante hardware cuando se pasa al vector de interrupción correspondiente. Alternativamente, el indicador ADIF se restablece escribiendo el registro. 1 en él. Tenga en cuenta que al ejecutar una instrucción de lectura, modificación y escritura en el registro ADCSRA, la interrupción pendiente puede desactivarse. Esto también se aplica al uso de instrucciones SBI y CBI.

Bit 3 – ADIE: Habilitación de interrupción ADC

Después de grabar el registro. Un 1 en este bit, siempre que el bit I en el registro SREG esté configurado, habilita una interrupción al finalizar la conversión ADC.

Bits 2:0 – ADPS2:0: Bits de control del preescalador ADC

Estos bits determinan en qué valor la frecuencia del reloj de la CPU diferirá de la frecuencia del reloj de entrada del ADC.

Tabla 99 – Control del preescalador ADC

Registros de datos ADC: ADCL y ADCH

ADLAR = 0:

Descargar 15 14 13 12 11 10 9 8
- - - - - - ADC9 ADC8 ADCH
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 ADCL
7 6 5 4 3 2 1 0
Leer escribir Jueves. Jueves. Jueves. Jueves. Jueves. Jueves. Jueves. Jueves.
Jueves. Jueves. Jueves. Jueves. Jueves. Jueves. Jueves. Jueves.
Árbitro. significado 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

ADLAR = 1:

Descargar 15 14 13 12 11 10 9 8
ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH
ADC1 ADC0 - - - - - - ADCL
7 6 5 4 3 2 1 0
Leer escribir Jueves. Jueves. Jueves. Jueves. Jueves. Jueves. Jueves. Jueves.
Jueves. Jueves. Jueves. Jueves. Jueves. Jueves. Jueves. Jueves.
Árbitro. significado 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Cuando se completa la conversión, el resultado se coloca en estos dos registros. Cuando se utiliza el modo de conversión diferencial, el resultado se representa en código de complemento binario.

Si se lee el ADCL, entonces se bloqueará el acceso a estos registros para el ADC (es decir, el ADC no podrá modificar más el resultado de la conversión) hasta que se lea el registro ADCH.

Es conveniente utilizar el formato de la izquierda para presentar el resultado si 8 dígitos son suficientes. En este caso, el resultado de 8 bits se almacena en el registro ADCH y, por lo tanto, no es necesario leer el registro ADCL. Con el formato de la derecha, primero se debe leer ADCL y luego ADCH.

ADC9:0: resultado de la conversión ADC

Estos bits representan el resultado de la conversión.



Si encuentra un error, seleccione un fragmento de texto y presione Ctrl+Entrar.