No se obtiene una salida estable de ADC

0

He escrito un programa corto para medir la temperatura de la habitación usando un sensor de temperatura, LM335. La fuente de alimentación se fija bastante constante a 5.04V. Se supone que el siguiente código imprime el segundo dígito de la temperatura y lo muestra en una salida de siete segmentos. Seguí el mismo procedimiento para obtener el primer dígito y funcionó. Sin embargo, este particular no parece funcionar ...

#include <avr/io.h>
#include <avr/delay.h>

uint16_t readADC(uint8_t channel) {
    ADMUX = (0xf0 & ADMUX) | channel;
    ADCSRA |= (1 << ADSC);

    while(!(ADCSRA & (1<<ADIF)));
    ADCSRA|=(1<<ADIF);
    return(ADC);
}

int main(void) {

uint16_t sensorValue;
double voltage,tempC,c;
int tempInt;

// Common Anode Configuration

int lookup[10] = {
    0x3f, 0x6, 0x5b, 0x4f, 0x66,
    0x6d, 0x7d, 0x7, 0xff, 0x6f
};

DDRD=0xff;
PORTD=0b00000000;

//Set up ADC
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADPS1) | (1 << ADPS0);
ADCSRA |= (1 << ADEN);

while (1) {
    sensorValue = readADC(0);
    _delay_ms(1000);
    voltage= 5.04/1023.0*sensorValue;

    tempC=(voltage*100-273.15);
    tempInt=(int)tempC;

    c=(tempC-tempInt)*10; 
    onesPart=(int)c;
    PORTD=lookup[onesPart];

    } 
    return (0);
}

La temperatura aquí es de alrededor de 31 C en este momento. El segundo dígito es 1, pero las lecturas son bastante engañosas. ¡A veces muestra 2, 3 e incluso 7 u 8! No sé cuál es el problema con el código.

Uso el ADC incorporado de Atmega8a. Tiene una resolución de 10 bits por lo que tiene suficiente precisión. La entrada analógica para ADC0 fue de 3.04 V, lo que resultó en una temperatura de 304-273 = 31 C. Se espera que el segundo dígito sea 1 y no otra cosa. Como es la primera vez que uso ADC, es posible que haya algo mal. Cualquier pensamiento es apreciado.

    
pregunta dirac16

0 respuestas

Lea otras preguntas en las etiquetas