4 votos

¿Cómo puedo obtener una relación lineal entre un divisor de tensión y un ADC?

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:

schematic

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?

11voto

jason Puntos 147

Usted afirma que en el 128, que miden alrededor de 500 mv. Esto significa que en la escala total (256) que miden alrededor de 1V.

De acuerdo a la hoja de datos (14.12) con:

// Set ADC reference to AVCC
ADMUX  |= (1 << REFS0);

Usted realmente hacer lo siguiente:

Este bit selecciona el voltaje de referencia para el ADC, como se muestra en la Tabla 14-2. Si este bit se cambia durante la conversión, el cambio no entrará en efecto hasta que esta conversión es completa (ADIF en ADCSRA se establece).

La tabla 14-2.

Voltage Reference Selections for ADC
REFS0   Voltage Reference Selection
0       VCC used as analog reference.
1       Internal Voltage Reference.

El párrafo 14.3 estados:

El ADC convierte una entrada analógica de voltaje en un 10-bit digital de valor a través de aproximaciones sucesivas. El valor mínimo representa GND y el valor máximo representa el voltaje de VCC o un interno 1.1 V tensión de referencia.

Así que, en conclusión, se establece el ADC tensión de referencia a 1.1 V y con ese conocimiento los resultados son bastante precisos.

4voto

AnonJr Puntos 111

El comentario no coincide con el código.

// Set ADC reference to AVCC
ADMUX  |= (1 << REFS0);

Pero la hoja de datos dice:

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X