Jak mogę sprawić, aby moja atmega328 działała przez rok na bateriach?


51

Scenariusz

Stworzyłem ładny elektroniczny zamek do mojego pokoju w akademiku. Obecnie jest to Arduino Diecimila z serwomechanizmem [odblokowującym] drzwi. Posiada klawiaturę numeryczną z przyciskami 3x4 i 5 diodami LED (2 pary serii i jedna pojedyncza dioda LED). Obecnie działa również na ładowarce do telefonu komórkowego.

Teraz przeprojektowałem go, aby działał na samodzielnym Arduino (ATmega328), ale naprawdę chciałbym, aby działał na bateriach AA lub nawet na baterii 9 V.

Jeśli chodzi o część oprogramowania, doszedłem do wniosku, że mogę sleepwywoływać określone czasy w metodzie pętli, aby utrzymać zużycie energii ATmega na jak najniższym poziomie. I niech diody LED „zaczną migać” z możliwie jak najdłuższym czasem wyłączenia.

Pytanie 1

Kiedy przycisk zostanie naciśnięty w ciągu kilku milisekund, które śpi tablica, czy będzie on „pamiętany” / „trzymany”, dopóki nie wyjdzie ze snu, a następnie zostanie podniesiony jako naciśnięcie przycisku?

Jaki byłby najlepszy sposób obsługi tego naciśnięcia przycisku w trybie uśpienia? Czy mogę go zakodować, aby obudzić się po naciśnięciu przycisku, czy muszę po prostu pozwolić mu spać przez np. 10 m. w każdej pętli?

pytanie 2

Jak podejdę do matematyki obliczania, ile baterii AA jest potrzebnych do działania tego urządzenia przez 10 miesięcy?

Nie wiem też, jak zmierzyć średnie zużycie energii na minutę, ponieważ zmienia się ono szybko itp.

Urządzenie

Moje urządzenie do blokowania drzwi

Odpowiedzi:


35

Atmega328 zapewnia sześć trybów oszczędzania energii, uporządkowanych od minimalnego do doskonałego (szacowane zużycie prądu z tego postu na forum ):

  • SLEEP_MODE_IDLE: 15 mA
  • SLEEP_MODE_ADC: 6,5 mA
  • SLEEP_MODE_PWR_SAVE: 1,62 mA
  • SLEEP_MODE_EXT_STANDBY: 1,62 mA
  • SLEEP_MODE_STANDBY: 0,84 mA
  • SLEEP_MODE_PWR_DOWN: 0,36 mA

Cytując oryginalne pytanie:

Pomyślałem, że mogę sleepwywoływać określone czasy w metodzie pętli

Musisz użyć sleep_cpu()po skonfigurowaniu wymaganego trybu uśpienia z powyższej listy. W Arduino Playground znajduje się przydatny post na ten temat .

Aplikacja musi być sterowana przerwaniami, intensywnie korzystać z powyższych trybów uśpienia i budzić procesor po naciśnięciu przycisku, przepełnieniu timera i zdarzeniu watchdoga, aby faktycznie wykonać zadania.

Dodatkowe oszczędności energii można uzyskać, wykonując następujące czynności:

  • Użyj wewnętrznego oscylatora mikrokontrolera i niskiej częstotliwości taktowania (8 MHz zamiast 16) - ale upewnij się, że kod związany z czasem i taktowaniem nadal działa zgodnie z oczekiwaniami. W tym celu może być potrzebna inna wersja programu ładującego.
  • Unikaj długotrwałego włączania diod LED, jeśli aplikacja ich używa. Zastosowanie szybkiego podwójnego lub potrójnego błysku o krótkim czasie trwania (0,05 sekundy wł., 0,5 sekundy wył.) Z przerwami w odstępach między sekundami, zapewnia zauważalne wskazanie przy minimalnym zużyciu energii
  • Użyj regulatora przełączającego zamiast liniowego, jeśli wymagany jest regulator.
  • Uruchom mikrokontroler przy niższym napięciu, jeśli jest obsługiwane, 3,0 V (np. Ogniwo litowe CR2032, nie wymaga regulatora) lub 3,3 V zamiast 5 V.
  • Postępuj zgodnie z zaleceniami w arkuszu danych dotyczących nieużywanych ustawień pinów wejściowych i wyjściowych, aby zminimalizować straty mocy.

Uwzględnienie tych sugestii pozwala na uruchamianie aplikacji mikrokontrolera przez kilka tygodni lub miesięcy na pojedynczej komórce CR2032, a przez lata na komórce litowej typu LR123. Oczywiście przebieg może się różnić w zależności od czujników, mocy wyjściowej i faktycznego przetwarzania wymaganego przez aplikację.

Kilka przydatnych odniesień:


Z mojego doświadczenia wynika, że ​​w SLEEP_MODE_PWR_DOWN możesz obniżyć go do 0,1 uA do 6,0 uA, jeśli sprytnie podchodzisz do wyłączania wszystkich drobiazgów (takich jak wykrywanie braku prądu). Stworzyłem kompilacje, które zużywają mniej niż 60uA i które trwają 3-5 lat na zestawie alkalicznych baterii AA.
Tim Eckel

@TimEckel Mam bzika na punkcie wskazywania statusu za pomocą diod LED - to zużywa budżet mocy, jakby wychodził z mody.
Anindo Ghosh

3
Nie musi. Używaj diod LED o dużej mocy i wysokiej rezystancji. Użyje ułamka mA zamiast ponad 20 mA. Ponadto, migaj diodę LED stanu przez 5-15 ms co kilka sekund, zamiast ciągle świecić. Miałem tanią diodę LED z przyciemnieniem, która używała 30 mA, zmieniłem ją na diodę LED o dużej mocy z rezystorem 3,3 k Ohm, który błyskałem przez 15 ms co 8 sekund. Poszedł z 30 mA do 2,9 uA średniego prądu, 1/1000 mocy!
Tim Eckel

4
@TimEckel Wyraźnie nie rozumiesz zakresu mojej pasji do mrugających świateł :-D To nie tak, że chcę zmniejszyć intensywność, lubię te małe rzeczy błyszczące jak płomienie Hadesa, budżet mocy powinien być przeklęty! Mówiąc poważniej: jestem świadomy tych małych sztuczek i tak naprawdę zaprojektowałem kilka własnych, które zwiększają wizualny wpływ alarmu, jednocześnie zmniejszając moc poprzez diody LED. Ten poprzedni komentarz był ( tylko częściowo ) żartem, aby przejść do wielu zabawnych pytań LED, na które tutaj odpowiadam .
Anindo Ghosh

3
Zmierzyłem zużycie energii przez ATMega328P przy różnych napięciach i częstotliwościach i zrobiłem ten wykres docs.google.com/spreadsheets/d/…
Cano64

19

Mam teraz Arduino Pro Mini na biurku, który wyczerpuje 2 baterie AA i może działać przez ponad rok, jeśli to konieczne.

Osiągnęły to trzy aspekty projektu.

1. Inny regulator

Używam regulatora doładowania LTC3525. Ma bardzo niski prąd spoczynkowy (7uA) i wysoką wydajność (> 90% przy 0,2 mA). Coś takiego jak ta deska Sparkfun https://www.sparkfun.com/products/8999 powinno wykonać podobną pracę. Pamiętaj, aby podłączyć go do styku 5 V Arduino, a nie VIN, aby regulator Arduino nie był używany.

2. Sleeeeeeep

Odsetek czasu, w którym urządzenie jest aktywne, będzie niewielki. Przez resztę czasu urządzenie powinno spać w SLEEP_MODE_POWER_DOWN. Możesz oprzeć swoje procedury snu na bibliotece Rocketscreem Low Power Library . Zgodnie z tym linkiem powinieneś być w stanie obniżyć go do 1,7uA przy wyłączonym ADC, BOD i WDT oraz w trybie wyłączania zasilania.

3. Przerwania

Druga połowa snu to przerwy, aby się obudzić. W trybie uśpienia z wyłączaniem tylko przerwania poziomu na INT1 i INT2, dopasowanie TWI, a WDT go obudzi. Musisz mieć przycisk podłączony do INT1 lub INT2, aby naciśnięcie przycisku go obudziło.

Inne rzeczy:

Wyłącz wszystkie diody LED, chyba że jest to absolutnie konieczne. Jeśli zamek znajduje się w pomieszczeniu, diody LED nie muszą być jasne, oszczędzając więcej energii. Również, jeśli potrzebujesz, aby MCU regularnie wykonywał jakieś zadania, używaj timera nadzorującego, aby okresowo je budzić.

Edytować:

Jedną z metod, która może działać, jest użycie powyższej biblioteki Low Power i uśpienie przez około 60 ms w każdej pętli dzięki zegarowi nadzorującemu. Po przebudzeniu sprawdź przycisk. Funkcja do wywołania to

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

Wszystkie te komentarze są na miejscu. Chciałbym dodać jeszcze kilka sugestii:

1) W przypadku diod LED należy stosować diody LED o wysokiej mocy 20 mA. Oto logika. Powiedzmy, że chcesz mieć przyciemnioną diodę LED stanu, która miga co 8 sekund. Nie chcesz, aby było jasne, więc używasz losowej diody LED. Problem polega na tym, że przyćmiona dioda LED nadal pobiera prąd o wartości 20 mA (lub więcej) tylko 100 mcd. Zamiast tego, otrzymaj diodę LED o wysokiej mocy wyjściowej, która nadal ma wartość znamionową 20 mA, ale może wysyłać 4000 mcd (upewnij się, że patrzysz na kąt wyjściowy, prawdopodobnie prawdopodobnie będzie to 30 stopni lub więcej). Dzięki tej diodzie LED 4000 mcd łączysz ją z rezystorem 3,3 k Ohm i otrzymujesz około 100 mcd mocy wyjściowej, ale zużywasz mniej niż 1 mA. Zamiast więc używać 20 mA dla diody LED stanu, używasz ułamka pojedynczego mA. Zazwyczaj ustawiam też błysk LED stanu na czas tylko 5-15 ms, co może również zaoszczędzić dużo energii, jeśli wcześniej miałeś błysk na 100 ms.

2) Moim wyborem regulatora napięcia jest Microchip MCP1700. Zużywa jedynie 1,6 µA prądu spoczynkowego i jest bardzo tani (około 0,30 USD w małych ilościach). Jedynym ograniczeniem jest to, że maksymalne napięcie wejściowe wynosi tylko 6 woltów, więc nie można użyć baterii 9 woltów. Jest jednak idealny do 4 baterii AA, pojedynczego ogniwa LiPo lub dwóch ogniw litowych.

3) Do zasilania obwodu ATmega 4 bateriami AA zwykle używam diody 1N4001 na VCC, aby zrzucić maksymalnie 6 woltów z 4 baterii do 5,5 wolta. Ponadto dioda chroni ATmega przed napięciem wstecznym, więc służy dwóm użytecznym celom. W ten sposób mogę stworzyć obwód zasilany z baterii, który może zużywać zaledwie 0,1 µA podczas snu, ponieważ przez cały czas nie ma regulatora napięcia pochłaniającego prąd.


8

Zrobiłem test na gołej atmega328P-PU na płycie chleba przy użyciu biblioteki RocketScream LowPower

Użyłem tego szkicu:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

Z uCurrent Gold zmierzyłem 7,25 uA w trybie wyłączenia zasilania.


1
Miły! Spróbuję tego jak najszybciej. Czy pozwala to na eksploatację atmega238 przez lata z baterią CR2032?
Basj

6

Są tutaj dwa pytania, ale tylko drugie jest tak naprawdę częścią tytułu pytania, więc prawdopodobnie lepiej będzie, jeśli otworzysz kolejne pytanie dotyczące programowania Arduino. Odpowiem na drugie pytanie tutaj.

Pojedyncza alkaliczna bateria AA 1,5 V ma pojemność około 2600 mAh. Jeśli wybierzesz baterie litowe, możesz uzyskać około 3400 mAh, jeśli masz szczęście. Przyjmijmy tę liczbę za punkt odniesienia dla absolutnie najlepszego przypadku.

Metodą obliczania teoretycznego maksymalnego czasu pracy obciążenia jest po prostu pojemność podzielona przez obciążenie. Jeśli twoje obciążenie wynosi 1 mA, możesz je uruchomić przez 3400/1 = 3400 godzin = 141 dni = ~ 5 miesięcy. Jest to jednak tylko teoretyczne maksimum , ponieważ w tym czasie zaczniesz odczuwać znaczne obniżenie napięcia o około 65%. Jeśli regulujesz moc wyjściową, uzyskasz efekt niekontrolowanego obniżenia napięcia akumulatora, tym wyższy prąd potrzebny do utrzymania regulowanego napięcia, który szybciej rozładuje akumulator. Byłbym zaskoczony, jeśli można uzyskać z niego ponad 80% reklamowanej pojemności przy napięciu wystarczająco wysokim, aby uruchomić urządzenie.

Powiedzmy, że 80% tego czasu dostajesz po spadku napięcia i nieefektywności regulatora. Zakładamy, że pracujesz przy napięciu 3,3 V z trzech akumulatorów połączonych szeregowo. Nadal zapewni to tę samą pojemność, ale napięcie będzie wystarczające dla regulatora. Jeśli twoje urządzenie działa przy 15 mA (to dość ostrożne oszacowanie), liczby będą wyglądać następująco:

  • Pojemność po wydajności 80% = 3400 * 0,8 = 2720 mAh
  • Czas = 2720/15 = 181 godzin = 7,54 dni

Potrzebowałbyś więc około 144 baterii litowych (48 zestawów po 3), aby móc pracować przez rok. Nie zbyt dobrze!

Zamiast tego sugerowałbym użycie regulowanego zasilania DC z sieci. Może być dołączony zapasowy akumulator, który można łatwo skonfigurować za pomocą przekaźnika SPDT - wystarczy podłączyć cewkę do sieci prądu stałego i podłączyć styk „off” do akumulatora. W przypadku awarii prądu stałego styk spada, a zamiast tego używana jest bateria.


Moje marzenia bezprzewodowe są zmiażdżone;) Dzięki za szczegółową odpowiedź. To również wydawało mi się najlepszą opcją.
LouwHopley,

Przypadkowo to samo pytanie zadałem sobie przy projektowaniu elektronicznego zamka do drzwi. Nawet z grubą baterią 10 000 mAh nie było tego warte. Skończyło się na tym, że użyłem zasilacza DC 250mA i starej baterii telefonu komórkowego jako kopii zapasowej.
Wielomian

4
Średnia 15 mA nie wydaje mi się zbyt konserwatywna! 328 może pracować na jednocyfrowych mikroampachach w trybie uśpienia, a na pewno możesz uciec od posiadania go przynajmniej częściowo w głębokim śnie. Również przy niskich częstotliwościach (np. 0,5 MHz) można uzyskać przy <1 mA w trybie aktywnym. Oczywiście inne elementy (regulatory napięcia itp.) Muszą być dobrane odpowiednio do natury niskiej mocy.
exscape

4
@Polynomial Nie przyjrzałem się dokładnie schematowi, ale na pewno projekt mógłby zostać zbudowany bez „diody LED zasilania”. Lub możesz go mrugnąć, aby był włączony np. Przy połowie jasności (przez PWM), tylko powiedzmy 25 ms co 2 sekundy, tak że obecne użycie
spadłoby

1
Arduino jest głodny władzy. Zbudowanie własnej tablicy rozwiązałoby to. Atmega328 pobiera 0,2 mA, gdy 32 kH i 0,75 uA w trybie oszczędzania energii.
Vorac

4

Coś, o czym nikt jeszcze nie wspomniał: musisz mieć sposób na wyłączenie zasilania + 5 V zasilającego serwomechanizm, gdy go nie używasz. Nawet gdy się nie porusza, serwo nadal będzie czerpać moc.

FET z bramką kontrolowaną przez pin we / wy z arduino to dobry sposób na zrobienie tego.


Zazwyczaj używam 2N3904 dla każdego czujnika lub czegokolwiek, aby go włączyć / wyłączyć. Lub, jeśli czujnik ma niskie napięcie i to samo napięcie, co w ATmega, po prostu używam pin bezpośrednio do kontrolowania stanu zasilania.
Tim Eckel

1
Użyj 2n7000, aby zużyć znacznie mniej energii niż 2n3904 i nie potrzebujesz rezystora bazowego.
John Meacham,

3

Możesz rozważyć użycie mikrokontrolera, który jest specjalnie zoptymalizowany pod kątem niskiego zużycia energii do następnego projektu. Dla niskiego zużycia energii konieczne jest, aby podczas snu pobierać bardzo małą moc. Często pomijane jest to, jak ważne jest, jak szybko może się obudzić z tego snu.

Liczy się to, ile ładunku potrzeba z najgłębszego snu, aby jak najszybciej poradzić sobie z przerwaniem (ponieważ wybuch mocy będzie wtedy bardzo krótki) i wrócić do snu.

Jednym z przykładów takiego mikrokontrolera jest MSP430 z Texas Instruments. Na ich stronie internetowej znajduje się nota aplikacyjna, jak oszczędzać energię i aplikacje do pozyskiwania energii.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.