Jeśli używasz Arduino to pewnie wiesz co robi funkcja analogRead(x);. Odczytuje napięcie z wejścia analogowego. Jeśli funkcja zwraca 0, to na wejściu jest 0 V. Jeśli funkcja zwraca 1023 to na wejściu jest maksymalne napięcie, przyjmuje się że wynosi około 5 V.
No właśnie “około”. Czasem przydaje się większa dokładność. Można ją uzyskać małym kosztem. Na stronie Thinkerit znajduje się fajny program:
long readVcc() { long result; // Read 1.1V reference against AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = 1126400L / result; // Back-calculate AVcc in mV return result; } void setup() { Serial.begin(9600); } void loop() { Serial.println( readVcc(), DEC ); delay(1000); }
Funkcja readVcc(); odczytuje dokładne napięcie zasilania Arduino. Jest to też napięcie, które jest na wejściu analogowym, gdy funkcja analogRead zwraca wartość 1023(*). Napięcie jest zwracane w mili-voltach. Czyli jeśli funkcja zwróci 5123 mV to napięcie zasilania wynosi 5,123 V.
Okazuje się, że napięcie zasilania może być niestabilne, więc warto odczytywać je za każdym razem gdy odczytujesz wejście analogowe i przeliczać jego wartość.
Jeśli masz Arduino Leonardo, to potrzebujesz lekko zmienionej funkcji, będzie ona opublikowana już wkrótce.
Jeśli interesujesz się tym jak działa funkcja readVcc możesz się dowiedzieć z dokumentacji procesora Arduino na stronie 262, lub pytając mnie w komciach:
Dokumentacja kontrolera Atmega 328p
Wpis o funkcji readVcc na stronie Thinkerit
Arduino UNO R3 w sklepie Nettigo
*Tak wiem, że jest analogReference i po nim funkcja zwraca napięcie ARef 😉
sprae