poniedziałek, 4 kwietnia 2011

SmartPIP: Czujnik światła - oszczędzamy energię


Autor: Dondu

Artykuł jest częścią cyklu: SmartPIP - Elektroniczny dręczyciel


Pamiętasz, jak brzmi nasze główne motto?:

Oszczędzamy energię "na maksa"!

Mamy już wybrany schemat układu zamiany światła otoczenia na napięcie wraz z wartościami elementów, który zostałby podłączony do mikrokontrolera na przykład tak:




Pinem pomiarowym będzie więc pin ADC1 (PC1).

Czy można jednak na tym fragmencie schematu SmartPIP'a, zaoszczędzić trochę energii?
Można i należy to zrobić!


1. Odłączamy zasilanie czujnika 

W naszym układzie czujnika, gdy fototranzystor będzie dobrze oświetlony, prąd pobierany przez czujnik będzie wynosił nie więcej niż 10µA niezależnie od tego, czy w danym momencie dokonujemy pomiaru, czy też mikrokontroler śpi w najlepsze.

W okresie letnim przez większą część doby w pomieszczeniu będzie jasno (słońce w dzień, a światło sztuczne wieczorem). Zimą z reguły proporcja czasu, gdy w pomieszczeniu jest jasno do czasu, gdy jest w nim ciemno będzie oczywiście inna (z reguły mniejsza), ale i tak w znacznej części doby w pomieszczeniu będzie jasno.

Oznacza to, że czujnik przez znaczną część doby będzie zużywał energię pomimo, że z niego korzystać będziemy raz na kilka minut.

Wniosek: Warto wyłączać czujnik, gdy nie jest używany, ponieważ to zbędny pożeracz energii :-)

Zgodnie z założeniami projektu, mamy minimalizować ilość użytych elementów elektronicznych, a także wielkość i koszt urządzenia. W związku z tym, najprostszym rozwiązaniem jest wykorzystanie pinu mikrokontrolera, jako klucza włączającego i wyłączającego zasilanie czujnika.

Możemy sobie na to pozwolić, ponieważ czujnik pobiera zaledwie 10µA, a pin tego mikrokontrolera, może spokojnie dostarczyć 20mA, a nawet 40mA.


Schemat może wyglądać więc na przykład tak:




Czyli aby włączyć czujnik ustawimy pin PC0 jako wyjście i ustawimy na nim stan wysoki, czyli jedynkę logiczną.

Powinniśmy sobie jednak zadać pytanie, jaki będzie faktyczny poziom napięcia zasilania czujnika, gdy pin mikrokontrolera będzie miał ustawioną jedynkę logiczną, zasilając w ten sposób nasz układ pomiarowy?

Zerkamy do datasheet do tabelki z parametrami elektrycznymi pinów i odnajdujemy odpowiedni parametr:




W naszym przypadku (zasilanie z 3V) tabelka DC Characteristics informuje nas, że możemy się spodziewać co najmniej 2,2V, ale niestety nie jest podane ile typowo powinno być. Jednakże zauważamy, że parametr ten podany jest dla prądu pinu wynoszącego aż 10mA. W naszym przypadku mamy prąd 1000 razy mniejszy, bo zaledwie 10µA.

Intuicja mówi nam, że powinniśmy poszukać bardziej szczegółowej informacji. Zaglądamy więc do części z wykresami, gdzie znajdujemy wykres zależności napięcia od prądu, dla pinu ustawionego jako wyjście z jedynką logicznym (source current), przy zasilaniu 3,0V:




Okazuje się więc, że dla naszego prądu 10µA, na wyjściu pinu otrzymamy nie 2,2V, ale pełne 3,0V, co jest dla nas bardzo istotne i oznacza, że przy takim prądzie pin działający jako klucz włączający zasilanie czujnika spełni swoją rolę "idealnego klucza"  i nie będzie wprowadzał zmian do naszych obliczeń.

Algorytm pomiaru będzie więc następujący:
  1. włączamy czujnik ustawiając pin PC0 jako wyjście i podajemy na niego jedynkę logiczną,
  2. czekamy chwilkę na ustabilizowanie się napięcia na kondensatorze,
  3. dokonujemy pomiaru pinu ADC1,
  4. po zakończonym pomiarze wyłączamy czujnik poprzez ustawienie pinu w stan wysokiej impedancji, czyli jako wejście z wyłączonym rezystorem pull-up.

W ten sposób będziemy włączać czujnik tylko wtedy, gdy jest nam potrzebny, minimalizując straty energii z baterii.






2. Odłączamy rezystor 

Można coś jeszcze zaoszczędzić?
Zastanówmy się co się dzieje z energią zgromadzoną w kondensatorze, gdy zakończyliśmy pomiar i  wyłączyliśmy zasilanie czujnika:




Prosta sprawa - wredny rezystor rozładuje nam kondensator :-)

Co to oznacza?

Za każdym razem (z wyjątkiem ciemności), będziemy ponownie ładować kondensator od zera, a po dokonaniu pomiaru rezystor nam go rozładuje. To znowu duża strata!

Jeżeli więc damy radę przechować chociażby część ładunku w kondensatorze, to będzie to zyskiem zmniejszającym zużycie ładunku baterii.

Co należy zrobić, by rezystor nie rozładowywał nam kondensatora do zera? Trzeba go odłączyć, a możemy zrobić to podobnie jak z zasilaniem czujnika, czyli wykorzystać następny pin mikrokontrolera:





W ten sposób w czasie, gdy wyłączymy zasilanie oraz masę rezystora, nie będzie on rozładowywał kondensatora.


UWAGA!

W dalszej części tego cyklu artykułów będziemy posługiwać się powyższym schematem, ale narysowanym nieco inaczej:


Jeżeli się przyglądniesz, ten i poprzedni schemat są dokładnie takie same.


Podobnie jak w przypadku odłączania zasilania czujnika, także i w tym przypadku powinniśmy sobie zadać pytanie, jaki będzie faktyczny poziom napięcia na pinie sterującym rezystorem, gdy pin ten będzie miał ustawione zero logiczne, czyli zwierał rezystor do masy?

Zerkamy do datasheet do tej samej tabelki z parametrami elektrycznymi pinów i odnajdujemy parametr:




W naszym przypadku (zasilanie z 3V) tabelka DC Characteristics informuje nas, że możemy się spodziewać aż 0,6V. Skoro aż tyle, to nasze obliczenia wykonane powyżej należałoby skorygować. Ponownie zauważamy, że parametr ten podany jest dla prądu pinu wynoszącego aż 10mA, a w naszym przypadku mamy przecież prąd 1000 razy mniejszy.

Po nabraniu doświadczenia z punktu 1 wiemy, że powinniśmy poszukać bardziej szczegółowej informacji na wykresach. Znajdujemy więc wykres dla pinu I/O ustawionego jako wyjście z zerem logicznym (sink current), przy zasilaniu 3,0V:




Ponownie okazuje się, że dla naszego prądu 10µA, na wyjściu pinu nie będziemy mieli spodziewanego 0,6V, ale 0V, co jest dla nas bardzo istotne i oznacza, że przy takim prądzie pin działający jako klucz włączający masę, nie będzie wprowadzał zmian do naszych obliczeń.

Uzupełniamy nasz algorytm pomiaru:
  1. włączamy czujnik ustawiając pin PC0 jako wyjście i podajemy na niego jedynkę logiczną,
  2. włączamy masę rezystora ustawiając PC2 jako wyjście i podajemy na niego zero logiczne,
  3. czekamy chwilkę na ustabilizowanie się napięcia na kondensatorze,
  4. dokonujemy pomiaru pinu ADC1,
  5. po zakończonym pomiarze wyłączamy czujnik poprzez ustawienie pinów zasilania i masy rezystora w stan wysokiej impedancji, czyli jako wejście z wyłączonym rezystorem pull-up.






Podsumowanie pkt. 1 i 2

Dzięki zastosowaniu rozwiązań opisanych w punktach 1 i 2 zminimalizowaliśmy do granic możliwości zużycie energii w tej części schematu SmartPIP'a.

Należy jednak wspomnieć tutaj o zjawisku upływności:
  • kondensatora,
  • pinów mikrokontrolera.

W przypadku kondensatora upływność można znaleźć w datasheet tego, który zastosujesz.

W przypadku naszego mikrokontrolera ATmega8A, upływność pinu ustawionego jako wejście, określona jest w datasheet następująco:




Jak widać, jest to wartość maksymalna w dodatku podana dla napięcia 5V. Możemy się więc spodziewać, że w naszym przypadku będzie to znacznie mniej niż 1µA na jeden pin. Tutaj niestety nic już nie policzymy, więc należałoby dokonać pomiarów.

Czas trwania stabilizacji sygnału czujnika

Należy tutaj wspomnieć jeszcze o tym, że gdy załączymy czujnik i od razu rozpoczniemy pomiar, to możemy narazić się problem otrzymania niewłaściwego pomiaru, co jest związane z czasem trwania stabilizowania się napięcia na wyjściu czujnika. Dlatego:

Po włączeniu czujnika (zasilanie + rezystor) należy zaczekać na ustabilizowanie się napięcia na wyjściu czujnika tym bardziej, gdy zastosujemy kondensator stabilizujący.

Jak to zrealizujemy opiszę w następnym artykule.





3. Wyłączamy ADC, gdy tylko jest to możliwe


Przetwornik analogowo-cyfrowy (ADC), który używamy do pomiarów światła także zużywa energię, a jest nam potrzebny zaledwie co kilka minut i w dodatku tylko na ułamek sekundy. Należy więc zadbać o to, by niepotrzebnie nie generował nam strat energii baterii.

W przypadku mikrokontrolera ATmega8 mamy w tym zakresie dwie możliwości:
  • włączania i wyłączania przetwornika,
  • specjalnego trybu pomiaru "ADC Noise Reduction".


Dlaczego włączanie i wyłączanie przetwornika ADC jest istotne?

Zobaczmy w dokumentacji jaki prąd pobiera przetwornik ADC. Znajdziesz tam wykres dla przypadku, który zastosujemy, czyli gdy napięcie referencyjne AREF (napięcie odniesienia) będzie równe napięciu zasilania mikrokontrolera Vcc:




Na wykresie zaznaczyłem jest fragment, w którym pracować będzie nasz SmartPIP, czyli dla napięć zasilania przede wszystkim z przedziału od 2,7V do 3V, ponieważ taką baterię wybraliśmy. Dla uproszczenia przyjmijmy, że prąd ten będzie równy 150µA.

Malutko prawda? Ale czy aby na pewno?

W poprzednim artykule ustaliliśmy, że w czasie snu przy działającym Timer2 odliczającym czas, mikrokontroler będzie pobierał zaledwie 10µA. Włączony ADC pobierać będzie więc:



... 15 razy więcej prądu niż mikrokontroler w czasie snu i odliczania czasu!

Wniosek jest oczywisty:

Należy bezwzględnie wyłączać przetwornik ADC pomiędzy kolejnymi pomiarami, gdyż pobiera on strasznie dużo ładunku z baterii.

Tryb pomiaru ADC Noise Reduction

Drugą możliwością w zakresie oszczędności uzyskanych z przetwornika ADC jest skorzystanie podczas pomiarów światła ze specjalnego trybu snu ADC Noise Reduction mode.

Tryb ten został zaprojektowany przede wszystkim po to, by zmniejszyć ilośc szumów generowanych przez wewnętrzne układy mikrokontrolera, które mogą przenosić się na wejście przetwornika ADC w czasie trwania pomiaru. Dla nas oczywiście jest to także istotne.

Jednakże naszym zyskiem jest dodatkowo fakt, iż w trybie tym spada zapotrzebowanie na energię co związane jest z zatrzymaniem pracy niektórych wewnętrznych układów. Niektórych, czyli?:


Niestety w tym zakresie nie jesteśmy w stanie stwierdzić na podstawie datasheet jakie z tego tytułu będą oszczędności, ale na pewno będą spore patrząc na to, co jest wyłączone :-)






Podsumowanie

Sądzę, że po analizie niniejszego artykułu stwierdzisz, że oszczędzanie energii wcale nie jest trudne i nie są to jakieś magiczne zaklęcia. Ot po prostu kombinowanie i logiczne myślenie poparte sprawdzaniem datasheet.

Jednakże zawsze możesz trafić na moment, w którym będziesz miał wątpliwości lub w datasheet nie znajdziesz odpowiednich informacji. Wtedy pozostaje droga empiryczna w postaci eksperymentu.

Najprostszym jest więc symulowanie pracy przy zasilaniu z naładowanego kondensatora. Jak taki eksperyment wygląda możesz zobaczyć na przykładzie pokazanym przez inżynierów ATmel'a.

W następnych artykułach przetestujemy nasz czujnik i dokonamy testowych dobowych pomiarów.


Artykuł jest częścią cyklu: SmartPIP - Elektroniczny dręczyciel


3 komentarze:

  1. Ciekaw jestem jak, wcale nie tak duża rezystancja wejściowa przetwornika ADC, w porównaniu z rezystorem fototranzystora, wpłynie na wyniki pomiarów. Mam nadzieję, że zostanie ta kwestia także opisana w najbliższym artykule.

    OdpowiedzUsuń
  2. Zamiast datasheet można używać nota katalogowa. Jest to poprawne Polskie tłumaczenie. Pozatym nie widzę w tym tekście konieczności używania zapożyczenia z Angielskiego.

    OdpowiedzUsuń
  3. Masz rację, powinno się używać określenia nota katalogowa. Jednakże od początku stosowaliśmy słowo datasheet (trochę świadomie, trochę nieświadomie), więc dokonywanie teraz zmiany, gdy już na blogu jest około 300 artykułów, byłoby pracochłonne. Jednocześnie chcielibyśmy zachować w miarę możliwości spójność słownictwa we wszystkich artykułach.


    OdpowiedzUsuń