上一篇文章讲到了用通用定时器模拟PWM信号输出,这一篇就讲一下用PWM定时器进行PWM输出吧。平台还是中颖SH79F3214。
这次是另外一个需求,需要控制一个风机并进行调速,风机的输入控制信号为PWM信号,推荐频率为20kHz。
基于这个需求,首先频率并不是很低,然后就是硬件电路无限制,因此这里使用了PWM定时器来完成PWM的输出功能。
首先确认中颖SH79F3214芯片的PWM信号输出引脚为26脚,P0.3。
在硬件上,将这个引脚连接到风机的PWM输入脚上即可,中间可以串一个100欧姆的电阻做保护。
然后就是软件上的工作。基本的程序框架在这里就不写了,这里只写和PWM输出控制相关的内容。
首先是PWM定时器的初始化。
首先,这颗芯片的PWM寄存器是有保护寄存器PWMLO的,只有在PWMLO寄存器的值为0x55的情况下才可以修改其他相关寄存器的值,因此这里首先把PWMLO赋值为0x55,并在配置完成后清零PWMLO。
然后就是配置PWM模块的时钟和周期及占空比的初始值,以及启动PWM定时器。
这里我并没有打开PWM定时器的中断,因为PWM输出是自动的,无需在中断里进行处理,因此没有开启。
如果开启了PWM定时器的中断的话,这个中断完全可以当成一个通用定时器的中断来使用。
到这里其实就已经配置好PWM定时器了,只要初始化的时候调用了这部分,对PWM完成初始化之后,P0.3引脚上就应该有PWM信号输出了。
IO口无需进行额外配置,只要PWM输出功能开启,P0.3引脚就是PWM功能,这是这个引脚的优先功能。
实际测试一下看看效果,却发现并没有按照预想的情况输出PWM信号,引脚上电平保持不变。
然后修改PWM周期寄存器和占空比寄存器进行尝试,发现有时候会出现PWM信号输出,但是并不是按照计算好的周期和占空比进行输出的,感觉完全对不上配置值。
到这里就非常疑惑了,按理说这个配置比较简单,应该不会出错的啊……
后面经过咨询用中颖MCU比较多的同事,被告知了一个信息:中颖MCU的PWM寄存器,在配置的时候必须先配置低位,再配置高位,所有的配置信息才会完全生效,因为它是将寄存器高位的赋值信号作为写入信号,在接收到这个信号的时候,统一写入寄存器的高低位的。
因此如果先写高位后写低位的话,其实低位的写入动作是无效的。
然后我特意去芯片手册上找,结果也没找到这部分的说明……
不过总算找到问题所在,重新修改一下初始化代码。
然后再次进行测试,发现一切正常,完全按照预想的信号进行输出。
解决这一问题之后,继续写PWM占空比调整功能,这里也是通过按键进行调整,按键识别部分就不贴了,这里放上调整部分的代码。
首先,这里的占空比调整范围为0%到100%,即全范围调整,调整步长为5%,即整个档位分为20次调整量,每次调整5%。
在这里写入PWM占空比寄存器的时候,也要记得开启保护寄存器,即将PWMLO寄存器写入0x55,并在写入完成后清零该寄存器。同时记得占空比寄存器要先写低位再写高位。
代码写完之后编译下载,测试运行,效果非常不错,完全达到了预想的效果。
这次的分享就到这里了,下次再见。
---------------------
作者:blust5
链接:https://bbs.21ic.com/icview-3198816-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。