Понижаем энергопотребление устройств на микроконтроллерах AVR

 При питании устройств от автономных источников питания – батареек, аккумуляторов (и яблок с воткнутыми электродами 😉 ) приходиться заботиться о снижении энергопотребления, с целью увеличения срока службы без замены элементов питания. Само по себе энергопотребление зависит от многих факторов: от типа используемого микроконтроллера, напряжения питания, выбранной частоты работы, от сконфигурированной периферии и даже от температуры окружающей среды.

 Для управления энергопитанием все микроконтроллеры 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

 Чтобы включить устройство достаточно нажать на кнопку, на микроконтроллер снова поступит питающее напряжение, он в свою очередь откроет транзистор и дальше начнет выполнять свою программу, и по завершению которой, снова обрубит собственное питание.


Взято с: avrproject.ru


Категория: AVR
Метки:

Написать коментарий

*
= 5 + 9

Добавить изображение

Последние статьи