概述
在开发电机和电源应用时,如何利用PWM定时器模块灵活高效地实现所需PWM波形的输出是很多开发者关心的问题。在上一篇文章中,我们介绍了PWM定时器模块中的一些概念以及如何生成普通PWM的过程。本文将继续介绍互补PWM、同步PWM、异相PWM以及PWM如何使用ACMP收波。
互补脉宽调制
对于相同的代码部分,这里不再重复解释。请参考“第1部分”中对普通PWM的说明。
这里设置了三个比较器:cmp_config[0]和cmp_config[1]用于生成中心对称PWM,cmp_config[2]用作PWM影子寄存器的更新事件源。当CNT等于cmp_config[2]时,影子寄存器写入寄存器即可生效。
对于互补PWM 对的配置,将左死区宽度配置为8000 half_clocks,将右死区宽度配置为16000 half_clocks。
将cmp_config[2] 设置为PWM 影子寄存器的更新事件源并启动计数器。
通过修改CMP0和CMP1的值,互补PWM占空比每100ms更新一次。运行结果如下:
互补脉宽调制
同步脉宽调制
本节实验设计:利用PWM0的比较器比较事件做PWM1、PWM2、PWM3的同步事件。因此,从输出波形来看,PWM1、PWM2、PWM3应该完全同步,而PWM0不应该与它们同步。代码如下所示:
为4 个PWM 定时器启用SYNCI 信号。
设置STA 和RLD。
cmp_config[0] 和cmp_config[1] 用于制作中心对称PWM 所需的比较器。
cmp_config[2] 用作比较器来启用PWM 影子寄存器。
cmp_config[3] 在PWM0 CH8 上设置,以生成比较事件并同步PWM1、PWM2 和PWM3。
互补PWM 的死区设置和输出设置。
设置PWM0 CH0 CH1 互补输出,同时设置PWM1 CH8 使用CMP3 产生比较事件。
设置PWM1、PWM2、PWM3 互补输出。
启动计数器。
以下代码是互连管理器的配置。配置PWM0 CH8 的下降沿输出到TRGM0_OUTX0。同时,TRGM0_OUTX0 作为TRGM1、TRGM2 和TRGM3 的输入,并路由至PWM1、PWM2 和PWM3 的SYNCI 信号。
波形如下:
可以看出,PWM1、PWM2、PWM3完全同步,而PWM0与它们有20ns的不同步。
同步脉宽调制
异相脉宽调制
本节实验设计:使用SYNT实现PWM0、PWM1、PWM2、PWM3异相90。代码如下所示:
上述代码请参考上面“同步PWM”章节的解释。主要目的是产生4对互补的PWM。
配置TRGM 将SYNT CH0 的比较事件路由到PWM0 的SYNCI 信号,将SYNT CH1 的比较事件路由到PWM1 的SYNCI 信号,并将SYNT CH2 的21/24 第一个半导体比较事件路由到PWM2 的SYNCI 信号,将SYNT CH3 的比较事件路由至PWM3 的SYNCI 信号。
配置SYNT并将SYNT CH0比较器比较值设置为0,SYNT CH1比较器比较值重新加载/4,SYNT CH2比较器比较值重新加载/2,SYNT CH4比较器比较值重新加载*3/4。
波形如下:
异相脉宽调制
PWM+ACMP 阻波
本节实验设计:使用两个片内ACMP监控目标模拟电压,当电压超过1.65V时停止PWM输出。基本思想是通过互连管理器TRGM将ACMP的输出信号路由到PWM的内部故障信号。当故障信号有效时,PWM波停止输出(故障保护功能)。
代码如下所示:
初始化PWM引脚,初始化DAC时钟和引脚(使用DAC输出模拟电压到ACMP来模拟过压)。
输出互补PWM波。
设置Fault信号为高电平有效;使能FaultI0和FaultI1有效(PWM共有4个内部故障信号和2个外部故障信号,哪些信号有效是可选的)。
将DAC输出设置为直接模式,12bit DAC输出范围为0~4095,4030约为3.247V。这部分代码请直接参考DAC例程。
配置ACMP并启用ACMP2和ACMP3。
配置互连管理器,将ACMP2 和ACMP3 的输出信号路由至PWM 的故障I0 和故障I1。
acmp_config函数源码如下:
代码中选择ACMP的正输入作为IO引脚,负输入选择ACMP内部专用DAC,参考电压设置为0x80,即1.65V。
当IO引脚电压为3.247V(来自外设DAC输出)时,ACMP正电压超过负电压1.65V,ACMP输出有效,为高电平;通过互连管理器路由至PWM 的故障信号;由于PWM 模块将故障信号配置为高电平有效,因此此时故障信号有效,PWM 波形停止输出。
当IO引脚电压为0V(引脚短接GND)时,ACMP正电压不超过负电压1.65V,ACMP输出无效,正常输出PWM波形。
脉宽调制+ACMP
概括
本文首先介绍了PWM定时器中各个模块的基本概念和功能,然后通过代码示例由浅入深地讲解了PWM的使用。可见,使用PWM只需要配置STA、RLD、CMPx、影子寄存器等即可实现输出;如果需要与其他外设进行同步或配合,主要是通过互连管理器TRGM的配置来实现。
审稿人:刘庆