|
Модуль 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.
|
|
|