Главная » Статьи » Полезная информация |
В портативных устройствах, как известно, важной составляющей является время автономной работы. Кому понравится пользоваться устройством, которое приходится очень часто заряжать? Поэтому к различным способам снижения энергопотребления полезно добавлять еще одну функцию - автоматическое отключение питания, которое поможет спасти заряд батареи если пользователь забыл отключить устройство. А для того чтобы это реализовать, нужно чтобы устройство включалось и выключалось от кнопки без фиксации. Мне как раз понадобилось реализовать подобное и испытав несколько схем найденных в интернете, остановился на самом интересном решении. Поэтому сейчас покажу, как можно включать и выключать устройство на микроконтроллере одной кнопкой без фиксации и реализацию такого алгоритма в 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.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
Ну и дальше в зависимости от задачи можно ввести подсчет пройденного времени, например запустить таймер, и принудительно отключать питание, если таймер переполнился.
| |
Просмотров: 28442 | Комментарии: 7 | Рейтинг: 5.0/9 |
Всего комментариев: 7 | |||||
| |||||
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |