Code Arduino permettant de mesurer la tension d'alimentation de la carte en VIN

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

Description :

Code Arduino permettant de mesurer la tension d'alimentation de la carte en VIN.

Code source :

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

/**
 * 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);
  delay(1000);
}