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é.

LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

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.

ATmega328P Frequency vs Supply Current (5V)

(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.

CLKPR Register

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 CLKPS0CLKPS3 (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:

  1. Globálne vypnúť prerušenia volaním makra noInterrupts().

  2. Nastaviť hodnotu bit-u CLKPCE na 1 a všetky ostatné bity registra CLKPR na 0.

  3. Následne je potrebné zapísať hodnotu bitov CLKPS, ktorá zodpovedá príslušnému deliču Clock Division Factor.

  4. 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(){
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
}

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();
    CLKPR = _BV(CLKPCE); // 0x80
    CLKPR = _BV(CLKPS0 | CLKPS1); // 0x03
    interrupts();
    pinMode(LED_BUILTIN, OUTPUT);
}

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.

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 58 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.

Principiálna schéma zapojenia LM7805

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)

Breadboard Arduino

Additional Sources

Footnotes


  1. LM7805 Datasheet↩︎

  2. MCP1703 Datasheet↩︎

  3. TPS783xx Datasheet↩︎