Na podstawie: https://forum.arduino.cc/index.php?topic=38119.0
Mierzymy napięcie referencyjne
- Do Arduino UNO wysyłamy pusty skecz
- Odłączamy zasilanie
- Łączymy AREF z masą (GND) przez kondensator 0,1uF
- Podłączamy zasilanie
- Ładujemy poniższy skecz
- Odczekujemy chwilę aż monitor szeregowy wyświetli kilka cyfr
- 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
- Ładujemy pusty skecz
- Odłączamy zasilanie
- Łączymy AREF z +5V
- Podłączamy zasilanie
- 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.
- Wysyłamy skecz do płytki.
- 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 & (1<<ADSC)) != 0 ) ); // Scale the value value = (((InternalReferenceVoltage * 1024L) / ADC) + 5L) / 10L; Serial.println( value ); delay( 1000 ); }