Вы вошли на сайт, как Гость
Регистрация

Модуль CCP1 как ШИМ генератор (PWM)

Модуль CCP1 как широтно-импульсный генератор (PWM)
(Example №3)

Этот пример иллюстрирует использование CCP1 модуля в режиме ШИМ. Чтобы сделать схему более интересной, длительность выходных импульсов P1A (PORTC, 2) может быть изменена с помощью кнопок отмеченных как "DARK" и "BRIGHT". Во время работы модуль находится под контролем специальных функций, принадлежащих специализированной библиотеки PWM. Некоторые из них:

PWM1_init имеет прототип: void Pwm1_Init(long freq);
Параметр freq задаёт частоту PWM сигналавыражается в Герцах. В этом примере freq = 5kHz.
PWM1_Start имеет прототип: void Pwm1_Start(void );
PWM1_Set_Duty имеет прототип: void Pwm1_Set_Duty(unsigned short duty_ratio). Параметр duty_ratio устанавливает длительность импульса в последовательности импульсов.

/*Header******************************************************/

unsigned short current_duty, old_duty;   // Определение переменных
                                         // current_duty и old_duty

void initMain() {
    ANSEL = 0;                           // Все порты I/O настроены как цифровые
    ANSELH = 0;
    PORTA = 255;                         // Начальное состояние порта A
    TRISA = 255;                         // Все входы порта А настроены на ввод
    PORTB = 0;                           // Начальное состояние порта B
    TRISB = 0;                           // Все входы порта B настроены на вывод
    PORTC = 0;                           // Начальное состояние порта С
    TRISC = 0;                           // Все входы порта С настроены на вывод
    PWM1_Init(5000);                     // Инициализация PWM модуля (5KHz)
}

void main() {
    initMain();
    current_duty = 16;                   // Начальное состояние параметра current_duty
    old_duty = 0;                        // Сбросить переменную old_duty
    PWM1_Start();                        // Запуск PWM1 модуля
    
    while (1) {                          // Бесконечный цикл
        if (Button(&PORTA, 0,1,1))       // Если кнопка подключенная к RA0 нажата
            current_duty++ ;             // увеличить параметр current_duty
        
        if (Button(&PORTA, 1,1,1))       // Если кнопка подключенная к RA1 нажата
            current_duty-- ;             // увеличить параметр current_duty
        
        if (old_duty != current_duty) {  // Если current_duty и old_duty не равны
            PWM1_Set_Duty(current_duty); // установить PWM с новыми параметрами,            
            old_duty = current_duty;     // сохранить новое значение
            PORTB = old_duty;            // и показать их в порте B
        }
        
        Delay_ms(200);                   // 200мс задержка
    }
}

Для того чтобы этот пример работал правильно, необходимо подключить дополнительные библиотеки для работы c PWM и Button.