Każde Arduino ma wejścia analogowe w sekcji ANALOG IN (od A0 do A5). Pozwalają one dokładnie mierzyć napięcie.
Arduino Yun i Leonardo mają więcej wejść analogowych. Są one ukryte w pinach sekcji DIGITAL.
- Pin cyfrowy 4 to wejście analogowe A6
- Pin cyfrowy 6 to wejście analogowe A8
- Pin cyfrowy 8 to wejście analogowe A9
- Pin cyfrowy 9 to wejście analogowe A10
- Pin cyfrowy 10 to wejście analogowe A11
- Pin cyfrowy 12 to wejście analogowe A7
Napięcie na wejściach analogowych mierzysz za pomocą funkcji “analogRead”
word value = analogRead(numer_wejścia);
Gdzie:
- value – zmienna przechowująca wynik pomiaru od 0 do 1023. Gdzie 0 to 0 V, a 1023 to domyślnie 5 V.
- numer_wejścia – numer wejścia analogowego zależnie od pinu w Yun to wartości do 0 dla pinu A0 do 11 dla pinu A11.
Dokładność pomiaru wejść analogowych zależy od napięcia odniesienia.
Napięcie odniesienia to wzorcowe napięcie, przy którym przetwornik wejścia analogowego wskazuje wartość maksymalną (1023).
Napięcie odniesienia ustawiasz za pomocą funkcji “analogReference”.
analogReference(reference);
reference – rodzaj napięcia odniesienia.
Rodzaj wybieramy za pomocą stałych, gdzie:
- DEFAULT – napięciem odniesienia jest napięcie zasilania około 5 V
- INTERNAL – napięciem odniesienia jest dokładne napięcie 2,56 V
- EXTERNAL – napięciem odniesienia jest napięcie podłączone do pinu AREF
W zależności od tego jaki zakres wyjść ma czujnik podłączony do wejścia analogowego, wartość napięcia odniesienia powinna być większa lub równa z jego zakresem.
Najbardziej dokładny jest rodzaj INTERNAL, ale nadaje się od tylko do urządzeń z wyjściem od 0 do 2,5 V (np pojedyncze ogniwa baterii).
Najmniej dokładny jest rodzaj DEFAULT, bo napięcie zasilania nie ma idealnie 5 V. Zmienia się pod wpływem różnych warunków np. obciążenia, albo zakłóceń.
Można poprawić dokładność pomiaru z referencją DEFAULT. W tym celu przerobiłem mały programik, który zwróci dokładne napięcie odniesienia.
long readVcc() { ADMUX = _BV(REFS0) | _BV(MUX1) | _BV(MUX2) | _BV(MUX3) | _BV(MUX4); delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); long result = ADCL; result |= ADCH<<8; result = 1126400L / result; // Back-calculate AVcc in mV return result; } void setup() { while (!Serial); Serial.begin(9600); } void loop() { Serial.println(readVcc()); delay(1000); }
Funkcja “readVcc” zwraca dokładną wartość napięcia zasilania w mili voltach. Właśnie dla takiego napięcia przetwornik będzie zwracał wartość 1023.
Ciekawe, że Arduino Yun zwróciło mi wartość zasilania 4200 mV.
- Dokładniejsze wejścia analogowe w Arduino UNO
- Dokumentacja przetwornika ADC kontrolera ATmega32u4 strona 292
- Kup Arduino Leonardo w sklepie Nettigo
- Kup Arduino Yun w sklepie Nettigo
sprae