Elektroda.pl
Elektroda.pl
X
SterControl
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][ATmega 8] - Enegrooszczędne liczenie czasu

mily20001 28 Paź 2012 21:02 2079 15
  • #1 28 Paź 2012 21:02
    mily20001
    Poziom 11  

    Mierzenie czasu chciałem zrealizować za pomocą kwarcu zegarkowego i przerwań. Układ chciałem zasilać z dwóch baterii AAA jednak to tylko 3V, więc szybko może spaść poniżej 2,7V. W czym problem?
    1. Co muszę mieć w programie żeby korzystał on z kwarcu zewnętrznego?
    2. Jak powinno wyglądać przerwanie co 1s (najlepiej jakiś przykładowy kod)?
    3. Czy jest jakaś alternatywa dla tych 2 baterii AAA (musi być: nie większe niż dwie baterie AAA i tanie)?

    0 15
  • SterControl
  • #2 28 Paź 2012 23:41
    McMonster
    Poziom 32  

    mily20001 napisał:
    1. Co muszę mieć w programie żeby korzystał on z kwarcu zewnętrznego?

    W programie nic. W opcjach projektu lub makefile lub przełącznikach kompilatora definicję F_CPU (w zależności, czego używasz) i w fusbitach odpowiednie ustawienie dla zewnętrznego taktowania (poszukaj sobie programu MkAvrCalculator).

    Cytat:
    2. Jak powinno wyglądać przerwanie co 1s (najlepiej jakiś przykładowy kod)?

    Tak łatwo znaleźć coś takiego na forum lub w jednym z tysięcy tutoriali w sieci, że aż wstyd o to pytać

    Cytat:
    3. Czy jest jakaś alternatywa dla tych 2 baterii AAA (musi być: nie większe niż dwie baterie AAA i tanie)?

    Atmega8L działa od 2,7 V. Dla pewności możesz użyć np. Atmega88A lub PA, działa od 1,8 V. Albo możesz użyć przetwornicy.

    0
  • #3 29 Paź 2012 07:03
    ZbeeGin
    Poziom 38  

    mily20001 napisał:
    2. Jak powinno wyglądać przerwanie co 1s (najlepiej jakiś przykładowy kod)?

    Wystarczy skonfigurować licznik 2 by pracował z preskalerem 128 i w trybie asynchronicznym, oraz włączyć jego przerwania z przepełnienia. Potem w ISR(TIM2_OVF_vect) umieszczasz to co ma się co sekundę wykonać. Ot, cała filozofia.

    Jeśli się nie boisz wyzwań to do urządzenia bateryjnego proponuję skorzystać z procesora z rodziny MSP430. Różnica w poborze prądu w czasie uśpienia była dość duża pomiędzy ATtiny a MSP430.

    0
  • #4 29 Paź 2012 08:33
    tmf
    Moderator Mikrokontrolery Projektowanie

    M8 i układ energooszczędny to oksymoron. Zmień procesor na nowszy, zastosuj zewnętrzny kwarc zegarkowy 32768 Hz i timer w trybie asynchronicznym - większość AVR ma RTC - real time counter, który służy właśnie do takich celów. W darmowych przykłądach do mojej książki (link w stopce) masz przykłąd wykorzystania timera w trybie asynchronicznym do zliczania czasu. Jednak największa oszczędność będzie wynikała z odpowiedniego napisania reszty programu.
    Co do MSP430 - jeśli chodzi tylko o sam pobór prądu to IMHO nie ma tam nic szczególnego. Piszą, że w RTC mode <1 mikroA, taka XMEGA128A1 ma w tym trybie <0,52 mikroA, a więc dwa razy lepiej (chociaż to na jedno wychodzi). Więc odpowiednio dobrany AVR nie będzie w tym zastosowaniu gorszy, a jednak nie trzeba wchodzić w nową rodzinę.

    0
  • SterControl
  • #5 29 Paź 2012 12:10
    excray
    Poziom 39  

    1. Zredukować częstotliwość taktowania procesora do niezbędnego minimum.
    2. Stosować usypianie o ile możliwe.
    3. Co będzie wyświetlać czas? Bo zaraz okaże się że to co zjada procesor to ułamek w stosunku do tego co zjada wyświetlacz.

    0
  • #6 29 Paź 2012 14:54
    mily20001
    Poziom 11  

    Cytat:
    2. Stosować usypianie o ile możliwe.

    Usypianie czyli? Bo rozumiem że nie chodzi o _delay_ms()

    0
  • #7 29 Paź 2012 15:01
    tmf
    Moderator Mikrokontrolery Projektowanie

    Przeczytaj notę użytego procesora - masz tam rozdział "power management and sleep modes". Jednak projektowanie energooszczędnych aplikacji wykracza daleko poza kwestie usypiania. Określ przede wszystkim jak długo na baterii to ma działać, wybierz odpowiedni procek, zastanów się nad realizacją elektryczną układu, zidentyfikuj żródła strat energii, przemyśl algorytm wg którego ma działać program itd.

    0
  • #8 29 Paź 2012 15:09
    mily20001
    Poziom 11  

    Działać na baterii ma jak najdłużej - myślę że miesiąc czasu mnie zadowoli ale im więcej tym lepiej. Procek - prawdopodobnie ATmega 88V w wersji SMD. Najwięcej prądu będzie zużywało pewnie wyświetlanie wyników obliczeń na dwóch, siedmio segmentowych wyświetlaczach led (wyświetlanie wywoływane przyciskiem). Drugą kwestią jest sprawdzanie stanu przycisku z poziomu Uc. Jak je zrealizować "ekologicznie"?

    0
  • #9 29 Paź 2012 15:24
    tmf
    Moderator Mikrokontrolery Projektowanie

    Nie ma czegoś takiego - działać jak najdłużej. Od przyjętych wymagań co do czasu zależy cała konstrukcja układu i jego realizowalność. Jeśli masz 3 baterie AAA, znasz ich pojemność i chcesz, aby to działało miesiąc to wiesz jaki musi być średni prąd. Powiedzmy, że masz 2X1000 mAh, w dużym uproszczeniu układ powinien pobierać wobec tego dużo poniżej 2,5 mA. To nie jest żaden problem. M88 w trybie uśpienia bierze znacznie mniej. Jedynym limitem jest więc to LED. Chwilka świecenia to dziesiątki godzin czuwania układu! Co do przycisku - M88 ma asynchroniczne przerwania z IO - potrafią one wybudzić MCU z trybu uśpienia.

    0
  • #10 29 Paź 2012 17:20
    mily20001
    Poziom 11  

    Czyli teraz jest tak. Nie mam pojęcia jak zrobić to przerwanie ani którego sleepa użyć. Trochę googlowałem ale niczego ciekawego nie znalazłem.

    0
  • #11 29 Paź 2012 20:56
    kordirko
    Poziom 21  

    Wszystko (no prawie wszystko) jest opisane w datasheet'ie.

    Założenia jak rozumiem są takie:
    - procesor ATmega88 taktowany kwarcem zegarkowym 32kHz

    Tutaj masz datasheet do tego procesora:
    Link

    strona 318 tabela 30-6 - podaje wykres pobieranego prądu dla 32 kHz,
    przy zasilaniu 5 V - 45 µA
    przy zasilaniu 2V - 20 µA
    Jak takie prądy jak wyżej są wystarczające, to nie trzeba używać żadnych przerwań ani trybów sleep.

    Pozostałe tryby wymagają przerwań do obudzenia procesora:
    W trybie idle możesz zejść do prądów w tabeli 30-12 strona 321:
    przy Uzas.=5V - 25 µA
    przy Uzas.=2V - 10 µA

    W trybie power-save prądy opisuje tabela 30-15 strona 324:
    przy Uzas.=5V - 9 µA
    przy Uzas.=2V - 5 µA

    W trybie power-down można by zejść poniżej 1µA, ale tego nie możesz użyć,
    gdyż w tym trybie jest wyłączany oscylator - patrz tabela 10-1 strona 39.
    Bez oscylatora nie działa timer, więc zegar by nie chodził.

    W tej tabeli 10-1 krzyżykami oznaczone jest "Wake-up sources", czyli czym można "obudzić" procesor z tych trybów ----> widać, że jako budzika można użyć tylko przerwania od Timer2 (od Timer0 i Timer1 nie można).

    Szczegóły dotyczące timera2 są opisane począwszy od strony 140.

    Tutaj masz doskonały tutorial na temat timerów w AVR, część 5 opisuje użycie przerwń od timera - ale dobrze jest przeczytać całość, są tam przykłady w języku C dzięki którym można opanować timery:
    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106

    Samo wchodzenie w któryś tryb uśpienia w języku C jest opisane tutaj:
    http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html
    są podane przykłady w C.

    Miłej lektury :)

    0
  • #12 30 Paź 2012 12:58
    excray
    Poziom 39  

    kordirko napisał:
    W trybie idle możesz zejść do prądów w tabeli 30-12 strona 321:
    przy Uzas.=5V - 25 µA

    To daje przy bateriach 1000mAh 1667 dni ciągłej pracy. Nie widzę sensu schodzenia niżej skoro i tak 99,9999% energii z baterii "zeżre" wyświetlacz 4 x LED 7-mio segmentowy. Nawet mimo że włączany tylko na chwilę. Zresztą ten wyświetlacz pasuje do takiego projektu z takimi założeniami jak kamienne koło ratunkowe na basenie.

    0
  • #13 30 Paź 2012 13:32
    94075
    Użytkownik usunął konto  
  • #14 30 Paź 2012 18:34
    dondu
    Moderator Mikrokontrolery Projektowanie

    mily20001 napisał:
    Mierzenie czasu chciałem zrealizować za pomocą kwarcu zegarkowego i przerwań. Układ chciałem zasilać z dwóch baterii AAA jednak to tylko 3V, więc szybko może spaść poniżej 2,7V. W czym problem?

    Baterie litowe mają płaską charakterystykę więc nie tak prędko spadnie: http://mikrokontrolery.blogspot.com/2011/01/bateria-zasila-mikrokontroler-czesc-1.html
    Poza tym, możesz zastosować dodatkową przetwornicę step-up która wyssie baterię prawie do końca np. MCP1623.

    Jak wspomniał tmf, wymagania warunkują docelowy projekt.

    0
  • #15 30 Paź 2012 18:42
    tmf
    Moderator Mikrokontrolery Projektowanie

    Zapewne masz rację, dlatego napisałem, że biorąc pod uwagę sam pobór prądu, bez dodatkowych założeń jest obojętne czy wybierze MSP, czy AVR. Zresztą jak się potem okazało, my tu o jakiś mikroamperach mówimy, a autor nam przywalił wyświetlaczem LEDowym:)

    0