Главная » Статьи » Полезная информация

Управление питанием устройства с помощью одной кнопки

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

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

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

  Транзисторы необходимо использовать с логическим уровнем отпирания (Logic Level), чтобы они полностью открывались от напряжения батареи. Хотя я собрал и тестировал схему на том, что попало под руку: в качестве Q1 я использовал IRF5305, а в качестве Q2 - IRF530. Оба транзистора от 5 вольт открываются почти полностью. Взял я их потому что они в больших корпусах и их можно использовать в макетке. Заместо диодов D1 и D2 воткнул диодный мост :)

 

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

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

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

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

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

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

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

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

  If flag=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.=OUTPUT       'управление питанием
pwr alias portd.3

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

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

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

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


loop

end


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

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

do
 incr a
 wait 1

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

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

return

 

 

 

 

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

 

Категория: Полезная информация | Добавлено: 09.10.2016
Просмотров: 7112 | Комментарии: 7 | Рейтинг: 5.0/7
Всего комментариев: 7
0  
7 exersizze   (28.02.2017 22:12)
GIFR - General Interrupt Flag Register. Это сброс регистра прерывания INT0, чтобы не ловить повторное прерывание когда отпустим кнопку.
Об этом написано очень много, но раз уж спросили отвечу. Из-за дребезга кнопки контроллер регистрирует паразитное срабатывание контактов, которое записывается в этот регистр. А так как он занят отработкой первого срабатывания (выполняет программу), сохраняет второе срабатывание в этот регистр. И после того как основная подпрограмма выполнится, контроллер посмотрит на этот регистр, увидит что было зарегистрировано второе срабатывание прерывания и выполнит подпрограмму прерывания еще раз. Нам оно нафиг не надо, поэтому очищаем этот регистр. А например для сброса прерывания INT1 пишем GIFR=128. Это что касается восьмой меги, у других контроллеров нужно смотреть даташит.

Диптрейс всем устраивал и устраивает. Но онлайн редактор это мега удобно, не надо таскать с собой файлы чтобы продолжить работу над схемой дома или где либо еще. Тем более быстрый доступ к интернету есть сейчас везде, забыл уже когда флэшку из сумки доставал, проще и порой быстрей сбросить наработки на дропбокс

6 lionsitroen   (28.02.2017 21:45)
Подскажите пожалуйста, что означает оператор Gifr = 64 в конце программы?
И еще вопрос, ранее вы рисовали в DeepTrace чем не устроил, почему вдруг в EasyEda?

0  
5 exersizze   (19.11.2016 23:13)
В easyeda.com. Конкретно на эту схему https://easyeda.com/exersizze/____-9YWG2MwuP

4 CortexDen   (18.11.2016 09:48)
Подскажите в чём нарисована схема?

0  
3 RD3AVJ   (20.10.2016 08:20)
Спасибо, Вить! Прикручу к счетчику моточасов. Мне китайцы вместо радиаторов для Raspberry Pi как раз прислали антивандальную кнопку без фиксации, да еще и бабки вернули за недопоставленные кулеры, так что вот и пригодится))

0  
2 exersizze   (11.10.2016 20:01)
всегда пожалуйста )

1 Scorpushka   (11.10.2016 17:56)
спасибо!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://jlcpcb.com/

авторизация
Логин:
Пароль:
Комментарии
Бесконтактный датчик температуры MLX90614
21.09.2017 - TSL:
Подскажите пжл. фьюзы для меги8 данного проекта. Боюсь залочить данный проц.
Крутим шаговый двигатель
19.09.2017 - Serg-24:
У Вас прекрасный материал для творчества и все понятно. Перерыл нет потратив 2 д...
Беспроводная система оповещения с датчиком движения
11.09.2017 - rom-i:
https://yadi.sk/d/KCRzZ98I3Mnqfk Программы для Attiny13. 1.3 с использованием АЦ...
Беспроводная система оповещения с датчиком движения
11.09.2017 - rom-i:
Интересно получается. Если использовать АЦП для контроля аккумов, тема жрет 250м...
Направлятор
06.09.2017 - rom-i:
Получил второй NEO6. Повезло Китайцу, что первой сторокой идет RMC. Направлятор ...
Регулятор температуры и влажности
06.09.2017 - ROZARIO:
У кого получится рабочая прошивка с минусовой температурой под этот датчик то по...
Регулятор температуры и влажности
06.09.2017 - ROZARIO:
Спасибо всем участникам этого проекта. Научился немного в BASCOM-AVR работать. <...
Беспроводная система оповещения с датчиком движения
03.09.2017 - exersizze:
Да лучше дождаться и отлаживать с модулями, потому как не предугадаешь какой фок...
Беспроводная система оповещения с датчиком движения
24.08.2017 - rom-i:
Тема понравилась. Как раз занимался охранкой на SIM800l. Подумывал о радиодатчик...