Знижуємо енергоспоживання пристроїв на мікроконтролерах AVR
При харчуванні пристроїв від автономних джерел живлення - батарейок, акумуляторів (і яблук з увіткненими електродами;)) приходиться піклуватися про зниження енергоспоживання, з метою збільшення терміну служби без заміни елементів живлення. Само по собі енергоспоживання залежить від багатьох чинників: від типу використовуваного мікроконтролера, напруги харчування, обраної частоти роботи, від сконфигурированной периферії і навіть від температури навколишнього середовища.
Для керування живленням все мікроконтролери AVR мають кілька режимів роботи, що дозволяють істотно знизити власне енергоспоживання - це режим сну (Sleep mode) і зупинка (Power - down)
Як змінюється енергоспоживання залежно від обраного режиму роботи наочно продемонстровано в таблиці нижче (при 1 MHz, 3V, 25 ° C):
Видно, що рулять ситуацією мікроконтролери нових ревізій (ті що випускаються з індексом "а" на кінці) і нові моделі (atmega48 / 88/168 і подібні).
Тепер подивимося, як працювати з режимами зниженого енергоспоживання.
При цьому режимі зупиняється тактовий генератор, але інша периферія продовжує працювати, і мікроконтролер буде реагувати на зовнішні переривання, переривання по UART і переривання по лічильникам / таймерам. Досить корисно використовувати наприклад при очікуванні якихось перетворень - поки зовнішня периферія думає (як у випадку з датчиками 18b20), щоб мікроконтролер даремно не жер зайву енергію, можна на час його приспати і розбудити через певний проміжок часу за допомогою таймера.
Для занурення мікроконтролер в режим сну в Bascom - AVR використовується команда Idle.
Приклад використання режиму сну. Тут налаштований таймер на переривання через 4 секунди, як тільки таймер переповниться він викличе переривання і розбудить мікроконтролер.
$ Regfile = "m8def.dat"
$ Crystal = 1000000
'$ Sim
'Конфігуруємо таймер для генерації переривань
'Переривання від таймера будуть відбуватися приблизно раз в 4 секунди
Config Timer1 = Timer. Prescale = 64
On Timer1 Awake:
EnableInterrupts
Enable Timer1
Start Timer1
Do
Print "Hello" 'друкуємо вітання
Print "Sleep now"
Idle 'занурюємо в сон
Loop
Awake. 'Сталося переривання по таймеру
Найбільш ощадливий режим, і, по суті, мікроконтролер знеструмлюється повністю. В цьому режимі зупиняється тактовий генератор і відключається вся периферія за винятком обробника зовнішніх переривань, який при приході переривання повертає мікроконтролер до нормальної роботи. Щоб задіяти цей режим даємо команду Powerdown.
$ Regfile = "m8def.dat"
$ Crystal = 1000000
'$ Sim
'Конфігуруємо переривання на INT0
'Відбувається за низьким рівнем на ніжці МК
Config Int0 = Low Level
On Int0 Button.
EnableInterrupts
Enable Int0
Do
Print "Hello" 'друкуємо вітання
Print "Powerdown now"
Powerdown 'вантажимо мк в енергоcберегающій режим
Loop
Button. 'Прийшло переривання
Print "Start" 'контролер прокинувся і надрукував повідомлення
Print ""
Wait 1
Gifr = 64
Return 'повертаємося в головний цикл
Знеструмила мене повністю!
У пристроях, де мікроконтролер підлягає повинен діяти (наприклад, в термометрах які більшу частину часу ніхто не бачить), можна застосувати одне дуже цікаве рішення із застосуванням зовнішнього польового транзистора.
Суть ось у чому: транзистор включений в розрив ланцюга живлення пристрою і відкривається самим мікро контролером під час виконання програми. Поки виконується програма, на ніжці PD0 тримається високий рівень напруги і польовика знаходиться у відкритому стані, пропускаючи через себе струм. Після виконання необхідної програми, мікроконтролер закриває транзистор, тим самим знеструмлюючи схему повністю. За рахунок величезного опору польового транзистора в закритому стані, струм буде дуже малий (набагато менше струму саморозряду батарейки).
$ Regfile = "m8def.dat"
$ Crystal = 1000000
Config Portd. 0 = Output
Portd. 0 = 1 'даємо на ніжку одиницю, тим самим відкриваємо транзистор
Config Portc. 0 = Output 'а тут у нас світлодіод
Led Alias Portc. 0
'Робимо свою справу, наприклад моргнути світлодіодом
Led = 1
Waitms 80
Led = 0
Waitms 80
Led = 1
Waitms 80
Led = 0
Portd. 0 = 0 'закриваємо транзистор
Щоб включити пристрій досить натиснути на кнопку, на мікроконтролер знову надійде напругу живлення, він в свою чергу відкриє транзистор і далі почне виконувати свою програму, і по завершенню якої, знову обрубає власне харчування.