- Bewaking batterijspanning aan uw Arduino
- Controleren om te zien als de netvoeding draait
- Nauwkeurigheid van analogRead() in vele situaties te verbeteren
De manier om het uitvoeren van deze heldendaden is de interne verwijzing gebruiken voor het daadwerkelijk meten van de Vcc. In de volgende code, zal daadwerkelijk meten we de interne referentiespanning, en deze waarde vervolgens gebruiken voor het berekenen van onze Vcc eigenlijk. Hier is de code:
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) ; #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 }
Er zijn enkele beperkingen in nauwkeurigheid als gevolg van toleranties op de interne referentiespanning. U kunt echter de schaalfactor voor grotere nauwkeurigheid te kalibreren. Deze code wordt uitgevoerd op alle varianten van de Arduino, alsook de ATtinyx4 serie chips.
Voor een meer diepgaand artikel waaronder berekening details, toepassingen en kalibratie how-to, Zie Geheim Arduino Voltmeter-maatregel accuspanning.