Medición de 32V usando ADC de Atmega8

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;
¿Por qué estás dividiendo por adcReading?
@ pjc50 para obtener la lectura completa de la batería?
adcReading debe ser el numerador, no el denominador. Configurado como está, el resultado disminuirá al aumentar el voltaje.
@NickJohnson El resultado siempre es cero ... ¿Cómo también puedo modificarlo para que el resultado aumente con la disminución del voltaje?

Respuestas (2)

Su cálculo para el voltaje de la batería es incorrecto. Suponiendo adcReadingque 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 batteryVoltageMillivoltstendrá que ser un long, no un int.

¿Me pueden ayudar con el problema del divisor de voltaje, por favor? Creo que también está afectando...
¿Qué problema con el divisor de voltaje? No especificó uno en la pregunta.
He especificado R1 = 50k, R2 = 10k, esto da 5V a 30V, pero aún así la salida es incorrecta usando las ecuaciones anteriores.
¡Dijiste R1 = 270k arriba! ¿Cuál es la lectura real en el pin de entrada adc con un voltímetro?
Desea asegurarse de que el divisor permita un cierto "desbordamiento": si desea medir 32 V pero el voltaje de entrada de su ADC es de 5 V (es decir, máx.) a 30 V, ¡tendrá un problema!
@Andrew, sí, me gustaría proporcionar un desbordamiento y también evitarlo.

@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

es 10bit del AVR Atmega8