Estoy haciendo un pequeño medidor de nivel de uso de un microcontrolador ATtiny. Se utiliza un lineal de 5K potenciómetro como divisor de tensión acoplado a un ADC pin. Hasta ahora es un trabajo, excepto los valores digitales no parecen correlacionarse bien con el voltaje medido.
El esquema:
simular este circuito – Esquema creado mediante CircuitLab
El código correspondiente:
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
int adc_value;
void ADC_init()
{
// Enable ADC
ADCSRA |= (1 << ADEN);
// Set ADC reference to AVCC
ADMUX |= (1 << REFS0);
// Prescaler /8, 125kHz ADC sample rate @ 1MHz
ADCSRA |= (0 << ADPS2) | ( 1 << ADPS1) | (1 << ADPS0);
// Auto trigger enable
ADCSRA |= (1 << ADATE);
// Use input channel ADC2 (PB4)
ADMUX |= (1 << MUX1) | (0 << MUX0);
// Left shift ADC result
ADMUX |= (1 << ADLAR);
// Start converting
ADCSRA |= (1 << ADSC);
}
int main(void)
{
DDRB = 0x07;
PORTB = 0x00;
ADC_init();
while(1)
{
adc_value = ADCH;
if (adc_value < 64)
// output A
else if (adc_value < 128)
// output B
else if (adc_value < 192)
// output C
else
// output D
}
}
He medido el voltaje en PB4, y señalar los puntos en los que la salida cambiado:
- Mínimo: 196 mV
- 64: ~235 mV
- 128: ~500 mV
- 192: ~770 mV
- Máximo: 2.849 V
Yo esperaba aproximadamente 1.5 V, donde un valor digital de 128 se obtiene, no 500 mV.
Si entiendo correctamente, el ATtiny13A tiene un 10-bit ADC, los valores que se almacenan en dos registros, ADCH y ADCL. Con ADLAR (el de la izquierda ajustar) habilitada, el valor se ha desplazado hacia el ADCH registro y, de hecho, dos bits son descartados.
La hoja de datos indica:
Si el resultado es ajustado a la izquierda y no más de 8 bits de precisión es necesaria, es suficiente para leer ADCH.
Estoy confundido acerca de ¿por qué estoy recibiendo un no lineal de conversión del ADC. Puede usted explicar lo que me puede estar pasando por alto?