在刚才的实验中,使用 GP8500,将STC32G单片机发送的PWM波形转换成模拟信号。在这个过程中,会发现输出有一些毛刺。信号中的毛刺主要是因为输出PWM的波形出现了抖动。可以看到,在抖动前面和后面的PWM占空比不同。由此可以知道,在这中间,单片机对PWM的比较单元进行了数值更新。更新前后,GP8500输出的电压不同。那么问题来了,如何能够避免PWM中寄存器更新的过程中,出现输出脉冲抖动的情况呢?下面讨论一下这个问题的解决方案。
▲ 图1.1.1 输出信号中的毛刺
在 STC32G数据手册中,对于更新PWM模块中 CCR寄存器有相应的说明。需要对 CCMR寄存器中的 OCnPE位进行设置。如果设置为0,则更新后的数值会立即生效。否则,只有当PWM模块出现更新事件之后,CCR寄存器才会更新写入的数据。可以看到,在程序中,之前对于比较寄存器预装使能位没有置1,疏忽了。现在将它修改过来,重新测试,就会发现,前面遇到的输出毛刺信号就消失的无影无踪了。
▲ 图1.2.1 修改之后,输出波形就没有毛刺了
本文记录了 STC32G单片机中 PWM 比较寄存器更新的问题。如果使能比较寄存器预存功能,可以避免输出PWM波形出现抖动现象。这就会让 GP8500 这颗PCA芯片的输出信号中不会出现毛刺。那么问题来了,既然PWM 比较寄存器的预存功能如此重要,为何还会存在一种设置,来取消这种预存功能呢? 这种预存功能取消之后,会适合应用在什么情况下呢?
利用PWM输出模拟电压:STC32G 驱动 GP8500: https://zhuoqing.blog.csdn.net/article/details/144979365