Mierzenie napięcia zasilania w stosunku do wewnętrznego napięcia odniesienia AREF ~ 1,1V

Na podstawie: https://forum.arduino.cc/index.php?topic=38119.0

Mierzymy napięcie referencyjne
  1. Do Arduino UNO wysyłamy pusty skecz
  2. Odłączamy zasilanie
  3. Łączymy AREF z masą (GND) przez kondensator 0,1uF
  4. Podłączamy zasilanie
  5. Ładujemy poniższy skecz
  6. Odczekujemy chwilę aż monitor szeregowy wyświetli kilka cyfr
  7. Mierzymy i zapisujemy napięcie na kondensatorze. Jest to właściwe napięcie odniesienia dla naszego procesora. U mnie wynosiło ono 1,073V
const uint8_t PinLED = 13;

void setup( void )
{
 Serial.begin( 38400 );
 Serial.println( "\r\n\r\n" );

 pinMode( PinLED, OUTPUT );
 digitalWrite( PinLED, LOW );
 delay( 1000 );

 analogReference( INTERNAL );
}

void loop( void )
{
 Serial.println( analogRead( 0 ) );
 digitalWrite( PinLED, HIGH );
 delay( 1000 );
}
Mierzenie napięcia zasilania
  1. Ładujemy pusty skecz
  2. Odłączamy zasilanie
  3. Łączymy AREF z +5V
  4. Podłączamy zasilanie
  5. Modyfikujemy skecz poniżej wpisując wcześniej otrzymaną wartość wewnętrznego napięcia odniesienia, którą odczytaliśmy wcześniej. Wartość mnożymy przez 1000. U mnie 1073.
  6. Wysyłamy skecz do płytki.
  7. Wartość napięcia USB to wartość odczytana z monitora * 100.

const long InternalReferenceVoltage = 1073L;  // <<<<<<<<<< Change this to the reading from your internal voltage reference

void setup( void )
{
 Serial.begin( 38400 );
 Serial.println( "\r\n\r\n" );

 // REFS1 REFS0          --> 0 0 AREF, Internal Vref turned off
 // MUX3 MUX2 MUX1 MUX0  --> 1110 1.1V (VBG)
 ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
}

void loop( void )
{
 int value;

 // Start a conversion  
 ADCSRA |= _BV( ADSC );
 
 // Wait for it to complete
 while( ( (ADCSRA &amp; (1<<ADSC)) != 0 ) );

 // Scale the value
 value = (((InternalReferenceVoltage * 1024L) / ADC) + 5L) / 10L;

 Serial.println( value );
 delay( 1000 );
}

Dodaj komentarz