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 );
}