Estoy tratando de medir el voltaje de la batería de 30V usando el ADC de un AVR Atmega8, AVCC está conectado a 5V.
Conecté un divisor de voltaje adecuado: R1 es 270k, R2 es 10k. El resultado que obtengo es del todo incorrecto, 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;
Su cálculo para el voltaje de la batería es incorrecto. Suponiendo adcReading
que varía de 0 a 1023, debería verse así:
batteryVoltage = (adcReading * 30) / 1023
Sin embargo, tenga en cuenta que denotar un voltaje como este, con voltios enteros, solo le dará 31 lecturas posibles (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
.
@Mahmoud: dependiendo de la resolución de su ADC (¿10 bits, 12 bits?), Me gustaría dividir por 10 usando su divisor de resistencia, por lo que 32V == 3.2V en el ADC
Esto da un rango posible 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.049V para una entrada de 50V
Si necesita un poco más de precisión, divida a 35 V == 5,0 V en la entrada, lo que le da una resolución de 0,034 V
pjc50
mahmud
nick johnson
mahmud