
Views: 920
Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость работы проекта, а если таких улучшений будет много, то это значительно может снизить скорость работы программного продукта, но у нас это единственные функции, так, что такое изменение приемлемо.
При этом мы получим две функции (обратим внимание на изменения, добавим условие авто отключение, эта функция активируется, только если канал включен, отключение авто отключения когда активируется другие функции канала):
void channel_1 (void) // управление каналом 1 { if(bot1_pressure)//было нажатие клавиши { bot1_pressure=0; // сбросить флаг нажатия bot1_retention=1; // событие нажатия произошло if(PWM1EN) // если модуль включен (свет горит) { NAP1=!NAP1; // изменить направление } regim1++; // выбор режима timer_delay1=400; // время задержки нажатия первого нажатия } if(!BOT1 && bot1_retention)// кнопка нажата { if(!timer_delay1) { PWM1EN=1; // включить модуль if(NAP1) { // увеличиваем яркость brightness_chn1++; if(brightness_chn1>1023)brightness_chn1=1023; PWM1_LoadDutyValue(brightness_chn1); } else { // уменьшать яркость brightness_chn1--; if(brightness_chn1<0)brightness_chn1=0; PWM1_LoadDutyValue(brightness_chn1); } timer_delay1=SPEEDIZ; // инициализировать задержку regim1=0; AUTO_OFF1=0; // } } else if(!timer_delay1 && bot1_retention)// таймер выполнения команды == 0, флаг { // определение команды switch (regim1) { case 1: // включить выключить PWM1EN = !PWM1EN; // включить выключить канал 1 AUTO_OFF1=0; // break; case 2: // отключение по таймеру if(PWM1EN) // если модуль включен (свет горит) { AUTO_OFF1=1; // установить флаг автоотключение канала 1 timer_OFF1=TIMEOFF*2; // *2 так как отсчет идет в два раза быстрее, по 0,5 секунды } break; case 3: break; case 4: break; } bot1_retention=0; // сбросить флаг нажатия кнопки regim1=0; } } void channel_2 (void) // управление каналом 2 { if(bot2_pressure)//было нажатие клавиши { bot2_pressure=0; // сбросить флаг нажатия bot2_retention=1; // событие нажатия произошло if(PWM2EN) // если модуль включен (свет горит) { NAP2=!NAP2; // изменить направление } regim2++; // выбор режима timer_delay2=400; // время задержки нажатия первого нажатия } if(!BOT2 && bot2_retention)// кнопка нажата { if(!timer_delay2) { PWM2EN=1; // включить модуль if(NAP2) { // увеличиваем яркость brightness_chn2++; if(brightness_chn2>1023)brightness_chn2=1023; PWM2_LoadDutyValue(brightness_chn2); } else { // уменьшать яркость brightness_chn2--; if(brightness_chn2<0)brightness_chn2=0; PWM2_LoadDutyValue(brightness_chn2); } timer_delay2=SPEEDIZ; // инициализировать задержку regim2=0; AUTO_OFF2=0; // } } else if(!timer_delay2 && bot2_retention)// таймер выполнения команды == 0, флаг { // определение команды switch (regim2) { case 1: // включить выключить PWM2EN = !PWM2EN; // включить выключить канал 1 AUTO_OFF2=0; // break; case 2: // отключение по таймеру if(PWM2EN) // если модуль включен (свет горит) { AUTO_OFF2=1; // установить флаг автоотключение канала 1 timer_OFF2=TIMEOFF*2; // *2 так как отсчет идет в два раза быстрее, по 0,5 секунды } break; case 3: break; case 4: break; } bot2_retention=0; // сбросить флаг нажатия кнопки regim2=0; } }
Дополнительно не забудем их описать прототипы перед началом программы (функции main)
// функции void channel_1 (void); // управление каналом 1 void channel_2 (void); // управление каналом 1
После чего вся наша основная программа будет иметь вид
//------------------------------------------------------------------------------ void main(void) { // initialize the device SYSTEM_Initialize(); CLRWDT(); //сброс сторожевого таймера +++++++++++++++++++++- // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits // Use the following macros to: // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptEnable(); // Disable the Global Interrupts //INTERRUPT_GlobalInterruptDisable(); // Disable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptDisable(); // LD1=0; // погасить // LD2=1; // 0-погасить/1-засветить // PWM2_LoadDutyValue(0); // PWM1_LoadDutyValue(1023); while (1) { CLRWDT(); //сброс сторожевого таймера +++++++++++++++++++++- channel_1 (); // управление каналом 1 channel_2 (); // управление каналом 1 } } /** End of File */
Так все красиво и солидно, при необходимости на этом микроконтроллере можно реализовать 4 канала управления светом, для этого достаточно почитать описание, понять где будут выходы 3 и 4 канала ШИМ, добавить еще 2 кнопки управления каналами освещения.
В заключении рассмотрим подключения мощных источников света.
Для этого к выходам ШИМ можно подключить мосфеты с управление логическим уровнем к ним относятся следующие полевые n-канальные транзисторы:
Наименование | Рабочее напряжение (V) | Рабочий ток (А)при 70 С | корус |
IRLML0040TRPBF | 40 | 2,9 | SOT23 |
IRLML0100TRPBF | 100 | 1,6 | SOT23 |
IRLML2030TRPBF | 30 | 2,2 | SOT23 |
IRFML8244TRPBF | 25 | 4,6 | SOT23 |
IRF7832PBF | 30 | 20 | SOIC8 |
IRF7831PBF | 30 | 21 | SOIC8 |
Эти типы можно непосредственно подключать к портам микроконтроллера. Самое главное, что необходимо понимать при этом тепловой режим работы транзисторного ключа.
Основная тепловая выделяемая мощность образуется в момент переключения транзистора из высокоомного состояния в низкоомное. Он должен переключаться как можно быстрее. Для мосфета это актуально временем перезаряда его входной емкости затвора. В приведенных транзисторах она мала и тока контроллера достаточна для выбранной частоты ШИМа, чтобы удовлетворить эти характеристики.
Но палка о двух концах, если вам необходимо получить более плавное изменение свечения светодиодов при малой яркости необходимо будет увеличить частоту ШИМа. Или необходимо будет использовать управление более мощными нагрузками для этого потребуются так называемый драйвер который может подать и больший ток и возможно большее напряжение на затвор транзистора.
Схема с транзисторами для правления светодиодными лампами на 12 вольт
Видео работающего двухканального прототипа.
Музыка у видео:
Рекомендую еще добавить функцию автоотключения например через 6, часов, если например забыли выключить свет.
Проект к теме светорегулятор, с последними доработками.

Проект с использованием MCC часть 11 881.99 KB 270 downloads
Проект к теме светорегулятор, с последними доработками. ...Можно конечно совершенствовать проект светорегулятора, добавить таблицу преобразования изменения яркости от синусоиды, но это уже тема МСС.
В следующей главе мы начнем изучать I2C модуль…
Это может быть интересно
Регулятор влажности ch-3800
Views: 1468 И еще один проект на плате ch-c3xxx – универсальный регулятор влажности ch-3800. Регулятор позволяет работать как в режиме индикатора влажности, так и в режиме регулятора. Рабочий диапазон …Мультизоновый индикатор-терморегулятор ch-c3010
Views: 1220 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре, температуру на улице, а в погребе (или на балконе) …LCD драйвер – UC1601s
Views: 1677 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG.My libraries for Altium Designer
Views: 4135 Attention, this version of the database is outdated today. See updates in articles https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure and https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure-v23-2/ My libraries for Altium designer (Updated V – 29/05/2022) (c) 2021 …Просто о структурах и объединениях в Си
Views: 2251 Какие задачи нам позволяют решать структуры и объединения? Для разработчика встроенных систем эффективность и компактность кода всегда на первом месте. Если программировании на Ассемблере ты сам определяешь как …Проект с использованием MCC часть 13
Views: 1151 Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать. Для начала откроем наш заголовочный файл в нем очень много букв: По …Altium Designer my setup system and project structure
Views: 851 Используйте только последнее обновление!!! Updates https://catcatcat.d-lan.dp.ua/altium-designer-my-libraries-project-templates-system-settings-by-catcatcat-v23-09/ Тут хочу поделиться как я настраиваю Altium Designer и как я использую файлы DXPPreferences.DXPPrf для быстрой конфигурации и получения …Емкостной сенсор
Views: 3097 Изучаем изготовление емкостных сенсоров на PIC-микроконтроллере. Конструкция емкостных сенсоров имеет вид: Емкостные сенсоры строятся по схеме высокочастотного генератора, сам принцип основан на измерение частоты этого генератора. Частота зависит …ESP8266 применение в проектах
Views: 3659 (Актуально только для версий прошивки 1.хх) ESP8266 показала себя как надежное и безотказное устройство для обмена данными с применением WIFI. Я использую ESP8266 исключительно через UART, с применением AT …Гаджеты для домашней автоматики – Датчик приближения
Views: 2025 Управление светодиодным освещением – Датчик приближения. Данный гаджет предназначен для управления внутренним освещением мебели. Датчик позволяет определить закрытие или открытие дверцы или ящика и при этом включать или …
Комментарии