本次实验利用CH549的PWM模块,分别在P22、P23、P24、P25引脚上输出4路不同占空比PWM波,并利用逻辑分析仪对占空比进行检测。
一、实验资源
1、CH549EVT学习开发板;
2、Keil v5.28.0.0;
3、CH549开发资料汇总.rar;
4、WCHISPTool v2.70;
5、CH549EVT其它相关文档;
6、逻辑分析仪;
二、实验准备
1、CH549的PWM资源。CH549提供了8路可以动态修改输出占空比的PWM,通过P2[7:0]引脚对外输出。使用中要注意的是8路PWM输出的编号与P2端口号并不是“数值对应”关系。
2、与PWM相关的寄存器。寄存器看着比较多,但是应用还是比较简单的;
在这8路PWM输出中的PWM1与PWM0还可以通过软件设置更改输出极性。通过PWM控制寄存器PWM_CTRL中的“bPWM1_POLAR ”和“bPWM0_POLAR ”进行设置,这两路输出使能控制也在此寄存器中;PWM控制寄存器PWM_CTRL2对其余6路PWM输出进行使能控制。PWM_CTRL中的“bPWM_MOD_6BIT”确定了PWM波型的周期值,可以选择8位数据或6位数据,8位数据精度相对于6位要高不少。PWM_DATAn中存放的数据决定了PWM输出的占空比。根据“bPWM_MOD_6BIT”的设置,占空比分别可以这样计算:PWM_DATAn/256(8位数据);PWM_DATAn/64(6位数据)。PWM时钟分频设置寄存器“PWM_CK_SE”中的数据决定了PWM输出频率,个人理解应该就是PWM输出频率的分频系数。
三、本次实验
根据上述学习了解,为PWM配置了4路输出,分别是PWM3、PWM2、PWM1、PWM0,与接有LED的P22、P23、P24、P25对应。P2的这四个端口也同时被配置为推挽输出。
在实验程序中将Fsys时钟直接飙到了48MHz,并为这4路PWM输出配置了不同的占空比。主要测试代码如下:
void PWM_Config(void)
{
PWM_CTRL = 0x02; //默认值。选择8位数据PWM周期为256;清空PWM计数和FIFO
PWM_CK_SE = 1; //设置PWM时钟分频除数Fsys/1=48M
/*使能PWM输出,注意PWM1、PWM0输出使能位在PWM_CTRL;其余在PWM_CTRL2*/
PWM_CTRL2 |= bPWM3_OUT_EN; //PWM3输出使能,该位为1使能 PWM3输出 P22
PWM_CTRL2 |= bPWM2_OUT_EN; //PWM2输出使能,该位为1使能 PWM2输出 P23
PWM_CTRL |= bPWM1_OUT_EN; //PWM1输出使能,该位为1使能 PWM1输出 P24
PWM_CTRL |= bPWM0_OUT_EN; //PWM0输出使能,该位为1使能 PWM0输出 P25
/*预置PWM输出点空比,为便于观察预置了特殊数值*/
PWM_DATA3 = 32; //P22 Duty = 12.5%
PWM_DATA2 = 64; //P23 Duty = 25%
PWM_DATA1 = 128; //P24 Duty = 50%
PWM_DATA0 = 192; //P25 Duty = 75%
PWM_CTRL &= ~bPWM_CLR_ALL; //清零,恢复PWM计数和FIFO
}
void CLK_Config(void)
{
SAFE_MOD = 0x55;
SAFE_MOD = 0xAA; //进入安全模式
CLOCK_CFG = 0X87; //使能内部晶振,Fsys=48MHz
}
void main()
{
CLK_Config(); //CH549时钟配置48M
mDelaymS(20);
GPIO_Init(PORT2,PIN2|PIN3|PIN4|PIN5,1);//PWM输出口配置为推挽输出
PWM_Config();
while(1)
{
}
}
四、实验结果。
五、实验总结
CH549的PWM模块使用很简单,也比较灵活。按照手册中的介绍,PWM输出还能通过简单RC电阻电容进行积分低通滤波,做为低速数模转换器DAC使用。真不错!
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处