Wskaźnik niskiego poziomu baterii

22

Chcę stworzyć wskaźnik żywotności baterii, którego będę mógł używać w połączeniu z mikrokontrolerem. Mam nadzieję, że będę w stanie odczytać aktualny pozostały czas pracy baterii i coraz częściej uśpię mikrokontroler, aby wydłużyć żywotność baterii.

littlebirdceo
źródło
1
Który mikrokontroler?
Brian Carlton,

Odpowiedzi:

13

Na podstawowe pytanie, jak zmierzyć napięcie akumulatora, najprostszą metodą jest użycie jednego ze styków ADC na arduino.

Jeśli dostarczasz 5 V z akumulatora (mało prawdopodobne), możesz poprowadzić + bezpośrednio do jednego z analogowych pinów i użyć analogRead () - każdy przyrost wartości (od 0-1023) będzie reprezentował 4,9 mV. Pomnóż wartość odczytu przez 0,0049, aby odczytać wolty.

Jeśli pracujesz powyżej 5 V (bardziej prawdopodobne), możesz użyć obwodu dzielnika napięcia (patrz: http://en.wikipedia.org/wiki/Voltage_divider ), aby doprowadzić napięcie, które wysyłasz na wejście analogowe do <= 5v. Jeśli używasz 12 V, zechcesz podzielić napięcie na mniej więcej 1/3. Następnie, po pomnożeniu wartości ADC, należy pomnożyć przez 3, aby uzyskać rzeczywiste napięcie.

Tak więc, jeśli używasz 12 V i dzielnika napięcia 1/3:

#define BAT_PIN 14

float read_batt_volts(void) {

  int val = analogRead(BAT_PIN);

  float volts = (float) val * (float) 0.0049 * (float) 3;

  return(volts)
}

!do

Shutterdrone
źródło
2
Muszę dodać do tego dwie główne rzeczy. Po pierwsze, większość akumulatorów 12 V nie umiera przy 0 V, ale zamiast tego przy czymś całkiem blisko, przynajmniej w granicach 5 V, od pełnego napięcia ładowania. Powszechną techniką uzyskiwania pomiarów o wyższej rozdzielczości w zakresie roboczym jest obniżanie napięcia za pomocą diody Zenera. Rezystor połączony szeregowo z zenerem i mierzysz na oporniku. Po drugie, większość ludzi nie zdaje sobie sprawy, że musisz pobierać prąd z akumulatora, aby uzyskać dobre pojęcie o pozostałej mocy.
Kortuk
@Kortuk: Czy mógłbyś podać dwa wyjaśnienia dotyczące mojej nauki: (1) Czy chcesz osiągnąć zakres napięcia akceptowany przez pin, czy sugerujesz, że podejście diody Zenera da wyższą rozdzielczość niż metoda dzielnika napięcia? (2) Dlaczego wspomniał pan tutaj, że „trzeba narysować prąd ...” itp.?
boardbite
22

tinker.it opublikował „tajny” miernik poziomu napięcia w Atmega168 / atmega328. Z małą sztuczką Arduino jest w stanie porównać VCC z wewnętrzną dokładnością odniesienia 1.1v. Wyjaśnienie i kod znajdują się tutaj: https://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/

bpijls
źródło
doskonale, korzystam z baterii atmega i nie byłem w stanie uzyskać wiarygodnej wartości vref. dzięki za opublikowanie tego, to rozwiązało mój problem jak magię!
radhoo
10

Sugestia Shutterdrone jest bardzo dobra, ale brakuje w niej szczegółów, ponieważ sugeruje, że analogowe napięcie odniesienia jest takie samo jak mierzone napięcie (poza założeniem, że używane jest Arduino, co nie jest wyraźnie określone).

Będziesz potrzebował ADC, niezależnie od tego, czy jest on zintegrowany z twoim komputerem, czy też z komponentem zewnętrznym. ADC potrzebuje analogowego napięcia odniesienia (ARef) do porównania wejścia. Nie chcesz, aby ARef był taki sam jak napięcie, które wykrywasz, ponieważ wtedy ADC zawsze zobaczy napięcie wejściowe i odniesienia jako równe, więc wartość analogowa dla wykrywanego napięcia będzie zawsze maksymalna. Potrzebujesz bardzo dokładnego analogowego napięcia odniesienia, które nie zmieni się wraz ze zmianą napięcia zasilania. ADC porówna to napięcie odniesienia z napięciem akumulatora; możesz użyć dzielnika napięcia, aby zmniejszyć wykrywane napięcie akumulatora do zakresu ARef.

Arduino (Atmega8 / 168/328 / etc.) Ma wbudowany ADC i wbudowane analogowe napięcie odniesienia 1.1V, więc jedynymi potrzebnymi komponentami zewnętrznymi są rezystory do dzielnika napięcia. Myślę, że chciałbyś również zastosować bardzo wysokie wartości rezystorów, aby zmniejszyć prąd rozładowania akumulatora.

blalor
źródło
2
Doskonałe punkty - i masz rację, że (niepoprawnie) założyłem Arduino w miksie. =)! c
Shutterdrone