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

Visits: 986


И так создадим проект в котором при помощи двух кнопок мы сможем управлять яркостью светодиодов. При использовании МСС у нас лафа полная, добрые дяди с Microchipa подготовили функции, которыи позволяет изменять значения ШИМ, это PWM1_LoadDutyValue и PWM2_LoadDutyValue.

Надо только понимать, что их параметр это не процент, а число, в нашем случае число 10 битное, т.е. от 0 до 1023. Выполним некоторый предварительный эксперимент, добавим основной в текст нашей программы (наконец то, че нибудь своими руками напишим) две эти функции и обновим прошивку контроллера.

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(2);
    PWM1_LoadDutyValue(1023);
            
    while (1)
    {
        CLRWDT();   //сброс сторожевого таймера +++++++++++++++++++++-    
        // Add your application code
//        __delay_ms (500);
//        LD2=!LD2;  
//        LD1=!LD1;
    }
}

Перед основным циклом, закомментируем начальные настройки светиков и установим яркость LD1 100% = 1023, а яркость LD2 – 0,19% – этот значение 2. Перепрошьем микроконтроллер. И сразу заметим, что у нас изменились яркости горения светиков.

На фото видно, что первый светик горит на сто 100%, а второй еле “тлеет” ;). Нам теперь остается мелочь придумать корректное управление яркостью.

Сделаем так, при нажатии на кнопку будет изменяться переменная яркости которая будет вызывать функцию PWMх_LoadDutyValue для изменения яркости.

Конечно тыкать 1023 раза будет не интересно, можно сделать, чтобы яркость изменялась значению равном 1%, но сто раз это тоже многовато, сделаем например 10%, это 100/10= 10 шагов. Каждый шаг 1023/10 = 102. Значит так нажимаем на кнопку к значению текущей яркости прибавляется значение 51, нажимает вторую кнопку и от текущего значения вычитается 102.

Какие могут быть подводные камни, нам надо обеспечить, чтобы значение яркости не было больше 1023 и не было меньше 0.


Немного об особенностях настройки ШИМ ПИК-контроллеров

Период или частота задаются таймером Т2. Ширина импульса задается В регистрах PWMхDCL и PWMхDCH, величина ШИМ может быть меньше 10 бит и это будет зависеть от периода ШИМ, более подробно можно прочесть в описании на микроконтроллер. Для нас главное надо понять как формируется длительность.

Для того, чтобы получить сигнал при максимальном значении без импульсов, надо выбирать значение регистра PR2 < 255, если установить значение 255, то при 100% яркости мы получим наличие отрицательных импульсов ШИМ, что иногда совсем не приемлемо.

Для устранения этого нежелательного эффекта измените значение записываемое в регистр PR2, например, на 254.

Теперь при 100% яркости у нас отсутствую нежелательные импульсы. Что необходимо понять, если формируемая длительность (значение) больше значения записанного в регистр периода PR2, то на выходе ШИМ, будет логическая единица (или ноль – это зависит от выбранной полярности на выходе), Если равно или меньше, будет формироваться ШИМю При нуле, будет постоянно низкий уровень.


Для переменной яркости нам надо выбрать типа int со знаком, или в нашем проекте конкретно будет использовать такое описание int_least16_t, это число может принимать значение в диапазоне -32768 до + 32767 (описание можно посмотреть в файле stdint.h).

Первое, что надо будет сделать, мы должны использовать функции PWM в файлах pin_manager, а для этого необходимо их включить в эти файлы, в этом файле объявим и наши переменные яркости

Добавим в файл pin_manager.c описание переменных

....
#include "pwm1.h"   // для работы с ШИМ
#include "pwm2.h"   // для работы с ШИМ

int_least16_t BrightnessLED1,BrightnessLED2; // переменные значения яркости
.....

Изменим функцию обработки нажатия кнопок.

void IOCBF6_ISR(void) {

    // Add custom IOCBF6 code
    __delay_ms(10);
//    if(!RB6)LD1=!LD1;
    if(!RB6)
    {
        BrightnessLED1+=102;
        if(BrightnessLED1>1023)BrightnessLED1=1023;
        PWM1_LoadDutyValue(BrightnessLED1); 
    }
    
    // Call the interrupt handler for the callback registered at runtime
    if(IOCBF6_InterruptHandler)
    {
        IOCBF6_InterruptHandler();
    }
    IOCBFbits.IOCBF6 = 0;
}


/**
   IOCBF7 Interrupt Service Routine
*/
void IOCBF7_ISR(void) {

    // Add custom IOCBF7 code
    __delay_ms(10);
//    if(!RB7)LD2=!LD2;
    if(!RB7)
    {
        BrightnessLED1-=102;
        if(BrightnessLED1<0)BrightnessLED1=0;
        PWM1_LoadDutyValue(BrightnessLED1);
    }
    // Call the interrupt handler for the callback registered at runtime
    if(IOCBF7_InterruptHandler)
    {
        IOCBF7_InterruptHandler();
    }
    IOCBFbits.IOCBF7 = 0;
}

Скомпилируем проект.

Теперь при помощи кнопок можно управлять яркостью светодиода 1. Для того, чтобы при подаче питания светодиоды не светились изменим начальное значение в MCC для PWM = 0%.


Проект для изучения 

Значок

Проект с использованием MCC часть 08 739.74 KB 75 downloads

И так создадим проект в котором при помощи двух...


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


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


  • MAX7219/21 и 8х8 LED дисплеиMAX7219/21 и 8х8 LED дисплеи
    Visits: 903 MAX7219, MAX7221 предназначены для вывода информации на 8 разрядов семисегментного индикатора, но на нем легко организовать вывод на светодиодные индикаторы 8х8. продолжение следует…. Это может быть интересно Метки: MAX7219, …
  • Проект с использованием MCC часть 14Проект с использованием MCC часть 14
    Visits: 782 С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем …
  • Проект с использованием MCC часть 07Проект с использованием MCC часть 07
    Visits: 924 Модуль PWM – широтно импульсная модуляция (ШИМ). ПИК контроллеры часто на борту имеют модули ШИМ. На их основе строятся многие узлы управления электро приводами. В нашем варианте мы …
  • Проект с использованием MCC часть 16Проект с использованием MCC часть 16
    Visits: 1033 Продолжим изучение EUSART. На этом этапе отработает передачи данных с ПК и получения эха. Для этого в основной цикл программы добавим код if(EUSART_DataReady) // проверим флаг готовности данных …
  • Temperature measurement with NTC thermistor.Temperature measurement with NTC thermistor.
    Visits: 216 Проекты в которых присутствовало измерение температуры начинал с цифровых датчиков, т.к. в них все просто и не надо ничего преобразовывать и вычислять. При использовании цифровых датчиков ты получаешь …
  • VU Meter Tower ART – part 2VU Meter Tower ART – part 2
    Visits: 948 Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, …
  • Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)
    Visits: 3162 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
  • Униполярный шаговый двигатель – часть 2Униполярный шаговый двигатель – часть 2
    Visits: 762 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …
  • HVLD модуль на примере PIC24FJ128GA204HVLD модуль на примере PIC24FJ128GA204
    Visits: 606 HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что …
  • LED драйвер TM1639LED драйвер TM1639
    Visits: 2140 TМ1639 позволяет работать на матрицу 8*8 или 8 семисегметных индикаторов. Может работать как на индикаторы с общим катодом, но и есть возможность подключать общим анодом. Для управления драйвером …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

Комментарии

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

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