Week 05
interrupts, timers, sleep mode
Annoucements
(slide) homepage
(slide) mattermost
(slide) hack košice
(slide) Namakaný deň 2019
rozmery pre projekty
- vonkajsie rozmery: sirka 106 cm, vyska 83 cm, hlbka 8 cm
- vnutorny rozmer: sirka 102,4 cm, vyska 79,4 cm, hlbka 8 cm - nezabudnut na dosku
- privody(V): 230, 24 12, 5, 3.3
- sľúbený príspevok: 50 evry/tím
Low-Power Library
(slide) Mikrokontrolér často obsahuje aj súčasti, ktoré potrebujú osobitné nastavenia, ak chceme znížiť ich spotrebu energie. Jedná sa napríklad o:
- A/D prevodník
- analógový komparátor
- Brown-out detect
- 3 časovače
- Watch-dog timer
(slide) Tieto
súčasti mikrokontroléra je možné vypínať a zapínať selektívne. Je to
možné dosiahnuť pomocou registrov mikrokontroléra alebo pomocou volaní
makier nachádzajúcich sa v knižnici avr/power.h
. Napríklad
pre vypnutie A/D prevodníka je možné zavolať makro
power_adc_disable()
a pre jeho opätovné zapnutie zasa makro
power_adc_enable()
.
(slide) Existuje však knižnica s názvom Low-Power, ktorá zjednodušuje prácu s režimom spánku a umožňuje pred prechodom do spánku vypínať požadované komponenty s cieľom dosiahnutia vyššej úspory energie. Knižnica má tieto vlastnosti:
- podporuje všetky režimy spánku mikrokontroléra ATmega328P,
- umožňuje mikrokontrolér uspať na 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s, 4 s, 8 s, a na stálo,
- umožňuje vypnúť A/D prevodník,
- umožňuje vypnúť modul Brownout Detector
- vo vybraných režimoch spánku umožňuje vypnúť všetky časovače, USART0, TWI, a modul SPI
(slide) Knižnica sa
používa prostredníctvom triedy LowPower
, ktorá má niekoľko
metód: idle()
, adcNoiseReduction()
,
powerDown()
, powerSave()
,
powerStandby()
a powerExtStandby()
. Každá z
nich reprezentuje niektorý z režimov spánku mikrokontroléra. Pomocou
parametrov týchto metód je možné nastaviť dĺžku strvania spánku ako aj
zoznam súčastí, ktoré majú byť zapnuté alebo vypnuté.
Príklad použitia ilustruje nasledujúci riadok kódu. Pomocou neho sa mikrokontrolér uspí na 8 sekúnd v režime Power Down, pričom moduly ADC a BOD budú vypnuté.
.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower
Reducing Clock Frequency of Microcontroller
(slide) Ďalší zo spôsobov, ako znížiť spotrebu energie v zariadení a predĺžiť tak životnosť batérie, je znížiť frekvenciu mikrokontroléra. Nie vždy je totiž potrebné, aby mikrokontrolér pracoval na plnej frekvencii. Preto je vždy dobré zvážiť, či obetovať zvýšenie životnosti batérie za zníženie počtu vykonateľných inštrukcií za sekundu.
(slide) Mikrokontrolér ATmega 328P používa na generovanie hodinových cyklov externý oscilátor o frekvencii 16 MHz. Vzťah medzi aktuálnou pracovnou frekvenciou mikrokontroléra a množstvom odoberanej energie je možné vidieť na obrázku XXX. Ako je možné vidieť, znížením frekvencie je možné aj strojnásobiť životnosť batérie.
(slide) Po
znížení hodinovej frekvencie však netreba zabudnúť na to, že táto zmena
sa nedotkne len frekvencie samotného mikrokontroléra, ale aj všetkých
synchrónnych periférií. To znamená, že zmena frekvencie sa dotkne aj
volania funkcií delay()
alebo millis()
.
Rovnako tak sa dotkne rýchlosti V/V komunikácie (napr. na sériovej
linke), rýchlosti A/D prevodníku a podobne.
Pri zmene hodinovej frekvencie musí byť vypnuté ošetrovanie
prerušení. Tým bude zabezpečené, že operácia zápisu, resp. zmeny
hodinovej frekvencie, nebude ničím prerušená. Vhodné miesto pre zmenu
frekvencie sa preto javí funkcia setup()
, kde dôjde k
nastaveniu hodinovej frekvencie ešte pred spustením samotného
programu.
(slide) Zmenu frekvencie
je možné na mikrokontroléri ATMEL ATmega 328P zmeniť delením
hodnoty registra Clock Prescale Register, skrátene
CLKPR
. Jeho zmenou je možné znížiť hodnotu frekvencie hodín
a tým pádom aj znížiť spotrebu energie. Jeho štruktúra sa nachádza na
obrázku XXX.
Najvyšší bit registra CLKPR
nesie označenie
CLKPCE
- Clock Prescaler Change Enable. Ak sa má
zmeniť frekvencia mikrokontroléra, treba ho nastaviť na hodnotu
1 a všetky ostatné bity na hodnotu 0. K jeho
vynulovaniu dôjde automaticky buď po 4 cykloch alebo po zápise
CLKPS
bitov.
(slide)
Kombináciou bitov CLKPS0
až CLKPS3
(Clock
Prescaler Select Bits) je možné nastaviť tzv. Clock Division
Factor. Ten určuje, koľkonásobne sa zníži frekvencia
mikrokontroléra. Ich zmenu je možné vykonať kedykoľvek počas behu
programu. Aj keď sú k dispozícii 4 bity, ktoré umožňujú
16 rozličných kombinácií, prípustných je len 8. Možné
kombinácie sú zobrazené v tabuľke XXX.
CLKPS3 | CLKPS2 | CLKPS1 | CLKPS0 | Clock Division Factor | Frequency |
---|---|---|---|---|---|
0 |
0 |
0 |
0 |
1 |
16 MHz |
0 |
0 |
0 |
1 |
2 |
8 MHz |
0 |
0 |
1 |
0 |
4 |
4 MHz |
0 |
0 |
1 |
1 |
8 |
2 MHz |
0 |
1 |
0 |
0 |
16 |
1 MHz |
0 |
1 |
0 |
1 |
32 |
500 kHz |
0 |
1 |
1 |
0 |
64 |
250 kHz |
0 |
1 |
1 |
1 |
128 |
125 kHz |
1 |
0 |
0 |
0 |
256 |
62.5 kHz |
(slide) Pre zmenu frekvencie mikrokontroléra ATmega 328P je teda potrebné vykonať tieto kroky:
Globálne vypnúť prerušenia volaním makra
noInterrupts()
.Nastaviť hodnotu bit-u
CLKPCE
na 1 a všetky ostatné bity registraCLKPR
na 0.Následne je potrebné zapísať hodnotu bitov
CLKPS
, ktorá zodpovedá príslušnému deliču Clock Division Factor.Globálne prerušenia zapnúť volaním makra
interrupts()
.
Pre prezentáciu zmeny frekvencie mikrokontroléra, použijeme samotné Arduino Uno a štandardný príklad Blink. Budeme teda blikať zabudovanou LED diódou v pravidelných 1 sekundových intervaloch. Zdrojový kód riešenia sa nachádza vo výpise XXX.
#include <Arduino.h>
void setup(){
(LED_BUILTIN, OUTPUT);
pinMode}
void loop(){
(LED_BUILTIN, HIGH);
digitalWrite(1000);
delay(LED_BUILTIN, LOW);
digitalWrite(1000);
delay}
Po preložení a spustení bude LED dióda 1 sekundu svietiť a následne na 1 sekundu zhasne.
Následne upravíme funkciu setup()
tak, že v nej znížime
frekvenciu mikrokontroléra na 2 MHz - nastavíme hodnotu
Clock Division Factor na 8. Za tým účelom je potrebné
nastaviť hodnotu bitov CLKPS0
a CLKPS1
na
1, ktoré sú spolu s CLKPCE
dostupné ako makrá.
void setup(){
();
noInterrupts= _BV(CLKPCE); // 0x80
CLKPR = _BV(CLKPS0 | CLKPS1); // 0x03
CLKPR ();
interrupts(LED_BUILTIN, OUTPUT);
pinMode}
Totou úpravou sa znížila frekvencia mikrokontroléra na 2
MHz. Tentokrát celý cyklus zasvietenia a zhasnutia nebude trvať
2 sekundy, ale 4, pretože súčasne so znížením
frekvencie došlo k ovplyvneniu správania funkcií delay()
a
millis()
. * TODO: vypocet
Ak by sme na koniec funkcie loop()
pridali riadok na
vypísanie počtu milisekúnd od spustenia programu, videli by sme stále
rovnaké hodnoty, či už by sme frekvenciu zmenili alebo nie. To znamená,
že táto hodnota je závislá od nastavenej frekvencie. Tomuto problému sa
ale dá vyhnúť nastavením makra F_CPU
na správnu frekvenciu
v čase prekladu.
Poznámka
V kóde je použité aj makro _BV()
, ktoré prevedie číslo
bitu, ktoré dostane ako parameter, na zodpovedajúcu číselnú hodnotu
(byte). Takže zápisy
= _BV(CLKPCE); CLKPR
a
= 0x80; CLKPR
sú ekvivalentné.
Managing Energy Consumption with Hardware
(slide) Arduino Uno je v prvom rade prototypovacia platforma na rýchly návrh a vývoj riešení. Z pohľadu práve šetrenia energie nie je ideálnym predstaviteľom. Ako bolo ukázané už v predchádzajúcej kapitole, nie len mikrokontrolér samotný, ale hlavne doska obsahuje komponenty, ktoré majú priamy dopad na spotrebu energie. V tejto kapitole si jednotlivé komponenty predstavíme ako aj to, aký vplyv na majú na spotrebu energie.
Arduino Components
(slide) Prototypovaciu dosku Arduino Uno je možné rozdeliť do troch hlavných častí:
- jadro alebo mikrokontrolér
- napájacia časť
- komunikačná časť
The Microcontroller
(slide)
Jadrom dosky je samozrejme mikrokontrolér ATmega328P.
Označenie 328P
znamená sprava doľava:
P
znamená picoPower. Takto označený mikrokontrolér je vhodný pre zariadenia s nízkym odberom.8
znamená, že sa jedná o 8 bitový mikrokontrolér.32
znamená, že mikrokontrolér má k dispozícii 32kB pamäte na program.
Jedným z atribútov picoPower architektúry je, že umožňuje vypínať jej prídavné moduly, čím je možné zvýšiť výdrž batérie. Tieto možnosti boli ilustrované v predchádzajúcej kapitole (napr. prechod do režimu spánku, zníženie frekvencie a podobne). Okrem toho je tento mikrokontrolér charakteristický tým, že vie pracovať pri napájaní v rozsahu od 1.8V do 5.5V.
Power Supply
(slide) Pokiaľ neuvažujeme referenčné napätie, je možné prototypovaciu dosku Arduino Uno napájať z dvoch externých zdrojov a to pomocou:
- USB portu, alebo
- DC jack-u
Napájanie prostredníctvom USB portu je privedené na dosku priamo. To znamená, že ak náhodou prostredníctvom USB portu privediete vyššie napätie ako je 5V (maximálne dovolené napätie je 5,5V), môžete Arduino zničiť. Napäťové regulátory sa totiž nachádzajú za DC jack-om. Tie slúžia na to, aby v prípade vyššieho napájacieho napätia (max. 20V) bolo zabezpečené, že sa na dosku dostane maximálne 5V.
Stabilizátor používaný na prototypovacej doske Arduino Uno je štandardný LM7805 1. Tento stabilizátor sa používa už mnoho rokov na stabilizáciu napájacieho napätia 5V. Na vstupe potrebuje mať napätie aspoň 7V a pre svoju vlastnú potrebu spotrebuje 5 až 8 mA. Čím vyššie napätie však bude privedené na vstup stabilizátora, tým väčšie straty bude mať. Nadbytočná energia je prevádzaná na teplo, čo znamená, že stabilizátor sa pri vyšších napätiach bude prehrievať. Preto je ideálne Arduino Uno napájať cez DC jack s napätím blízkym 7V.
(slide) Výkon, ktorý sa premení na teplo, je možné jednoducho vypočítať pomocou tohto vzťahu:
\[ P_{wasted} = (V_{in} - V_{out}) * I \]
Z tohto vzťahu vyplýva presne to, čo bolo uvedené vyššie - čím vyšší je rozdiel vstupnýho a výstupného napätia, tým väčšie straty budú (ako aj teplo).
Principiálna schéma zapojenia stabilizátora LM7805 sa nachádza na obrázku XXX.
Existujú však stabilizátory, ktoré sú označené ako LDO (Low Drop-Out), poprípade Ultra LDO. Tieto stabilizátory pre svoju potrebu potrebujú výrazne menší prúd v porovnaní so stabilizátorom LM7805. Napríklad stabilizátor MCP1703 2 má úbytok napätia do 1V a pre svoju spotrebuje potrebuje 2 mikroAmpére (parameter označený ako Quiescent Current). Stabilizátory rady TPS783xx3 majú úbytok napätia okolo 150mV a vlastnú spotrebu 500nA.
Ako je vidieť, zvýšiť výdrž IoT zariadenia, ktoré je postavené na prototypovacej doske Arduino Uno by bolo možné aj výmenou stabilizátora. Tým, že je však stabilizátor pevnou súčasťou dosky, to nie je možné.
Communication Part
(slide) Prototypovacia doska Arduino Uno je vybavená čipom ATmega16U2, ktorý slúži ako prevodník medzi USB a sériovou linkou. Tá sa používa jednak na komunikáciu medzi doskou Arduino a pripojenými zariadeniami, ale aj na programovanie mikrokontroléra ATmega328P.
Pokiaľ je Arduino Uno napájané z USB portu, samozrejme nedochádza k žiadnym stratám. Čip však nedisponuje žiadnymi opatreniami na úsporu energie. To znamená, že aj keď nebude prebiehať žiadna komunikácia na sériovej linke, bude čip odoberať elektrickú energiu. Jeho odpojením v takomto stave by bolo možné rapídne znížiť spotrebu celej dosky.
Project Arduino Breadboard
(slide)
Additional Sources
https://github.com/rocketscream/Low-Power
https://github.com/lowpowerlab/lowpower (vraj lepsia verzia?)
http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/
https://www.arduino.cc/en/main/standalone
https://www.instructables.com/id/Build-Your-Own-Arduino/