Voltaje de referencia ADC de Arduino si funciona con batería

9

Estoy buscando monitorear posiblemente la energía de la batería del Arduino usando su ADC. Esto es bastante sencillo y sencillo (especialmente si se usa la API de Arduino); sin embargo, si la batería está alimentando el Arduino y no está regulada externamente, ¿no caerá constantemente el voltaje de referencia del ADC con la batería? En otras palabras, ¿el valor de ADC no leería constantemente el mismo valor (el valor máximo) a pesar de que la batería realmente estaría disminuyendo su voltaje?

Si este es el caso, sería ineficiente y sin sentido medir el voltaje de la batería.

ryeager
fuente

Respuestas:

4

... ¿no caerá constantemente el voltaje de referencia del ADC con la batería?

Sí, es por eso que usa o mide una referencia de banda prohibida interna.

Use la analogReference()función para seleccionar una referencia apropiada para el tablero en uso. Tenga en cuenta que necesitará usar un divisor de voltaje para reducir el voltaje de la batería a un valor inferior al de la referencia seleccionada si desea medirlo.

Para medir la tensión de banda prohibida lugar (utilizando AV CC como referencia y de trabajo "hacia atrás") que tendrá que establecer MUX[3:0]en ADMUXal 0b1110 y luego realizar un ADC leer directamente (conjunto ADSCde ADCSRAy espera hasta que se restablece, a continuación, leer ADC[H:L]).

Como siempre, vea la hoja de datos de MCU para más detalles.

Ignacio Vazquez-Abrams
fuente
Gran información, ahora creo que puedo proceder por mi cuenta. Esperaba que hubiera algún tipo de referencia interna que pudiera usarse. Como sugirió, necesitaré dividir el voltaje del voltaje de alimentación por debajo de AVccref, sin embargo, estoy buscando maximizar la vida útil de la batería en todos los aspectos posibles, por lo que iba a usar una resistencia equivalente grande para el divisor para asegurarme de tener menos de un uA de fuga de corriente. ¿Ves algún problema con esto?
ryeager
1
La impedancia del ADC es de solo 100Mohm. Considere medir la referencia interna en su lugar.
Ignacio Vazquez-Abrams
1
FYI Encontré este increíble blog después de la respuesta @Ignacio publicado: enlace
ryeager
1

El enlace de @ ryeager a http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836 tiene este código para leer el voltaje de la batería del Arduino:

long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}

El truco aquí es que mide su referencia interna de 1.1V usando el voltaje de la batería, y luego lo invierte para calcular el voltaje de referencia desconocido.

La magia de ADMUX en este código puede permitir otras lecturas de ADC interesantes, como mediciones diferenciales y mediciones de ADC diferenciales con ganancia, según el componente y la hoja de datos.

Dave X
fuente