这次给出2路互补PWM的示例程序及输出波形,程序如下:
#include"holychip_define.h" /*************************************************************************************** * @实现效果 PC0,PC2输出频率为3.9KHz的方波,占空比为50%,死区时间为64微秒 ***************************************************************************************/ void main() { /***************************************系统初始化*************************************/ OSCCON = 0x04; //Fosc=32MHz,Fcpu四分频2T /************************************IO初始化******************************************/ ANSELC = 0xFF; TRISC = 0xFF; //PC0,PC2设置数字输出模式 /****************************************PWM初始化*************************************/ PWMMAP = 0x11; //PWM引脚映射PC2 PC0 FLTMODE = 0X00; //禁止故障检测 PWM0C = 0x01; //时钟源RC32MHz/8 PWM0C |= 0x00; //PWM0和PWM01均为高有效 PWMM = 0x01; //互补输出模式,自动重载 PWM0PH = 0x03; PWM0PL = 0xFF; //PWM0周期 = [ PWM0PH : PWM0PL] * PWM0工作时钟源周期 // = 1023*(1/4000000) // = 256 us PWM0DH = 0x01; // PWM占空比=0x1FF*(1/4000000)/256=50% PWM0DL = 0xFF; PWM0DTH = 0X00; //互补模式下,设置死区时间=0x00FF*(1/4000000)≈64us PWM0DTL = 0xFF; PWMEN = 0x11; //PWM0和PWM01使能 while(1) { } }
关键指令为:PWMM = 0x01; //互补输出模式,自动重载
实际测试PC0和PC2的输出波形见下图:
黄色标记的PC0的输出波形,粉色标记的是PC2的输出波形。可以看到,PWM的周期为256微秒左右(f=3.91119kHz,T=1/f=255.63μS≈256μS)。占空比和死区时间也大体匹配。