При питании устройств от автономных источников питания – батареек, аккумуляторов приходиться заботиться о снижении энергопотребления, с целью увеличения срока службы без замены элементов питания. Само по себе энергопотребление зависит от многих факторов: от типа используемого микроконтроллера, напряжения питания, выбранной частоты работы, от сконфигурированной периферии и даже от температуры окружающей среды.
Для управления энергопитанием все микроконтроллеры AVR имеют несколько режимов работы, позволяющие существенно снизить собственное энергопотребление – это режим сна (Sleep mode) и остановка (Power-down)
Как меняется энергопотребление в зависимости от выбранного режима работы наглядно продемонстрировано в таблице ниже (при 1 MHz, 3V, 25°C):
Тип микроконтроллера | Active mode | Sleep mode | Powerdown mode |
Attiny2313 | 2.5 mA | 0.5 mA | 0.5 μA |
Attiny2313a | 190 μA | 24 μA | 0.1 μA |
Atmega48 | 250 μA | 15 μA | 0.1 μA |
Atmega8 | 3.6 mA | 1.0 mA | 0.5 μA |
Atmega8a | 250 μA | 50 μA | 0.1 μA |
Atmega32a | 0.6 mA | 0.2 mA | < 1 μA |
Видно, что рулят ситуацией микроконтроллеры новых ревизий (те что выпускаются с индексом “а” на конце) и новые модели (atmega48/88/168 и подобные).
Теперь посмотрим, как работать с режимами пониженного энергопотребления.
Режим сна (Sleep mode)
При этом режиме останавливается тактовый генератор, но остальная периферия продолжает работать, и микроконтроллер будет реагировать на внешние прерывания, прерывания по UART и прерывания по счетчикам/таймерам. Довольно полезно использовать например при ожидании каких-нибудь преобразований – пока внешняя периферия думает (как в случае с датчиками 18b20), чтобы микроконтроллер попусту не жрал лишнюю энергию, можно на время его усыпить и разбудить через определенный промежуток времени с помощью таймера.
Для погружения микроконтроллер в режим сна в Bascom-AVR используется команда Idle.
Пример использования режима сна. Тут сконфигурирован таймер на прерывание через 4 секунды, как только таймер переполниться он вызовет прерывание и разбудит микроконтроллер.
$regfile = “m8def.dat”
$crystal = 1000000
‘$sim
‘конфигурируем таймер для генерации прерываний
‘прерывания от таймера будут происходить примерно раз в 4 секунды
Config Timer1 = Timer , Prescale = 64
On Timer1 Awake:
Enable Interrupts
Enable Timer1
Start Timer1
Do
Print “Hello” ‘печатаем приветствие
Print “Sleep now”
Idle ‘погружаем в сон
Loop
Awake: ‘случилось прерывание по таймеру
Print “Awake!”
Return
End
Остановка (Power-down mode)
Самый экономный режим, и, по сути, микроконтроллер обесточивается полностью. В этом режиме останавливается тактовый генератор и отключается вся периферия за исключением обработчика внешних прерываний, который при приходе прерывания возвращает микроконтроллер к нормальной работе. Чтобы задействовать этот режим даем команду Powerdown.
$regfile = “m8def.dat”
$crystal = 1000000
‘$sim
‘конфигурируем прерывание на INT0
‘происходящее по низкому уровню на ножке МК
Config Int0 = Low Level
On Int0 Button:
Enable Interrupts
Enable Int0
Do
Print “Hello” ‘печатаем приветствие
Print “Powerdown now”
Powerdown ‘грузим мк в энергоcберегающий режим
Loop
Button: ‘пришло прерывание
Print “Start” ‘контроллер очнулся и напечатал сообщение
Print “”
Wait 1
Gifr = 64
Return ‘возвращаемся в главный цикл
End
Обесточь меня полностью!
В устройствах, где микроконтроллер подолгу должен бездействовать (например, в термометрах которые большую часть времени никто не видит), можно применить одно очень интересное решение с применением внешнего полевого транзистора.
Суть вот в чем: транзистор включен в разрыв цепи питания устройства и открывается самим микроконтроллером во время выполнения программы. Пока выполняется программа, на ножке 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 ‘закрываем транзистор
End
Чтобы включить устройство достаточно нажать на кнопку, на микроконтроллер снова поступит питающее напряжение, он в свою очередь откроет транзистор и дальше начнет выполнять свою программу, и по завершению которой, снова обрубит собственное питание.
Последние статьи
- Лучшая практика проектирования при размещении компонентов печатной платы
- Android 6.0 на lancer X
- Простой усилитель мощности класса АВ своими руками.
- Двухтактный ультралинейный ламповый УНЧ на EL84 (6П14П).
- Люксметр на ATmega8 и цифровом датчике BH1750
- Контроллер для светодиодной ленты с ИК управлением
- Самодельный LED светильник на основе ИК датчика HC-SR501
- Простой усилитель низкой частоты на TDA7377 и NE5532
- Простейший звонок с двумя мелодиями
- LED Cube 8x8x8 на Arduino с RTC