Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięMikrokontroler i dłuższe działanie z zasialniem bateryjnym
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
Chciałbym zmaksymalizować czas pracy attiny2313 przy zasilaniu baterią 9V + stabilizator 7805. Do attiny będzie dołączony czujnik temperatury ds1820 i wyświetlacz LCD 2x16 bez podświetlenia. Czas pomiędzy odczytami temperatury planowałem na około 1 min. Dobrze by było w czasie nieaktywnym usypiać attiny i oczywiście odłączać czujnik temperatury. Z odłączaniem czujnika jest prosto, ale nie wiem jak uśpić mikrokontroler. Może również coś da się zaoszczędzić na wyświetlaczu
Zamiast czujnika na 1-wire lepszy byłby np na I²C - w tym przypadku możesz dowolnie w dół zmniejszyć częstotliwość pracy mikrokontrolera, co przyczyni się do znaczącego spadku poboru prądu. LCD2x16 nie jest najlepszym rozwiązaniem, na nim zbytnio nie oszczędzisz prądu. Lepszy byłby zwykły "szkiełkowy" LCD z jakimś energooszczędnym sterownikiem, ewentualnie zmiana procka na jakiś z grupy LCD AVR.
Hint : IDLE, POWERSAVE, POWERDOWNale nie wiem jak uśpić mikrokontroler.
ChwalebneChciałbym zmaksymalizować czas pracy attiny2313
Pobór prądu przez DS18B20 jest znikomy zwłaszcza, że włączasz go tylko na krótkie chwile, raz na minutę. Przy okazji zwróć uwagę na zakres napięć zasilania: 3.0...5.5V. Czyli w razie potrzeby zadziala również przy 3.3V.dołączony czujnik temperatury ds1820
Przestępstwo przeciwko trwałości baterii. Ścigane z urzędu.przy zasilaniu baterią 9V + stabilizator 7805.
7805 pobiera na własne potrzeby przeciętnie 4 .. 4.5mA. Nawet przy zerowym obciążeniu!
Ponadto wymaga spadku napięcia między wejściem a wyjściem co najmniej 1.7..2..2.5V (zależnie od producenta). Ogniwa alkaliczne opłaca się eksploatować nawet do 0.9V/ogniwo czyli w tym wypadku 5.4V/baterię. Stosując 7805 nie wykorzystasz baterii do końca a większość energii i tak puścisz w gwizdek.
Poszukaj jakiegoś oszczędnego stabilizatora LDO (low drop..). Jako pierwszy z brzegu przyszedł mi do głowy np. L4949 (STM), ale powinieneś znaleźć również inne. Jeżeli wybrany stabilizator będzie miał wejście ShutDown to również da się je z pożytkiem wykorzystać w projekcie.
Poza tym ogniwa alkaliczne 9V mają wyjątkowo niekorzystny wskaźnik cena/energia. Już bardziej opłaca się zastosować dwa ogniwa alk. AA lub AAA (1.8...3.0V) i podnosić napięcie do wymaganego poziomu 3.3 lub 5.0V.
wyświetlacz LCD 2x16 bez podświetlenia.
(...)
Może również coś da się zaoszczędzić na wyświetlaczu
Wyświetlacze alfanumeryczne z HD44780 i podobnymi potrzebują zasilania prądem kilku mA przy typowym zasilaniu Vcc=5V. Niektóre ze stosowanych w nich kontrolerów LCD pracują również przy zasilaniu 3.3V, ale wtedy do uzyskania sensownego kontrastu trzeba przyłożyć ujemne napięcie polaryzującego Vlcd, co trochę komplikuje układ Choć nie jest też specjalnie trudne - wymaga poświęcenia dodatkowego ICL7660 i dodatkowych kilkuset uA z zasilania.
Konkurencyjnie możesz użyć w projekcie wyświetlacza graficznego z telefonu komórkowego. Taniutki obecnie LCD z Nokii 3310 pobiera zaledwie 300uA przy zasilaniu 3.3V.
Oszczędzanie poboru mocy przez mikrokontroler może mieć 4 formy:Czas pomiędzy odczytami temperatury planowałem na około 1 min. Dobrze by było w czasie nieaktywnym usypiać attiny i oczywiście odłączać czujnik temperatury. Z odłączaniem czujnika jest prosto, ale nie wiem jak uśpić mikrokontroler.
- Wybór oszczędnego uC. Np. MSP430. Aczkolwiek obecnie o prawie każdym współczesnym mikrokontrolerze da się powiedzieć, że przy mądrze dobranych warunkach pracy będzie oszczędny.
- Obniżanie napięcia zasilania. Np. przez zrezygnowanie z Vcc=5.0V na rzecz Vcc=3.3V. Na przeszkodzie mogą stanąć potrzeby urządzeń peryferyjnych (np. wspomniane LCD)
- Spowalnianie taktowania do granic możliwości. W zastosowaniach-niewiele-robiących udaje się czasem pogonić uC nawet z kwarcu zegarkowego (2^16Hz). W twoim przypadku do liczenia masz wprawdzie niewiele, ale zarazem napotkasz twarde ograniczenie w postaci reżimu czasowego dyktowanego przez 1-wire. Jednak nie opłaca się również tracić pary na najszybszy zegar jaki tylko może znieść dany uC.
- Wprowadzanie mikrokontrolera w stan obniżonego poboru mocy.
Nie problem uśpić uC. Problemem może być znalezienie sensownego źródła zdarzeń, które ten uC wybudzą ze stanu uśpienia.
Zazwyczaj masz do wyboru kilka trybów usypiania uC - od "płytkiej drzemki", gdy uC zachowuje większość funkcji życiowych (np. zamiera tylko wykonywanie kodu przez CPU, ale pozostają działające liczniki/timery i zdolność do przyjmowania przerwań), aż do stanu "śmierci klinicznej" wymagającej reanimacji w postaci twardego RESET-u lub wyłączenia i ponownego załączenia zasilania.
Usypianie ATTiny2313 znajdziesz w karcie katalogowej w rozdziale "Power Management
and Sleep Modes" (coś ok. str. 33).
Wprowadzanie uC w stany głębokiego uśpienia (pobór prądu rzędu pojedynczych uA) ma sens, gdy jednocześnie da się zredukować do podobnego poziomu pobór mocy przez pozostałe urządzenia peryferyjne. W tym również przez układ zasilania (po co walczyć o uA na uC skoro sam stabilizator nieprzerwanie pochłania mA ?)
Niedocenianym źródłem strat energii może być również samorozładowanie ogniw. Do odbiorników o bardzo małym średnim poborze mocy i długim oczekiwanym czasie życia najlepiej kwalifikują się jednorazowe ogniwa litowe. Cynkowe alkaliczne (zwłaszcza porządnych firm) są Ok. Akumulatory litowo-jonowe mogą być - pod warunkiem, że utrudnienia związane z ładowaniem nie przekroczą ew. korzyści (duża gęstość energii, powolne samorozładowanie). Akumulatory niklowe (Ni-Cd, Ni-MH) w takich zastosowaniach zupełnie nie mają sensu.
Zastanów się nad takimi koncepcjami:
0) Pozostając przy bateryjce 9V, po pierwsze zastosować stabilizator LDO z małym poborem prądu na potrzeby własne.
1) Obniżyć napięcie zasilania do 3.3V (zyskując m.in. mniejszy pobór prądu przez uC). Jako LCD użyć modułu z telefonu GSM.
2a) Po wykonaniu pomiaru i wystawieniu wyniku na LCD ustawić timer na odliczanie opóźnienia 1min i wprowadzić uC w teryb SLEEP (z zachowaniem działającego timera i wybudzania w wyniku przerwania od tegoż timera)
2b) Po wykonaniu pomiaru i wystawieniu wyniku na LCD wprowadzić uC w stan PowerDown (czyli stan "smierci klinicznej" z poborem prądu na poziomie 1uA ) a wybudzenie go powierzyć prostemu ale możliwie oszczędnemu generatorowi generującemu przebieg z okresem ok. 1min cyklicznie RESETujący uC.
Co jako dodatkowy generator wybudzający? CMOSowa wersja 555? Układ generatora astabilnego na bramce 4093? Albo poszukaj w układach D.Johnsona na http://www.discovercircuits.com - przewija się tam kilka _naprawdę_energooszczędnych_ perełek.
3) Zamiast baterii 9V użyć dwóch tańszych ogniw AA i podwyższać napięcie do 3.3V lub 5.0V za pomocą przetwornicy step-up (np. TPS61040 (TI) ). Oszczędzisz na kosztach baterii.
4) Jeżeli urządzenie nie musi pokazywać wyniku non-stop a jedynie na życzenie, to możesz wykonać pomiar, pokazać go na wyświetlaczu np. przez 1min. po czym wyłączyć _wszystko_ za pomocą wejścia SHDN na stabilizatorze (ustawiasz SHDN stabilizatora i w następnym kroku wprowadzasz uC w stan PowerDown).
Do ponownego uruchomienia potrzeba będzie zdarzenia zewnętrznego w postaci wciśnięcia przycisku przez użytkownika. Wciśnięty przycisk uruchamia zasilanie a następnie uC samodzielnie podtrzymuje je aż do zakończenia pomiaru i prezentacji wyniku.
W ten sposób można ograniczyć sumaryczny pobór prądu w czasie bezczynności do pojedynczych uA a żywotność baterii wydłużyć do granic absudru
--
MDz
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
Dzięki poradom użyłem baterii AA i podwajacza napięcia ICL7660. Wydajność prądowa nie jest zbyt duża ale do poprawnej pracy wystarczy. Mam jednak pewną wątpliwość z wykorzystaniem watchdoga i usypianiem mikrokontrolera. Maksymalny czas watchdoga to około 2 sek, dla mnie optymalny byłby 1 min. Zatem, aby osiągnąć ten czas wykorzystałem zapis zmiennej w eppromie (aby uniknąć kasowania zmiennych przy resecie). Fragment wygląda następująco:
Całość działa na Atmedze8.
Obawiam się jednak, ilości cykli zapisu w pamięci epprom (wynosi ona ponad 100 tys. cykli), przy zapisie wartości co 2 sek, da to czas pracy około 55 godzin - u mnie i tak już pracuje dłużej ale nie wiem czy długo to potrwa. Moje pytanie jest takie - czy jest jakiś inny sposób na wydłużenie czasu uśpienia mikrokontrolera, może jakaś inna forma zapisu zmiennych ?
Kod: Zaznacz cały
$eeprom
Label:
Data 1
$data
Dim A As Byte
Config Watchdog = 2048
Stop Watchdog 'reset wystąpi po 2048ms
Do
Readeeprom A , Label
If A >= 30 Then
A = 0
...
End If
A = A + 1
Writeeeprom A , Label
Start Watchdog
Powerdown
Loop
End
Obawiam się jednak, ilości cykli zapisu w pamięci epprom (wynosi ona ponad 100 tys. cykli), przy zapisie wartości co 2 sek, da to czas pracy około 55 godzin - u mnie i tak już pracuje dłużej ale nie wiem czy długo to potrwa. Moje pytanie jest takie - czy jest jakiś inny sposób na wydłużenie czasu uśpienia mikrokontrolera, może jakaś inna forma zapisu zmiennych ?
100 tys, to jest wartosc gwarantowana przez producenta, rownie dobrze moze wytrzymac 150... 200... 300 tys. Jednak liczenie ze wytrzyma jest naciaganiem szczescia.
1). zapisuj pod roznymi adresami eprom np. co 100 tys zmieniaj <- joke
2) a moze by tak wykozystac timer 16 bitowy + preskaler 1024 + idle?? Do tego maksymalnie zmniejszyc taktowanie procka (samo nizsze taktowanie juz da oszczednosc energii).
1). zapisuj pod roznymi adresami eprom np. co 100 tys zmieniaj <- joke
2) a moze by tak wykozystac timer 16 bitowy + preskaler 1024 + idle?? Do tego maksymalnie zmniejszyc taktowanie procka (samo nizsze taktowanie juz da oszczednosc energii).
A kto Ci powiedział , że reset proca powoduje kasowanie zmiennych... Maksymalny czas watchdoga to około 2 sek, dla mnie optymalny byłby 1 min. Zatem, aby osiągnąć ten czas wykorzystałem zapis zmiennej w eppromie (aby uniknąć kasowania zmiennych przy resecie).
Jeśli nie chcemy by procedura rozruchowa zerowała SRAM , to "nakazujemy" kompilatorowi , by takowego kodu nie generował i tyle.
Fragment może wyglądać następująco:
Kod: Zaznacz cały
$regfile = "m8def.dat"
$noramclear
Dim A As Byte
If Mcucsr.porf = 1 Then
A = 0 'ten kod zostanie wykonany TYLKO po włączeniu zasilania i ...
Reset Mcucsr.porf '... żaden inny reset , nie spowoduje wyzerowania zmiennej A
End If
Config Watchdog = 2048
Stop Watchdog 'reset wystąpi po 2048ms
Do
If A >= 30 Then
A = 0
...
End If
A = A + 1
Start Watchdog
Powerdown
Loop
End
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
Do tamtego projektu użyłem podwajacza napięcia ICL7660 - wprawdzie ma małą wydajność prądową, ale wystarczył. Chciałbym jednak jakiś układzik (najlepiej w normalnej cenie), który by z dwóch akumulatorków AA zrobił 5 V i miał większą wydajność prądową niż ICL7660, pewnie potrzebna będzie jakaś ceweczka ale to nie problem.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości