Программный не знаю, а аппаратный есть в PIC18F1230, PIC18F1330. Подробнее смотри даташит. Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
interrupt inc(pwm_val) // для одного канала PWM if ch1_PWM<pwm_val then low(portc.0) else high(portc.0) end if // для других каналов то же самое end interrup
Сколько бит должно быть в ШИМе. 8,16,10. От этого и пляшем.
Quote (DAlexV)
1 таймер период прерывания - один шаг PWM.
частота прерывания прерывания=период ШИМ / кол-во шагов ШИМ. Допустим частота ШИМ 10ms, Разряжность ШИМ 8 Бит(0-255) 10ms/256=0,0390625ms выставляем таймер 1 на прерывание в 0,0390625ms внутри прерывания есть переменная pwm_val.Это счетчик шагов. Он увеличивается на 1 при каждом прерывании. Далее сравниваем это значение со значениями для каждого канала ШИМ (ch1_PWM, ch2_PWM, ch3_PWM и т.д.) если значение меньше чем значение счетчика значит оставляем порт без изменений, если достигло или больше, то меняем состояние порта. Рабочий пример в данным момент не могу выложить, т.к. есть некоторые запарки с Лицензией, да и это будет на SwordFish Basic, а у него есть некоторые расхождения PBP и Протоном. Так что извини. Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Абсолютлих верно !!!!! И еще что бы не наступал на мои грабли if ch1_PWM<pwm_val then low(portc.0) else high(portc.0) end if сравнение if then else лучше оставить. если сделать только if и then, то будет наблюдаться смещение прохождения прерывания по времени. Хотя это уж от конкретно поставленной задачи. Рад помочь Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)