Dokładniejsze wejścia analogowe w Arduino UNO

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