Проект с использованием MCC часть 11

Views: 825


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

При этом мы получим две функции (обратим внимание на изменения, добавим условие авто отключение, эта функция активируется, только если канал включен, отключение авто отключения когда активируется другие функции канала):

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 вольт

 

 Видео работающего двухканального прототипа.

Музыка у видео:

 

Композиция “Vanishing Horizon” принадлежит исполнителю Audionautix. Лицензия: Creative Commons Attribution (https://creativecommons.org/licenses/by/4.0/).
Исполнитель: http://audionautix.com/

Рекомендую еще добавить функцию автоотключения например через 6, часов, если например забыли выключить свет.


Проект к теме светорегулятор, с последними доработками. 

Значок

Проект с использованием MCC часть 11 881.99 KB 270 downloads

Проект к теме светорегулятор, с последними доработками. ...


Можно конечно совершенствовать проект светорегулятора, добавить таблицу преобразования изменения яркости от синусоиды, но это уже тема МСС.

В следующей главе мы начнем изучать I2C модуль…


Это может быть интересно


  • Стробоскоп для автомобиляСтробоскоп для автомобиля
    Views: 2148 Одним из популярных решений светового тюнинга автомобиля, мотоцикла или скутера стал эффект –  “полицейский стробоскоп“. На база платы ch-c0050 реализовано несколько проектов. В этой статье приводятся две версии …
  • Мультизоновый индикатор-терморегулятор ch-c3010Мультизоновый индикатор-терморегулятор ch-c3010
    Views: 1154 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре,  температуру на улице, а в погребе (или на балконе) …
  • Простой сенсорный регулятор светаПростой сенсорный регулятор света
    Views: 2301 Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня …
  • Customs codes for exportCustoms codes for export
    Views: 89   Митні коди (HS Code) для надсилання посилок за кордон. Для відправки товару за кордон на сьогодні необхідно зазначати митні коди. Часто визначення коду займає багато часу. Для …
  • Часы + Календарь + Термометр + …Часы + Календарь + Термометр + …
    Views: 2679 Часы + Календарь + Термометр + Индикатор влажности + Секундомер + Дистанционное управление на ИК лучах (пульты на RC-5 протоколе) + Автоматическая регулировка яркости + Возможность вывода данных через USB, …
  • Часы-кухонный таймерЧасы-кухонный таймер
    Views: 3929 Каждая кухня должна иметь кухонный таймер, который позволяет напоминать хозяйке когда проходить определенный промежуток времени. Например, печем пирог, варим яйца… , чтобы не смотреть постоянно на часы, установим таймер и …
  • Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3
    Views: 3447 Технология обновления следующая: Загружаем программу со страницы espressif.com. Разархивируем. Где находятся файлы, для прошивки? Заходим в каталоги Подключаем по схеме в статье WiFi ESP8266 (замыкаем BT2, перемычка). Запускаем программу, …
  • Acquaintance with audio-bluetooth modules F-6888 (BK3254).Acquaintance with audio-bluetooth modules F-6888 (BK3254).
    Views: 2127 Для проектов появилось необходимость познакомиться с недорогими модулями китайского производства, которые можно приобрести у нас в Украине и у китацев, на алиэкспрессе. Так как меня интересует не просто, …
  • УКВ – радиоприем, часть 2УКВ – радиоприем, часть 2
    Views: 6188 Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального …
  • DS18B20 – удаленный контроль температурыDS18B20 – удаленный контроль температуры
    Views: 3021 Контроль температуры с использованием датчиков температуры DS18B20 и платы ILLISSI-4B-09-primum Проект позволяет подключать к плате ILLISSI-4B-09-primum до 16 датчиков температуры DS18B20, удаленных более 300 метров,  и выводить информацию …



Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее

Комментарии

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.