生成PWM波的话,根据芯片手册的描述,GTIM跟ATIM都有硬件生产PWM波的功能,但是ATIM明显功能更为强大,还能生成互补PWM这种特殊PWM波。互补PWM带死区插入的话,是常用于电机控制的一种PWM控制方式。接触了电机控制也有好些年头,那就用ATIM来试试基本的带死区的互补PWM输出吧。
按照惯例,还是从例程入手,找到了一个应该是互补输出的PWM例程。
打开看了一段时间,大概看出了有配置互补的两个PWM信号,但是配置项的具体作用不是很清楚。对于ATIM这种复杂一些的外设,因为配置项较多,建议是在代码中直接加入一些中午注释,有助于用户理解。毕竟要是每一项都是去看芯片手册,去看具体寄存器,还是要花不少精力。
因为代码注释较少,我参考了一下文档:
一开始还很奇怪互补PWM跟LED灯有啥关系,然后查了一遍代码,并没有使用到PB14这个引脚,说明这个文档还是存在一些错误。建议原厂核查改正。
基于例程,简化了一下代码,把printf功能给去掉了。然后编译后烧入板子。
由于我自己手上是没有示波器的,所以只能用逻辑分析仪来替代一下测量波形,但可能精度不是特别的准,微小的偏差就当略掉。
由上图可以看到PWM的周期是99.83us,略去精度误差,是符合我们设置的100us周期的。而且两个PWM波的高电平之间也存在死区。
我们再根据死区芯片手册计算一下死区时间
由上面可以,计算这个死区时间需要两个量,一个是DTR数值,一个是ATIM的步长时间。
由代码设置及DTR寄存器值,可知道步长为1us,DTR为1,则死区时间为(1+2)*1us = 3us。然后我们再测一下时间波形
测量的死区时间就是3us,符合预期。
至此,PWM的带死区互补输出测评完成。
|