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

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

 В портативных устройствах, как известно, важной составляющей является время автономной работы. Кому понравится пользоваться устройством, которое приходится очень часто заряжать?  Поэтому к различным способам снижения энергопотребления полезно добавлять еще одну функцию - автоматическое отключение питания, которое поможет спасти заряд батареи если пользователь забыл отключить устройство.  А для того чтобы это реализовать, нужно чтобы устройство включалось и выключалось от кнопки без фиксации. Мне как раз понадобилось реализовать подобное и испытав несколько схем найденных в интернете, остановился на самом интересном решении. Поэтому сейчас покажу, как можно включать и выключать устройство на микроконтроллере одной кнопкой без фиксации и реализацию такого алгоритма в 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
Просмотров: 3976 | Комментарии: 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://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Двухпериодный автомат включения/выключения
24.03.2017 - Ghiotto:
С точки зрения безопасности лучше селектор режима подключать напрямую к базовому...
Фильтр Калмана
24.03.2017 - Ghiotto:
а получился цифровой фильтр низких частот
Минитерминал v.2.0
23.03.2017 - sakatgg:
Нарисовал плату под DIP
mediafire.com/file/mpdxd2825em872a/Минитерминал+0...
Направлятор
22.03.2017 - RD3AVJ:
Привет дружище!
в гугле отрыл гдето
там есть прога для винды, по к...
USB розетка для ноутбука
22.03.2017 - exersizze:
Автор max, напишите ему в личку

...
Направлятор
22.03.2017 - exersizze:
RD3AVJ, а где ты для ардуины код с калибровкой взял?
USB розетка для ноутбука
21.03.2017 - jedayak:
Доброго времени суток
как связаться с автором сего чуда и приобрасти его?
Направлятор
21.03.2017 - RD3AVJ:
upd: похоронил идею использовать этот магнитометр в проектах, ибо калибровка пре...
Направлятор
20.03.2017 - RD3AVJ:
Коллеги, чтобы получить правильные показания магнитометра с помощью акселерометр...