Arduino ADC Reference Voltage s'il est alimenté par batterie

9

Je cherche à surveiller éventuellement la puissance de la batterie de l'Arduino à l'aide de son ADC. C'est assez simple et simple (surtout si vous utilisez l'API Arduino); cependant, si la batterie alimente l'Arduino et n'est pas régulée de l'extérieur, la tension de référence ADC ne baissera-t-elle pas constamment avec la batterie? En d'autres termes, la valeur ADC ne lirait-elle pas constamment la même valeur (la valeur maximale) même si la batterie diminuait réellement de tension?

Si tel est le cas, il serait à la fois inefficace et inutile de mesurer la tension de la batterie.

ryeager
la source

Réponses:

4

... la tension de référence ADC ne baisse-t-elle pas constamment avec la batterie?

Oui, c'est pourquoi vous utilisez ou mesurez plutôt une référence de bande interdite interne.

Utilisez la analogReference()fonction pour sélectionner une référence appropriée pour la carte utilisée. Notez que vous devrez utiliser un diviseur de tension pour réduire la tension de la batterie à une valeur inférieure à celle de la référence sélectionnée si vous souhaitez la mesurer.

Pour mesurer la tension au lieu de bande interdite ( en utilisant AV CC comme « à rebours » de référence et de travail) , vous aurez besoin de mettre MUX[3:0]dans ADMUXla 0b1110 puis effectuez un ADC lecture directement (jeu ADSCdans ADCSRAet attendre jusqu'à ce qu'il remet à zéro, puis lire ADC[H:L]).

Comme toujours, consultez la fiche technique du MCU pour plus de détails.

Ignacio Vazquez-Abrams
la source
Grande information, maintenant je pense que je peux continuer par moi-même. J'espérais qu'il y aurait une sorte de référence interne qui pourrait être utilisée. Comme vous l'avez suggéré, je devrai diviser la tension d'alimentation en dessous de AVccref, cependant, je cherche à maximiser la durée de vie de la batterie dans tous les aspects possibles, donc j'allais utiliser une grande résistance équivalente pour le diviseur pour m'assurer d'avoir moins d'un uA de courant qui fuit. Voyez-vous des problèmes avec cela?
ryeager
1
L'impédance ADC n'est que de 100Mohm. Envisagez plutôt de mesurer la référence interne.
Ignacio Vazquez-Abrams
1
Pour info j'ai trouvé ce blog génial après la réponse @Ignacio postée: lien
ryeager
1

Le lien de @ ryeager vers http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836 a ce code pour lire la tension de la batterie de l'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
}

L'astuce ici est qu'il mesure sa référence interne de 1,1 V en utilisant la tension de la batterie, puis l'inverse pour calculer la tension de référence inconnue.

La magie ADMUX dans ce code peut permettre d'autres lectures ADC intéressantes, telles que des mesures différentielles et des mesures ADC différentielles avec gain, selon le composant et la fiche technique.

Dave X
la source