Views: 996
Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость работы проекта, а если таких улучшений будет много, то это значительно может снизить скорость работы программного продукта, но у нас это единственные функции, так, что такое изменение приемлемо.
При этом мы получим две функции (обратим внимание на изменения, добавим условие авто отключение, эта функция активируется, только если канал включен, отключение авто отключения когда активируется другие функции канала):
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 модуль…
Это может быть интересно
Проблемы классической светомузыкиViews: 2180 Светомузыка – что это такое? Определение: Светомузыка (жаргонное: цветомузыка) — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …
Регулятор влажностиViews: 1361 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …
Temperature measurement with NTC thermistor.Views: 661 Проекты в которых присутствовало измерение температуры начинал с цифровых датчиков, т.к. в них все просто и не надо ничего преобразовывать и вычислять. При использовании цифровых датчиков ты получаешь …
Защита датчиков температуры DS18B20 от статического электричестваViews: 1971 Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, …
OLED RET012864E/REX012864JViews: 1595 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
MCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМViews: 1267 Во многих системах управления, для формирования управляющих сигналов требуется модуль ШИМ, он позволяет не только формировать импульсы заданной длительности, но и с применением обычного RC фильтра строить простые …
Интерактивные LedViews: 604 Тема проекта продолжение следует…. Это может быть интересно
Простой цифровой милливольтметр постоянного токаViews: 4220 Простой цифровой вольтметр постоянного тока. Три диапазона измерений с автоматическим переключением 1 – 0,001 – 0,999 V, 2 – 0,01-9,99 V, 3 – 0,1-99,9. Четыре управляемых выхода с возможностью задания функции контроля …
Светодиоды со встроенным драйвером WS2812BViews: 1043 Производитель http://www.world-semi.com Краткое описание продукции фирмы Каталог продукции” catcatcat_ws_19 catcatcat_ws_15 catcatcat_ws_11 catcatcat_ws_07 catcatcat_ws_03 catcatcat_ws_18 catcatcat_ws_14 catcatcat_ws_10 catcatcat_ws_06 catcatcat_ws_02 catcatcat_ws_05 catcatcat_ws_09 catcatcat_ws_13 catcatcat_ws_17 catcatcat_ws_16 catcatcat_ws_12 catcatcat_ws_08 catcatcat_ws_04 catcatcat_ws_01 This jQuery …
Униполярный шаговый двигательViews: 2440 В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …

Комментарии