请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32定时器停止PWM输出时的电平话题

[复制链接]
fightingboon 发布时间:2019-10-31 11:19
经常有人问起STM32定时器做PWM输出时的电平话题,这里就聊聊该话题。
2 E2 [) R' J! ~' D% n- O. Q
对于STM32常规定时器,其比较输出模式除了强制输出模式以外,还有匹配切换模式、PWM输出模式,不论是匹配切换模式还是PWM输出模式,最终的输出电平由计数器的值与比较寄存器的值之比较结果,并结合极性选择位来决定。

& i8 M* _+ Y9 e0 l- l6 f. [
当极性选择位为0时,OCx端的输出跟比较输出控制器的输出信号OCxREF保持同相,当极性选择位为1时,OCx端的输出跟比较输出控制器的输出信号OCxREF保持反相关系。

# b3 j& F* O1 }2 ]" O
下图是一常规定时器的通道4的输出结构框图.
11.png
! B, J9 f0 M4 N. p( z1 b8 l4 M: U
我们在使用TIMER的pwm过程中,当通过关闭计数器停止PWM输出时,由于停止时间点的随机性导致计数器的值不定,进而引起CNT的值与CCR的值出现不定的比较结果,最终体现在OC输出端呈现不确定的电平。有些时候,我们停止或暂停PWM输出时往往希望OC输出端呈现我们所期望的电平。
" u' G) V/ c: m8 I1 G+ b
这个怎么办呢?方法一般可以有下面几种。

4 Q. H+ c& T5 ^
第一种,将相关PWM输出的GPIO口的复用功能取消,对其进行GPIO的高低控制。这种方法简单可行,有点粗暴。但不影响定时器的现有输出配置。要恢复功能的话,需重新对GPIO做复用配置。
第二种,采用定时器输出模式中的强制输出,将相应的OC端输出指定的高低电平。
这种方法,同样简单有效。不影响GPIO配置,但影响了定时器的现有输出配置。要恢复PWM功能时需重新对定时器的输出功能做配置。
第三种,通过修改CCR为特别的值,将CCR的值与CNT的比较结果固定下来,从而得到所期望的输出电平。
第一种、第二种方式,可行但稍显繁琐了点。除非不需要PWM输出了,不然还得重新配置回去。这里重点介绍第三种,简单地修改CCR寄存器地值而锁定OC脚的输出电平,要继续输出PWM的话,只需修改CCR值即可,无须其它配置。
下图是定时器某通道的PWM输出波形示意图。采用PWM1输出模式,计数器采用向上计数模式。极性选择为高有效,即极性控制位CCxP=0。此时OCx输出将与中间参考信号OCxREF同相输出。其中ARR=8。
22.png
. [# }. O/ G3 x
从上图中我们看到,当CCR的值取0或比ARR值还大时,OCxREF将保持固定电平输出,相应地OCx端也会结合极性选择位输出固定电平。基于这个特性,我们可以随时修改某通道的CCR值来取消其PWM输出。【严格上讲,不能说取消了它的PWM输出,只是输出了一个固定电平,占空比为100%或0】

/ b& N; B* f1 r8 I! i% |
上面是针对非互补通道停止PWM输出的确定电平的实施方案。有人会问那对于互补通道的PWM输出的中途停止,电平如何确定呢?这个问题其实有点怪,但偏偏常有人问起。
33.png
! X9 f' F, ^1 Q/ L; W6 J
通常情况下,对于互补输出通道不同状态下的输出特性,在STM32参考手册中高级定时器的寄存器描述中有个表格都罗列出来了。下图是STM32F4参考手册中TIM1的互补通道输出特性表【只是完整表格中的一部分,主输出使能的情况下】。
7 o) P) h/ m* |1 j- v4 _( D) b
44.png
) T& O1 t% ^3 Q3 I9 P" g) r  H
对于PWM互补输出的停止,可能是停止1个通道,也可能停止一对互补通道,即2个通道。

" f+ K* L5 k" m3 r/ a
如果只需停止1个通道的输出,我们可以参考上述表格来配置。
# x: V/ Z2 Z$ t9 S1 {9 w
若希望停止了PWM输出的OCx端输出低电平,我们可以选择上图中橙色栏的配置。

8 h2 e; q. J& c* H. V$ d
若希望停止了PWM输出的OCx端输出高电平,这时情况稍微复杂些。
0 n! g6 W$ h8 l$ O. ?1 s& ~
此时我们可以考虑选择浅蓝色栏的配置。不过,此时的OCx输出跟极性选择位一致,如果极性选择位为0,则输出低电平;如果极性选择位为1,则输出高电平。也就是说,这种情况下,所选择通道停止输出时的电平跟极性选择位有关。

$ M7 l+ h/ @9 M# x) b6 A
如果觉得自己的应用有这方面的需求,事先规划PWM功能时就要考虑极性选择位安排问题。当然,由于极性选择位影响到最终OCx输出端,可能会遇到极性选择位和PWM输出波形在应用上兼顾不过来的情形,这时可以考虑对所选择通道的PWM复用功能取消,直接操作GPIO来控制OCx脚的输出电平。

" _) n! _% w9 c  u8 E+ [: _  u
若希望暂停一对互补通道的PWM输出呢?这里有几种情况:

# S; q) w9 x/ g# V/ i& L
1、暂停PWM输出后,希望OCx/OCxN端输出低电平,这点好办。参照上图中红色栏配置即可。即令CCXE=CCXNE=0。

% v; a' P! Z# r& K9 U& F
2、暂停PWM输出后,希望OCX/OCXN端输出一高一低呢?
如果该互补通道的极性选择位一样,参照上面单个非互补通道的作法,修改CCR寄存器的值比ARR大或者等于0,一定可以实现输出一高一低的电平。
如果该互补通道的极性选择位不一样,参照上面单个非互补通道的作法,修改CCR寄存器的值比ARR大或者等于0,这时OCX/OCXN端的电平一定一致的,要么同高要么同低。这时可以尝试回头重新规划下互补通道的输出与极性选择,看看能否做调整而不影响应用功能。不行的话,考虑将其中某个通道的PWM输出复用功能取消,直接操作GPIO

) J' i* _% N5 P3 P6 Z  R
3、暂停PWM输出后,希望OCX/OCXN端输出同为高呢?这在上面第2点已经提到了。如果互补通道的输出极性选择位不一样,通过调整CCR寄存器的值一定可以实现双通道同时输出高电平。如果说互补通道的输出极性选择位是一致的,同样可以尝试重新规划互补通道的输出与极性选择位的安排。不行的话,考虑取消其中某个通道的GPIO复用功能,直接操作寄存器来控制该输出端的电平。
好,关于停止STM32定时器PWM输出后电平的确定话题,就聊这么多。供君参考。最后提醒一点,关于修改CCR值后的生效时间点跟是否开启了其预装载功能有关。
/ N( w9 |0 V# |+ T
) m# C- A3 w+ F0 z1 D2 l5 B

! g) l6 i* W9 c; x* R5 n% ~, K: U1 o% b1 H7 ^6 H

# Y& T! ^( p  W0 l( p7 [

评分

参与人数 1 ST金币 +10 收起 理由
子曰好人 + 10 赞一个!

查看全部评分

收藏 3 评论5 发布时间:2019-10-31 11:19

举报

5个回答
七哥 回答时间:2019-10-31 17:49:02
修改CCR值,这个很巧妙
linghu9 回答时间:2019-11-1 09:54:07
学习了
wujique 回答时间:2019-11-4 15:31:36
转IO输出需要电平,粗暴,直观。. }/ o1 K/ s: X* n8 d3 g/ `
蜂鸣器驱动就这样做。
: @& }# w; E7 S% `0 B- Z% n& r7 |) S  d  T, y2 m: Q
其实如何做,看看资料就知道。$ g/ @/ n% |+ o# Q; ^8 R4 C
但是很多人不知道要做,觉得蜂鸣器不响就行了,但是会大电流啊!, k1 A% p: j! K4 N' O6 N
sherlock_mt 回答时间:2019-11-11 13:55:43
好东西 实用小技巧
Kevin_G 回答时间:2019-11-12 09:27:04
很不错

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版