这次给出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)。占空比和死区时间也大体匹配。
我要赚赏金
