本文主要是介绍PWM移相以及占空比可变,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在 PWM移相以及占空比可变(上) 一文中,我讲述了如何实现两路PWM输出相位差在0-180°范围内任意可调的实现逻辑,但是在后续的实验过程中,发现实现逻辑出现错误,导致PWM输出只有在固定占空比的情况下才能实现相位可调。而下文则是对于如何正确实现 PWM移相以及占空比可变 进行讲解。
注意:
- 本文使用的是STC8h1k08单片机进行实验。
- 本文使用I/O口分别为 P11、P34,其中P11为通道1--CH1,P34为通道2----CH2。
- 本文中,CH1的预装载重装值为 AAR1=2000,CH2的预装载重装值为 ARR2。
- 本文
一、PWM的2种输出方式
我们要使用 STC8H 高级定时器的PWM输出模式以及输出比较模式,其中 CH1 为 PWM 模式,CH2 为 输出比较模式。
1.1、PWM模式
上图清晰的展示了PWM输出模式下 PWM 输出的基本原理,这里不在赘述,不懂的小伙伴可以自行学习。
1.2、输出比较模式
输出比较模式通俗来说 是CNT = CCR时 电平会翻转。例如 你配置了 向上计数,ARR=100, CCR=30,初始电平为高电平,那么 CNT从0计数到30时, CNT =CCR =30,此时高电平就会跳变到低电平,CNT继续在30的基础上计数,直到计数到100并溢出,此时CNT会置0并重新开始计数。
值得注意的是,PWM模式与翻转模式下所输出的波形频率是相差 2倍的,即 PWM输出频率为10HZ,那么输出比较模式下的输出频率只有5HZ。如下图
这是因为 输出比较模式下不关心CNT比 CCR值大还是小,只关心CNT和CCR值什么时候相等,两个值相等时,就翻转输出电平。在PWM模式下,CNT值从0增加到ARR一个周期内输出电平有两次变化(超过CNT=CCR临界值时跳变一次,CNT溢出置零跳变一次),而在输出比较模式下时CNT值从0增加到ARR一个周期内输出电平只有一次变化。所以输出比较模式下,定时器输出方波的频率为PWM模式下定时器输出方波频率的一半。(该段内容源自--生成两路PWM波相位差90°的方法)。
那么如何使输出比较模式下输出的波形频率与PWM输出的波形频率一致呢。其实主要是如何实现在同一个ARR周期下,输出比较与PWM的电平有两次变化。这个将在下文讲解。
二、自动重装值ARR 与 移相角度关系
2.1、PWM模式移相
以上图为例,我们先用PWM模式输出实现45°移相,其中ARR为2000,占空比为50%。
那么问题来了,我是如何判断或者我的逻辑是如何让他实现45°移相的呢?
其实很简单,我们把 ARR=2000 与 角度 360°一一对应起来,或者说是360°均分为 ARR 份。那么我们要移相 45°,即A点与B点相差45° ,现在要求的是 A点的CCR 与 B点 的CCR相差多少,已知B点的CCR的值 。通过计算我们很快就可以得出,A点与B点的 CCR的差值为 250,那么我们只需要在配置的时候,把两路PWM的CCR的值相差250,即可实现 45°的移相。
同理我们要实现90°的移相,那么A点与B点的CCR值应该相差多少? 通过计算 可以的到
那么只要确定其中一路的CCR, 那么另外一路CCR便可以确定。
以上是在 ARR=2000 的情况下得到的,那么ARR是其他的值的时候我们该如何求得 A点与B点的 值呢?
公式如下:
其中, ARR为自动重装值,x取值为(0-180°),为你所需要的角度 。
2.2、输出比较模式移相
2.2.1、输出比较的频率问题
输出比较模式相比较与PWM模式有一个需要解决的问题就是频率不一致的问题。我们需要将输出比较模式 输出的波形频率调成与 PWM模式输出的波形频率一致才可以进行下一步的移相工作。
那么我们该如何进行操作呢?
在1.2、输出比较模式 结尾我提到过,主要是如何实现在同一个ARR周期下,输出比较与PWM的电平有两次变化。
我们以 PWM模式输出的波形为基准,其中ARR1=2000,占空比为50%(即CCR1=1000)。
那么 我们假设第一个CCR2为0,即CCR2=0,那么在上电后,输出比较模式 CNT=CRR2=0,电平第一次翻转,由低电平跳变为高电平,那么我们要在 ARR1=2000 的范围内在跳变一次电平,且占空比为50%,那么显而易见,我们下一次跳变的CCR2的值应该为 CCR2=1000。那第三次跳变点应为 CCR2=2000(即0点)。如下图所示。
因此,我们在代码中,在CNT=CRR时,除了电平翻转外,还需要将下一次 电平翻转点的值装入到CCR当中。
在占空比固定位50%的情况下,不同的ARR值中,我们翻转点CCR的值也是不一样的,但是总的来说 ,只要A1、A2 的CCR间隔相差 ARR/2即可。
2.2.2、输出比较移相
输出比较的移相以PWM 移相类似,只是输出比较的移相需要考虑两次比较值CCR的位置。
首先,我们仍假设通道CH1为OPWM模式下输出的PWM波形,CH为输出比较模式输出的PWM波形,CH1的ARR1 = 2000,CCR1=1000, CH2的重装载值为ARR2,第一次CCR值为 CCR2_A,第二次CCR的值为CCR2_B。
2.2.2.1、移相90°。
首先,我们要确定我们移相角度;其次,我们要确定CH1与CH2电平翻转点差值相差多少;然后,我们还需确定CH2第一个翻转点位置 CCR2_A 位置在哪里,最后在确定 CCR2_B位置在哪里。
根据公式: 有
我们得到 , 因此 A1-B1=500。
那么我们令 CCR2_A = =500,由于占空比为50%,所以CCR2_B=CCR2_A+
即得 CCR2_B = 1500。这样就可以得到 占空比为50%,相位差为90°的两路PWM。
2.2.2.2、移相45°
根据公式: 有 得到
则我们令 CCR2_A = = 250, 由于占空比为50%,所以CCR2_B=CCR2_A+=1250
2.2.2.3、移相10°
根据公式: 有 得到
则我们令 CCR2_A = = 56, 由于占空比为50%,所以CCR2_B=CCR2_A+=1056
2.2.2.4、总结
其实移相就分为以下3步
- 计算 的值
- 赋值 CCR2_A
- 根据占空比 赋值CCR2_B
三、占空比可变(固定相位差)
在第二章中讲述了固定占空比情况下如何实现相位差可调,那么本章讲述的是固定相位差的情况下如何正确更改占空比。
3.1、固定相位差90°,更改占空比
在2.2.2.1、移相90° 中,我们令 CCR2_A = =500,CCR2_B=CCR2_A+,即得 CCR2_B = 1500。这样得到的是 占空比为50%,相位差为90°的两路PWM。
而现在我们需要更改占空比时,需要考虑的是 CCR2_A 与 CCR2_B 的差值,即
该值决定了我们占空比大小。
3.1.1、占空比为10%
由于我们相位差为90°,因此我们的 CCR2_A = =500,不需要改变,而且也不能变化,否则将会改变移相角度,我们需要变化的是 CCR2_B的值。
我们要输出 10% 的占空比 ,则 PWM的高低电平比例为 1:9,由于我们在第二章假设了 CH1的 ARR1为 2000,因此,CH1高低电平时间比值为 200:1800; CH2高低电平时间也为200:1800。
那在 CH2 中 我们CCR2_A 与 CCR2_B 的差为 200,即 = 200。又因为CCR2_A=500,所以计算可得
CCR2_B= CCR2_A+ = 700
3.1.2、占空比为20%
PWM的高低电平比例为 2:8,CCR2_A = =500,CH2 中 我们CCR2_A 与 CCR2_B 的差为 400,即 = 400.通过计算可得
CCR2_B= CCR2_A+ = 900
3.1.3、占空比为75%
PWM的高低电平比例为 3:1,CCR2_A = =500,CH2 中 我们CCR2_A 与 CCR2_B 的差为 1500,即 = 1500,通过计算可得
CCR2_B= CCR2_A+ = 2000
3.2、固定相位差45°
同 3.1、固定相位差90°,更改占空比 凡凡原理一样,保持 CCR2_A不变,改变CCR2_B的值。
3.3、固定相位差10°
同 3.1、固定相位差90°,更改占空比 凡凡原理一样,保持 CCR2_A不变,改变CCR2_B的值。
以上内容即为 相位差在0-180°范围内可调,占空比可变化的实现原理。如有内容补充,将会及时优化,希望该内容可以帮助有需要的朋友。
文中如有错误,请各位指出,我将及时更正。
这篇关于PWM移相以及占空比可变的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!