0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

茶话MCU 来源:ST MCU 信息交流 2019-11-20 14:51 次阅读

经常有人问起STM32定时器做PWM输出时的电平话题,这里就聊聊该话题。

对于STM32常规定时器,其比较输出模式除了强制输出模式以外,还有匹配切换模式、PWM输出模式,不论是匹配切换模式还是PWM输出模式,最终的输出电平由计数器的值与比较寄存器的值之比较结果,并结合极性选择位来决定。

当极性选择位为0时,OCx端的输出跟比较输出控制器的输出信号OCxREF保持同相,当极性选择位为1时,OCx端的输出跟比较输出控制器的输出信号OCxREF保持反相关系。

下图是一常规定时器的通道4的输出结构框图.

我们在使用TIMER的pwm过程中,当通过关闭计数器停止PWM输出时,由于停止时间点的随机性导致计数器的值不定,进而引起CNT的值与CCR的值出现不定的比较结果,最终体现在OC输出端呈现不确定的电平。有些时候,我们停止或暂停PWM输出时往往希望OC输出端呈现我们所期望的电平。

这个怎么办呢?方法一般可以有下面几种。

第一种,将相关PWM输出的GPIO口的复用功能取消,对其进行GPIO的高低控制。这种方法简单可行,有点粗暴。但不影响定时器的现有输出配置。要恢复功能的话,需重新对GPIO做复用配置。

第二种,采用定时器输出模式中的强制输出,将相应的OC端输出指定的高低电平。

这种方法,同样简单有效。不影响GPIO配置,但影响了定时器的现有输出配置。要恢复PWM功能时需重新对定时器的输出功能做配置。

第三种,通过修改CCR为特别的值,将CCR的值与CNT的比较结果固定下来,从而得到所期望的输出电平。

第一种、第二种方式,可行但稍显繁琐了点。除非不需要PWM输出了,不然还得重新配置回去。这里重点介绍第三种,简单地修改CCR寄存器地值而锁定OC脚的输出电平,要继续输出PWM的话,只需修改CCR值即可,无须其它配置。

下图是定时器某通道的PWM输出波形示意图。采用PWM1输出模式,计数器采用向上计数模式。极性选择为高有效,即极性控制位CCxP=0。此时OCx输出将与中间参考信号OCxREF同相输出。其中ARR=8。

从上图中我们看到,当CCR的值取0或比ARR值还大时,OCxREF将保持固定电平输出,相应地OCx端也会结合极性选择位输出固定电平。基于这个特性,我们可以随时修改某通道的CCR值来取消其PWM输出。【严格上讲,不能说取消了它的PWM输出,只是输出了一个固定电平,占空比为100%或0】

上面是针对非互补通道停止PWM输出的确定电平的实施方案。有人会问那对于互补通道的PWM输出的中途停止,电平如何确定呢?这个问题其实有点怪,但偏偏常有人问起。

通常情况下,对于互补输出通道不同状态下的输出特性,在STM32参考手册中高级定时器的寄存器描述中有个表格都罗列出来了。下图是STM32F4参考手册中TIM1的互补通道输出特性表【只是完整表格中的一部分,主输出使能的情况下】。

对于PWM互补输出的停止,可能是停止1个通道,也可能停止一对互补通道,即2个通道。

如果只需停止1个通道的输出,我们可以参考上述表格来配置。

若希望停止了PWM输出的OCx端输出低电平,我们可以选择上图中橙色栏的配置。

若希望停止了PWM输出的OCx端输出高电平,这时情况稍微复杂些。

此时我们可以考虑选择浅蓝色栏的配置。不过,此时的OCx输出跟极性选择位一致,如果极性选择位为0,则输出低电平;如果极性选择位为1,则输出高电平。也就是说,这种情况下,所选择通道停止输出时的电平跟极性选择位有关。

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

‍若希望暂停一对互补通道的PWM输出呢?这里有几种情况:

1、暂停PWM输出后,希望OCx/OCxN端输出低电平,这点好办。参照上图中红色栏配置即可。即令CCXE=CCXNE=0。

2、‍暂停PWM输出后,希望OCX/OCXN端输出一高一低呢?

如果该互补通道的极性选择位一样,参照上面单个非互补通道的作法,修改CCR寄存器的值比ARR大或者等于0,一定可以实现输出一高一低的电平。

如果如果该互补通道的极性选择位不一样,参照上面单个非互补通道的作法,修改CCR寄存器的值比ARR大或者等于0,这时OCX/OCXN端的电平一定一致的,要么同高要么同低。这时可以尝试回头重新规划下互补通道的输出与极性选择,看看能否做调整而不影响应用功能。不行的话,考虑将其中某个通道的PWM输出复用功能取消,直接操作GPIO。

3、暂停PWM输出后,希望OCX/OCXN端输出同为高呢?这在上面第2点已经提到了。如果互补通道的输出极性选择位不一样,通过调整CCR寄存器的值一定可以实现双通道同时输出高电平。如果说互补通道的输出极性选择位是一致的,同样可以尝试重新规划互补通道的输出与极性选择位的安排。不行的话,考虑取消其中某个通道的GPIO复用功能,直接操作寄存器来控制该输出端的电平。

好,关于停止STM32定时器PWM输出后电平的确定话题,就聊这么多。供君参考。最后提醒一点,关于修改CCR值后的生效时间点跟是否开启了其预装载功能有关。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5140

    浏览量

    213364
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354716
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114439

原文标题:STM32定时器停止PWM输出时的电平话题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    stm32定时器编码模式可以输出吗?

    我想要做正交编码,但是网上一般只介绍了用编码对其解码,而我需要的是输出波形。我在一个小网站的解答上看到定时器的编码
    发表于 07-31 07:59

    定时器的工作方式介绍

    或实现周期性事件的硬件模块。它可以用于实现各种定时任务,如定时中断、PWM(脉冲宽度调制)输出、频率测量等。定时器通常由一个计数
    的头像 发表于 07-12 10:29 713次阅读

    STM32G4系列芯片定时器的延时输出问题

    有人使用STM32G4系列芯片内部的多个定时器PWM输出输出频率一样,占空比也一样,均为50
    的头像 发表于 07-01 09:45 1420次阅读
    <b class='flag-5'>STM32</b>G4系列芯片<b class='flag-5'>定时器</b>的延时<b class='flag-5'>输出</b>问题

    定时器PWM输出时,定时器回调函数只能执行一次,是什么原因?

    定时器PWM输出时,初始化定时器时执行HAL_TIM_PWM_Init( TIM1_Handl
    发表于 05-30 07:15

    如何用STM32定时器实现一个周期输出PWM2的波形?

    请教各位如何用STM32定时器实现一个周期输出PWM2的波形呢(低-高-低-高-低)?万分感谢您的解答!
    发表于 04-03 06:39

    STM32G030定时器16 17和1同步输出如何实现?

    STM32G030系列中只有定时器1 16和17三个定时器可以输出带死区时间互补pwm,我想实现其中两个或者3个同步
    发表于 03-27 06:45

    STM32同一定时器PWM输出定时,会影响我的PWM输出吗?

    求助各位大佬 ,我用定时器2通道1输出PWM 定时器设置为TIM2_PERIODE (1000-1) TIM2_PRESCALER 36,现在还想开启2的中断用
    发表于 03-26 07:23

    如果STM32定时器外接了正交编码,该剩余通道是否能做PWM输出呢?

    其实,对于STM32芯片,编码输入信号就是定时器的计数时钟源之一。定时器外接了编码输入,若还有剩余通道的话,剩余通道依然可以实现输入捕获或输出比较功能。
    的头像 发表于 03-21 09:06 1405次阅读
    如果<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>外接了正交编码<b class='flag-5'>器</b>,该剩余通道是否能做<b class='flag-5'>PWM</b><b class='flag-5'>输出</b>呢?

    STSPIN32F0A高级定时器控制的HS和LS不输出PWM,为什么?

    STSPIN32F0A高级定时器控制的HS和LS不输出PWM,用TIM2的IO口是能输出PWM的,但是HS和LS就是没有
    发表于 03-19 07:34

    STM32F4X比较输出的边沿,能用从定时器计数计数吗?

    ,或者时钟那样做到每个边沿的都计数,我想请问一下,比较输出的边沿,能用从定时器计数计数吗?又或者有什么办法做到输出固定边沿
    发表于 03-15 06:45

    STM32G030C8T6要输出8~12路PWM,每个定时器可以输出4路,那如何让两个定时器输出PWM同步呢?

    STM32G030C8T6要输出8~12路PWM,每个定时器可以输出4路,那如何让两个定时器
    发表于 03-08 08:19

    使用555定时器的可调双定时器电路

    定时器 IC 555 是最通用和最常用的 IC 之一,因为它的应用范围更广,如 PWM放大器、延迟定时器、开关电路、占空比选择、时钟脉冲发生
    的头像 发表于 02-25 15:16 1990次阅读
    使用555<b class='flag-5'>定时器</b>的可调双<b class='flag-5'>定时器</b>电路

    STM32定时器时间计算方法

    STM32微控制定时器模块在嵌入式系统中非常常见,它被用于产生精确的时间延迟,或者用于实时时钟(RTC)等功能。为了充分利用STM32定时器
    的头像 发表于 12-19 11:31 1.1w次阅读

    stm32一个定时器能同时控制两个灯以不同频率闪烁吗?

    STM32定时器功能强大,**STM32定时器可以同时控制两个灯以不同频率闪烁** 。
    的头像 发表于 12-13 10:43 1984次阅读

    基于STM32CUBEMX驱动低压步进电机驱动STSPIN220(3)----定时器中断产生指定数量脉冲

    在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。本文将详细介绍如何利用STM32CUBEMX配置
    的头像 发表于 12-01 15:26 1148次阅读
    基于<b class='flag-5'>STM32</b>CUBEMX驱动低压步进<b class='flag-5'>器</b>电机驱动<b class='flag-5'>器</b>STSPIN220(3)----<b class='flag-5'>定时器</b>中断产生指定数量脉冲