最近做的项目需求如下:
用二个定时器各产生一个占空比为50%的PWM方波,二个方波频率相同
一个是固定不变的,作为基准,另一个相对这个基准,以1微秒为单位进行可调的移相
基于二个PWM同时初始化,其相位差是固定的,现在做法是在二个初始化函数之间,加微秒延时程序,可以使二个PWM之间的相位以微秒移相。经测试移相是没问题。
但每次移相时,会同时对基准PWM进行初始化,是否会造成基准方波的不连续?
如果有上述问题,想法是使用一个IO来检测基准方波(不使用中断),检测到上升沿或上降沿后,微秒延时,然后初始化需要调相的PWM输出,这样不需初始化基准PWM输出,但占用一个IO口。
是否有标准或更简单的方法,做过的,有何建议?
还有,如果我需要PWM输出指定个数的方波,有什么方式对方波计数比较好?
看过香水城版主的关于PWM调相的建议方法,不过没太明白:
“
实现方法如下:
STM32的定时器的PWM模式使用TIMx_ARR寄存器控制PWM输出的频率,使用TIMx_CCRx寄存器控制PWM输出的占空比,如果需要移相,只需要在希望移动相位的时刻临时增加或减少TIMx_ARR寄存器的内容,过一个周期之后再恢复TIMx_ARR的内容即可。
这里的一个关键问题是,TIMx_ARR寄存器拥有影子寄存器,改变它的内容时并不会立即影响输出的信号波形,而是在输出波形的一个完整周期结束时才会把影子寄存器的内容拷贝到实际操作的寄存器,这样就可以保证输出波形的每一个周期都是完整的。如果没有影子寄存器,实现这种移相的要求是比较困难的,软件程序很难能够精确地对齐输出波形的周期边缘。” |