打印
[STM32F1]

PWM的相位调整问题

[复制链接]
2259|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
at0755|  楼主 | 2014-1-18 00:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近做的项目需求如下:
用二个定时器各产生一个占空比为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寄存器拥有影子寄存器,改变它的内容时并不会立即影响输出的信号波形,而是在输出波形的一个完整周期结束时才会把影子寄存器的内容拷贝到实际操作的寄存器,这样就可以保证输出波形的每一个周期都是完整的。如果没有影子寄存器,实现这种移相的要求是比较困难的,软件程序很难能够精确地对齐输出波形的周期边缘。”
沙发
huzi2099| | 2014-1-18 11:30 | 只看该作者
如果用两个定时器简单但是精确控制相位会比较难.
如果一个定时器你用中央对齐模式分别控制上计数和下计数周期的pwm就行了.

使用特权

评论回复
板凳
huzi2099| | 2014-1-18 11:37 | 只看该作者

更新时通过影子刷新ARR,单个pwm周期只有一次写有效.

使用特权

评论回复
地板
airwill| | 2014-1-18 16:15 | 只看该作者
1. STM32的定时器的PWM模式使用TIMx_ARR寄存器控制PWM输出的频率,使用TIMx_CCRx寄存器控制PWM输出的占空比,如果需要移相,只需要在希望移动相位的时刻临时增加或减少TIMx_ARR寄存器的内容,过一个周期之后再恢复TIMx_ARR的内容即可。
这个办法很好, 当然影子寄存器可以屏蔽掉的.
其实还有用一个定时器的办法. 用两个通道, 双边沿方式计数, 一个通道50% 不用变, 另一个通道通过修改 CCRx 在上升沿和下降沿不同的值来实现.
对比: 方法1 软件相对简单一些, 但缺点是移相多少不能直接知道. 出错概率大, 恢复同步的操作不方便

使用特权

评论回复
5
at0755|  楼主 | 2014-1-18 23:21 | 只看该作者
谢谢二位,我试试二个通道输出,其中一个中央对齐方式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

59

帖子

1

粉丝