Midiendo 32V usando ADC de Atmega8

1

Estoy tratando de medir el voltaje de la batería de 30 V utilizando el ADC de un AVR Atmega8, el AVCC está conectado a 5 V.

He conectado un divisor de voltaje adecuado: R1 es 270k, R2 es 10k. El resultado que obtengo es incorrecto en absoluto, a 30V obtengo 23V. La ecuación que uso es batteryvoltage = 5*1023/adcReading .

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
unsigned int adcReading = 0;

adcReading = read_adc(0);
batteryVoltage = 5*1023/adcReading;
    
pregunta Mahmoud

2 respuestas

5

Su cálculo para el voltaje de la batería es incorrecto. Suponiendo que adcReading varía de 0 a 1023, debería tener este aspecto:

batteryVoltage = (adcReading * 30) / 1023

Sin embargo, tenga en cuenta que denotar un voltaje como este, con voltios enteros, solo le dará 31 lecturas posibles (de 0 a 30). Un resultado más útil podría ser en milivoltios:

batteryVoltageMillivolts = (adcReading * 30000) / 1023

Tenga en cuenta que en este caso batteryVoltageMillivolts tendrá que ser un long , no un int .

    
respondido por el Nick Johnson
1

@Mahmoud: dependiendo de la resolución de su ADC (¿10 bits, 12 bits?) Me gustaría dividir por 10 usando su divisor de resistencia: 32V == 3.2V en el ADC

Esto da un posible rango de 50V == 5.0V en el ADC, por lo tanto, no hay sobrecarga de la entrada.

Para el ADC de 10 bits, esto le da una resolución de 0.049 V para una entrada de 50 V

Si necesita un poco más de precisión, divida a 35V == 5.0V en la entrada que le da una resolución de 0.034V

    
respondido por el Andrew

Lea otras preguntas en las etiquetas