Estoy usando un microcontrolador Atmega32-A y un AD7798 ADC externo. Puedo establecer los registros de ADC y leer los valores de ADC. He escrito el siguiente código:
statusreg = AD7798_8(0x40, 0xFF); // read STATUS register default value
Id = AD7798_8(0x60, 0xFF); // read ID register default value
mode = AD7798_16(0x48, 0xFFFF); // read MODE register default value
conf = AD7798_16(0x50, 0xFFFF); // read conf register default value
AD7798_16(0x10, 0x0010); // write Configuration reg = 0x0010. 2.5V range
value = AD7798_16(0x50, 0xFFFF); // read Configration register
if (value != 0x0010)
printf("unexpected conf setting %04x\r\n", value);
while ((statusreg & 0x80) != 0); // wait till ADC is ready
adc = AD7798_16(0x58, 0xFFFF); // read register
printf("ADC value is %04d\r\n", adc);
Desde el código anterior, estoy leyendo los valores de ADC. De acuerdo con la hoja de datos AD7798 y de acuerdo con la configuración de mi registro de configuración, tengo que averiguar el voltaje de entrada analógica usando la siguiente fórmula:
Cuando el ADC está configurado para operación bipolar, el código de salida es Binario de compensación, con un voltaje de escala total negativo que resulta en un código de 000 ... 000, una tensión de entrada diferencial cero que resulta en un código de 100 ... 000, y un voltaje de entrada de escala completa positivo que resulta en un codigo de 111 ... 111. El código de salida para cualquier voltaje de entrada analógica puede ser representado como
Código = 2 N - 1 × [( AIN × GAIN / VREF ) + 1]
donde:
AIN es el voltaje de entrada analógica.
N = 16 para el AD7798, y N = 24 para el AD7799.
Estoy obteniendo un valor de ADC de 1EF2
(hex) para una entrada analógica de 0.6V. He medido utilizando un osciloscopio. He calculado el voltaje de entrada analógica utilizando la fórmula anterior y obtengo 0.15V. Aquí GAIN es 1, VREF = 2.5V. Lo cual está mal porque tengo que conseguir 0.6V. He convertido el valor ADC hexadecimal resultante en decimal 7922
y también en binary 0001111011110010
. Mi voltaje de entrada analógica varía de 0V a 0.6V. Según mi voltaje de entrada analógica, mi salida ADC también está cambiando de 0002
a 1EF2
.
Si cambio la configuración del registro de configuración a cualquier otra configuración como bipolar a unipolar (de 0x0010
a 0x1010
), en ese momento obtengo un valor de ADC de 0000
siempre. Está dando un valor de ADC de 0000
para cualquier configuración que no sea 0x0010
en el registro de configuración.
Más allá, no puedo entender lo que significa la siguiente oración:
con un voltaje de escala total negativo que da como resultado un código de 000 ... 000, una tensión de entrada diferencial cero que da como resultado un código de 100 ... 000, y un voltaje de entrada positivo a gran escala que resulta en un código de 111 ... 111.
¿Cómo convierto correctamente la señal digital resultante a una tensión analógica?
¿Mis lecturas de ADC son correctas o incorrectas?
¿Por qué mi código no funciona para ninguna otra configuración?