/** * 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