Схема управления питанием энергосберегающих устройств

Публикация 24.04.2017

В любых автономных устройствах самая острая проблема - это энергопотребление. Отключение устройства по таймеру или включение.выключение по нажатию кнопки можно реализовать с помощью спящего режима, но ток сна велик и забытое устройство будет полностью разряжено когда его снова возьмут в руки. Для сбережения заряда аккумулятора выключенного устройства и не использовать кнопку без фиксации приведу пример схемы на Bascom-AVR.

Схема управления питанием основана на небольшом количестве дискретных элементов. В микроконтроллере AVR использует одно прерывание:

Схема управления питанием энергосберегающих устройств

Нажатие на кнопку S1 приводит к открытию транзистора Q1. Напряжение от батареи идет в схему. Что бы транзистор Q1 не закрылся, нужно открыть транзистор Q2. Для этого подаем на затвор положительный потенциал. Пока на затворе Q2 будет положительный потенциал, схема будет в состоянии "включено". Для перевода в "выключено" нужно снять подачу напряжения с этого вывода. Оба транзистора закроются тем самым обесточивая электро схему.

В схеме лучше использовать транзисторами с логическим уровнем управления, чтобы они полностью открывались от напряжения питания схемы. Тестовая схема была собрана на первых попавшихся под руку транзисторах. Для Q1 использовался IRF5305, а для Q2 - IRF530. Оба транзистора от 5 вольт открываются почти полностью.

Монтажная плата управления питанием энергосберегающих устройств

Пример кода для включение и выключение питания по нажатию кнопки.

$regfile = "m8def.dat"
$crystal = 1000000

Dim flag as Byte             'переменная для выполнения основной программы

Config PORTB.0=OUTPUT        'выход светодиода
Led alias portb.0

Config portd.3 =OUTPUT       'управление питанием
pwr alias portd.3

Config INT0=low level        'кнопка включения/выключения
On Int0 Zapusk:

Enable int0                  'разрешаем прерывания
Enable interrupts

'основной цикл
Do

  If flag=1 then             'выполнение основной программы
   Led=1
  End if


Loop

end


'прерывание при нажатии на кнопку
zapusk:

toggle pwr                   'включение / выключение

flag=1                       'поднимаем флаг

do
loop until pind.2=1          'пока нажата кнопка крутимся здесь

waitms 100
Gifr = 64

return

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

$regfile = "m8def.dat"
$crystal = 1000000

dim flag as Byte             'переменная для выполнения осовной программы
dim a as Byte                'для организации задержки
config PORTB.0=OUTPUT        'выход светодиода
led alias portb.0

config portd.3 =OUTPUT       'управление питанием
pwr alias portd.3

config INT0=low level        'кнопка включения/выключения
On Int0 Zapusk:

enable int0                  'разрешаем прерывания
enable interrupts

'основной цикл
do

  if flag=1 then             'выполнение основной программы
  '....
  '....
  end if


loop

end


'прерывание при нажатии на кнопку
zapusk:

flag=1                       'поднимаем флаг

do
 incr a
 wait 1

   if a=3 then               'если прошло 3 секунды
    toggle pwr               'включение / выключение
    toggle led
    goto ext                 'выход из цикла
   end if

   loop until pind.2=1       'пока нажата кнопка крутимся здесь
ext:
a=0
waitms 100
Gifr = 64

return
 
 

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

* комментарии публикуются после модерации
Нет комментариев