Režimy spánku mikropočítača, minimalizovanie spotreby, ukážkové príklady
Režimy so zníženou spotrebou umožňujú vypnúť práve nepoužívané periférie mikrokontroléra a tým znížiť spotrebu zariadenia. Mikrokontrolér ponúka viacero režimov so zníženou spotrebou a tak umožňuje užívateľovi redukovať spotrebu energie v závislosti na požiadavkách aplikácie.
Režimy spánku využijeme hlavne v aplikáciách, pri ktorých je mikrokontrolér napájaný z batérie. Tam môžeme využitím vhodného režimu spánku niekoľkonásobne zvýšiť výdrž batérie.
Ak chceme využiť ľubovoľný z piatich úsporných režimov, potom bit SE v MCUCR registri musí byť nastavený na hodnotu 1. Výkonom inštrukcie SLEEP prejde MCU do zvoleného úsporného režimu. Hodnoty bitov SM2, SM1 a SM0 v registri MCUCR definujú, ktorý z piatich možných režimov bude aktivovaný. Ak sa v priebehu úsporného režimu vyskytne povolené prerušenie MCU prejde do aktívneho stavu. V tomto prípade MCU bude na 4 hodinové cykly zastavená a po nábehovom čase sa realizuje príslušná obsluha prerušenia. Po obsluhe prerušenia bude MCU pokračovať vo výkone programu, inštrukciou nasledujúcou za inštrukciou SLEEP. Obsah pola univerzálnych registrov a pamäte SRAM ostáva nezmenený. Register MCUCR obsahuje riadiace bity pre riadenie spotreby.
MCUCR:
Bit 7 – SE: Sleep Enable
Ak bit SE je nastavený na hodnotu 1, potom je povolené vykonanie inštrukcie SLEEP. Vhodné je nastaviť bit SE práve pred inštrukciou SLEEP.
Bity 6, 4 – SM2 . . 0 Sleep Mode Select 2, 1 a 0
Pomocou bitov SM2, SM1 a SM2 je možné zvoliť jeden z piatich úsporných režimov MCU podľa Tab. 1
SM2 | SM1 | SM0 | Úsporný režim |
0 | 0 | 0 | Idle |
0 | 0 | 1 | ADC noise reduction |
0 | 1 | 0 | Power-down |
0 | 1 | 1 | Power-save |
1 | 0 | 0 | Rezervované |
1 | 0 | 1 | Rezervované |
1 | 1 | 0 | Standby(1) |
(1) Standby režim je možné využiť len s externým kryštálom, alebo rezonátorom
Tab.1 Režimy spánku MCU
Idle mode, režim nečinnosti
Ak bity SM2..0 sú nastavené na hodnotu 000, potom realizácia inštrukcie SLEEP spôsobí, že MCU prejde do režimu nečinnosti. V tomto režime je zastavená činnosť CPU, ale SPI, USART, analógový komparátor, ADC, TWSI, čítače/časovače, watchdog a prerušovací systém pokračujú v činnosti. Je zrejmé, že v tomto režime je zastavený hodinový signál clkCPU a clkFLASH. Z režimu nečinnosti sa MCU dostane na základe výskytu žiadosti o prerušenie od povolených interných a externých zdrojov prerušenia.
ADC noise reduction mode, režim redukcie šumu
Ak sú bity SM0..2 nastavené na hodnotu 001, potom realizácia inštrukcie SLEEP spôsobí, že MCU prejde do režimu redukcie šumu. Tento režim zastaví CPU a niektoré I/O obvody. V režime redukcie šumu budú zastavené nasledovné hodinové signály: clkIO, clkCPU a clkFLASH. Toto spôsobí zníženie úrovne šumu generovaného digitálnymi obvodmi a zvýši sa presnosť A/D prevodu. Z režimu redukcie šumu sa MCU dostane na základe výskytu žiadosti o prerušenie od nasledovných povolených zdrojov: koniec ADC prevodu, externý reštart, watchdog reštart, Brown-out reštart, TWSI zhoda adresy, čítač/časovač2, SPM a EEPROM pripravené a externé prerušenia na úroveň INT0 a INT1.
Power-down mode, režim zo zníženou spotrebou
Ak sú bity SM0..2 nastavené na hodnotu 010, potom realizácia inštrukcie SLEEP spôsobí, že MCU prejde do režimu so zníženou spotrebou. V tomto režime je zastavený externý oscilátor. Externé prerušenia, TWSI a watch-dog pokračujú v činnosti. Z režimu so zníženou spotrebou sa MCU dostane na základe výskytu žiadosti o prerušenie od nasledovných povolených zdrojov: externý reštart, watchdog reštart, Brown-out reštart, TWSI zhoda adresy a externé prerušenia na úroveň INT0 a INT1. V tomto režime sú pozastavené generátory hodinových signálov a v činnosti zostávajú len asynchrónne pracujúce moduly.
Power-save mode, režim s úspornou spotrebou
Ak sú bity SM0..2 nastavené na hodnotu 011, potom realizácia inštrukcie SLEEP spôsobí, že MCU prejde do režimu s úspornou spotrebou. Tento režim je identický s predchádzajúcim režimom so zníženou spotrebou s nasledovnou výnimkou: Ak čítač/časovač2 pracuje asynchrónne (bit AS2 v ASSR je nastavený), bude v tomto režime aktívny a v prípade výskytu žiadosti o prerušenie prejde MCU do aktívneho stavu. Ak nie je povolená asynchrónna činnosť čítača/časovača2 odporúča sa používať režim so zníženou spotrebou. V tomto režime sú pozastavené všetky hodinové signály s výnimkou clkASY.
Standby mode, pohotovostný režim
Ak sú bity SM0..2 nastavené na hodnotu 110 a CPU využíva ako zdroj hodinového signálu generátor s externým kryštálom/rezonátorom, potom realizácia inštrukcie SLEEP spôsobí, že MCU prejde do pohotovostného režimu. Tento režim je identický s režimom so zníženou spotrebou s výnimkou, že oscilátor zostáva v činnosti. Z tohto režimu MCU prechádza do aktívneho režimu v priebehu 6 hodinových periód.
Tab. 2 – Popis jednotlivých režimov spánku
Pri minimalizovaní spotreby mikropočítača sa snažíme v maximálnej miere využiť možnosti režimov spánku, ktoré nám mikropočítač ponúka. Niektoré periférie mikropočítača však potrebujú osobitné nastavenie, ak požadujeme znížiť spotrebu do maximálnej možnej miery.
Ďalšie možnosti zníženia spotreby teda sú:
– Vypnúť AD prevodník pomocou (bit ADEN v registri ADCSRA)
– Vypnúť Analógový komparátor (bit ACD v registri ACSR)
– Vypnúť Brown-out Detect (nastavenie BODEN v poistkách)
– Vypnúť Watch-dog timer (bit WDE v registri WDTCR)
Na spotrebu mikropočítača nielen v režimoch spánku má najväčší vplyv frekvencia hodinového signálu a pracovné napätie. Preto sa snažíme voliť kompromis medzi výkonom a spotrebou mikropočítača.
V tabuľke č. 3 som meraním zisťoval spotrebu mikropočítača v rôznych režimoch činnosti. Ako zdroj hodín som využíval interný RC oscilátor s rôznou frekvenciou. Počas merania bol vypnutý Brown-out detektor, AD prevodník, Watchdog-timer a Analógový komparátor.
Najväčší vplyv na spotrebu vo všetkých režimoch činnosti mal AD prevodník, ktorý odoberal po zapnutí prúd 0,3mA.
Režim spánku | Napätie | Oscilátor | Spotreba |
Bez spánku | 5V | 1MHz | 3,4mA |
Bez spánku | 5V | 8MHz | 11,4mA |
Bez spánku | 3,3V | 1MHz | 1,63mA |
Bez spánku | 3,3V | 8MHz | 5,3mA |
Idle | 5V | 1MHz | 2,5mA |
Idle | 5V | 8MHz | 6,8mA |
Idle | 3,3V | 1MHz | 0,6mA |
Idle | 3,3V | 8MHz | 2,9mA |
Power Down | 5V | 8MHz | 0,7uA |
Power Save | 5V | 8MHz | 0,7uA |
Tab. 3 – Meranie spotreby MCU ATMega8 v rôznych režimoch
Vidíme teda, že najmenšiu spotrebu dosiahneme s režimami Power Down alebo Power Save.
Priamo na prácu s režimami spánku slúži knižnica (avr/sleep.h), ktorú som využíval aj v nasledovných príkladoch.
Pomocou funkcie set_sleep_mode(<mode>); nastavíme cez parameter funkcie požadovaný režim spánku a funkciou sleep_mode (void); daný režim spánku aktivujeme.
Schéma zapojenia:
Príklad č. 1:
Nastav externé prerušenie generované dobežnou hranou signálu a prejdi do režimu spánku – Idle mód. Po zobudení rozsvieť po 2sec LED.
Zdrojový kód:
int main(void){
//nastavenie vyst. portu pre LED
DDRB |= (1 << PB0);
PORTB &= ~(1 << PB0);
// nastavenie ext. prerusenia, dobezna hrana signalu
DDRD &= ~(1 << PD2);
PORTD |= (1 << PD2);
GICR |= (1 << INT0);
MCUCR |= (1 << ISC01);
sei();
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode();
//po prebudeni
_delay_ms(2000);
PORTB |= (1 << PB0);
return 0;
}
ISR(INT0_vect)
{
}
Youtube video:
Príklad č. 2:
Nastav externé prerušenie generované nízkou úrovňou signálu, prejdi do režimu spánku – Power Down. Po zobudení rozsvieť po 2sec LED.
Pozn.: Pri režimoch spánku ,okrem režimu Idle, je možné použiť externé prerušenie jedine v režime, keď je generované nízkou úrovňou signálu. Preto po zobudení musíme zakázať externé prerušenia, nakoľko inak by mikropočítač po zobudení neustále generoval prerušenia pokiaľ by bola nízka úroveň signálu.
Zdrojový kód:
int main(void){
// nastavenie vyst. portu pre LED
DDRB |= (1 << PB0);
PORTB &= ~(1 << PB0);
// nastavenie ext. prerusenia, nizka uroven napatia
DDRD &= ~(1 << PD2);
PORTD |= (1 << PD2);
GICR |= (1 << INT0);
sei();
// nastav rezim spanku
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();
// zrus externe prerusenia
cli();
//pockaj 2s a potom rozsviet LED
_delay_ms(2000);
PORTB |= (1 << PB0);
return 0;
}
ISR(INT0_vect)
{
}
Youtube video:
Ďakujem všetkým čo sa podielali na tejto časti seriálu.
Pridaj komentár
Prepáčte, ale pred zanechaním komentára sa musíte prihlásiť.