Знижуємо енергоспоживання пристроїв на мікроконтролерах avr - корисна інформація - avr - проекти

Знижуємо енергоспоживання пристроїв на мікроконтролерах 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 'повертаємося в головний цикл

Знеструмила мене повністю!

У пристроях, де мікроконтролер підлягає повинен діяти (наприклад, в термометрах які більшу частину часу ніхто не бачить), можна застосувати одне дуже цікаве рішення із застосуванням зовнішнього польового транзистора.

Знижуємо енергоспоживання пристроїв на мікроконтролерах avr - корисна інформація - avr - проекти

Суть ось у чому: транзистор включений в розрив ланцюга живлення пристрою і відкривається самим мікро контролером під час виконання програми. Поки виконується програма, на ніжці 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 'закриваємо транзистор

Щоб включити пристрій досить натиснути на кнопку, на мікроконтролер знову надійде напругу живлення, він в свою чергу відкриє транзистор і далі почне виконувати свою програму, і по завершенню якої, знову обрубає власне харчування.

Схожі статті