/** * Code Arduino permettant de mesurer la tension d'alimentation de la carte en VIN. */ /* Le numéro de broche analogique pour la mesure de la tension en VIN */ const byte BROCHE_CAPTEUR_VIN = A0; /* Coefficient diviseur du pont de résistance */ const float COEFF_PONT_DIVISEUR_VIN = 4.0; /* Fonction setup() */ void setup() { /* Initialisation du port série */ Serial.begin(115200); Serial.println(F("VIN-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() { /* Mesure la tension en VIN et la référence interne à 1.1 volts */ unsigned int raw_vin = analogRead(BROCHE_CAPTEUR_VIN); unsigned int raw_ref = analogReadReference(); /* Calcul de la tension réel avec un produit en croix */ float real_vin = ((raw_vin * 1.1) / raw_ref) * COEFF_PONT_DIVISEUR_VIN; /* Affichage */ Serial.println(real_vin, 3)