Code Arduino / AVR permettant de mesurer la tension d'alimentation du microcontrôleur (version compatible UNO, Mega et Leonardo/Micro)

par skywodd | | Langue : C++ | Licence : GPLv3

Description :

Code Arduino / AVR permettant de mesurer la tension d'alimentation du microcontrôleur.

Compatible avec les microcontrôleurs ATMega328p, ATMega2560 et ATMega32U4.

Code source :

Voir le code source brut | Télécharger readvcc2.ino | Télécharger readvcc2.ino.zip

/**
 * Code Arduino / AVR permettant de mesurer la tension d'alimentation du microcontrôleur.
 */

/* Fonction setup() */
void setup() {
 
  /* Initialisation du port série */
  Serial.begin(115200); 
  Serial.println(F("VCC-O-Meter"));
}

/** Mesure la référence interne à 1.1 volts */
unsigned int analogReadReference(void) {
  
  /* Elimine toutes charges résiduelles */
#if defined(__AVR_ATmega328P__)
  ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5F;
#endif
  delayMicroseconds(5);
  
  /* Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC */
#if defined(__AVR_ATmega328P__)
  ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5E;
#endif
  delayMicroseconds(200);

  /* Active le convertisseur analogique -> numérique */
  ADCSRA |= (1 << ADEN);
  
  /* Lance une conversion analogique -> numérique */
  ADCSRA |= (1 << ADSC);
  
  /* Attend la fin de la conversion */
  while(ADCSRA & (1 << ADSC));
  
  /* Récupère le résultat de la conversion */
  return ADCL | (ADCH << 8);
}

/* Fonction loop() */
void loop() {
  
  /* 
   * Idéalement :
   * VCC = 5 volts = 1023
   * Référence interne = 1.1 volts = (1023 * 1.1) / 5 = 225
   * 
   * En mesurant la référence à 1.1 volts, on peut déduire la tension d'alimentation réelle du microcontrôleur
   * VCC = (1023 * 1.1) / analogReadReference()
   */
  float tension_alim = (1023 * 1.1) / analogReadReference();
  Serial.println(tension_alim, 3);
  delay(1000);
}