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

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

3天内不再提示

使用STM32定时器PWM功能时的小问题

麦辣鸡腿堡 来源:茶话MCU 作者:茶话MCU 2023-06-21 16:26 次阅读

有人使用STM32定时器的PWM功能,遇到点小疑问,这里一起看看。

他先将STM32某定时器计数周期设为0xff,单向递增计数模式,OC比较值设为0x7F。在某时刻将新的计数周期0x7F与比较值0x3F加载到影子寄存器。当正在进行的一个周期结束后,经示波器测量确实可以看到其下一个周期发生变化,但其周期明显与预设值对应不上!再次经过一个周期,定时器才会按照预设值稳定输出。

以上是咨询者不算很清晰的描述【其实咨询TIMER问题最好配上时序图】,但可以了解到他要做的事情就是在ARR=0xff,ccr=0x7F的PWM输出状态下,于某时刻赋予ARR和CCR新值以改变输出波形。

图片

事情不算复杂,疑点就是为什么需要2个周期延时后才能有基于新配置的稳定输出。【他这里说的2个周期显然不清楚到底指的前后哪个周期值】

这个问题主要涉及到定时器寄存器的预装功能。有些时候我们需要保证输出波形完整性、连续性,开启ARR及CCR的预装功能就比较合适,使用CubeMx配置时做些勾选即可。开启预装后,修改ARR及CCR的值,生效时间点最长可能延后1个旧计数周期。不过这里要注意,我们修改ARR及CCR的值若不是特别需求,建议在一个计数周期内完成修改,不要一个值在更新事件之前完成赋值,另一个则发生在该更新事件之后。

我也将上面提醒告知咨询者,他反馈问题依然没能解决,准确说是疑惑依然没能解除。他这里的确只是提出疑惑,并未提出具体需求。另外,他还将问题的复现过程做了如下补充:

第一步:

1 - 关闭预装载(ARR/CCR)

2 - 设定ARR=CCR=0xFF

3 - 开启输出比较功能(连接到示波器查看波形)

第二步:

1 - 设置示波器触发(延迟一段时间拉高某个IO引脚以触发示波器采集)

2 - 立即清空CNT

3 - 使能预装载

4 - 设定ARR=0X7F,CCR=0X3F

现象:本周期结束后其计数周期确实会相应改变,但改变之后的前两个周期明显与设定值不符,即经过2个周期后才可稳定输出。

复现过程表述得比较清晰了,他也再次明确了疑惑点。同时还强调说网上很多人碰到类似问题或疑惑。他在STM32L4系列和STM32H7系列上都遇到了同样问题。既然这样,现在我们使用STM32L4系列的TIM1来进行验证,参照他的操作步骤来组织代码,看看来龙去脉。

我是这样测试验证的。

在关闭ARR/CCR的预装前提下给二者分别赋值0xff和0x7f,启动CH1的PWM输出并使能该通道的输出比较中断。在第一个脉冲的比较中断里按照咨询者的做法修改ARR/CCR值。为了便于观察效果,我也开启了更新中断,通过更新中断记录脉冲个数,输出几个脉冲后就将定时器及输出都关闭掉。【选择PWM模式1,极性为高有效】

编写代码、编译除错后,运行得到如下结果:【黄色波形结尾的4个脉冲是基于新参数的输出。绿色波形的上升沿指示修改数据的时间点,这里辅助显示下,重点在黄色波形。】

图片

上面输出波形应该说跟客户反馈的是一致的。我们来一起看看。

在第一个脉冲的比较中断处,也是第一个脉冲的正中央【红色箭头所指位置】处做参数修改。修改步骤按照咨询者提供的来实现。

图片

即按照上面的3小步操作【第1小步是咨询者设置示波器的动作,不用理它】。

这里是开启预装功能后才修改ARR/CCR值,这两个新值目前只能暂居预装寄存器,实际起作用的ARR/CCR值仍是之前的0xff和0x7f。而且,还在此处对计数器做了清零,即从此刻起PWM输出脉冲重头来。这样从上图红色箭头到蓝色箭头之间的波形依然是基于ARR=0xff,CCR=0x7f参数运行的。定时器于蓝色箭头所指位置处发生更新事件,新数据【0x7f,0x3f】生效起作用。

显然从修改时刻算起到数据生效 刚好延时1个旧周期,结合到这里,恰好是新周期的2倍。修改数据后整整花了2个周期的时间才生效就是这么来的。

如果在上面操作步骤的基础上拿掉对计数器清零操作,其它不变,输出结果又不一样了。见下面截图:

图片

同样,红色箭头所指位置为修改数据的时刻。由于此时没有对计数器清零,计数器按部就班计数,PWM输出按预定配置输出,继续运行半个旧周期后计数器溢出产生更新事件于蓝色箭头所指位置。蓝色箭头所指位置以后PWM输出按新参数运行。不难看出,这次新数据的生效从修改时刻算起仅延时半个旧周期,相当于后续的1个新周期。

这里强调下,我这里测试时选择的刚好是旧周期的中间点,所以延时生效为半个旧周期。具体应用时的延时跟我们修改参数所选的时间点有关,一般来讲,它最长不会超过1个旧周期,最短极限为0。

当然,如果说我们不关心修改数据前后波形的完整性,直接关闭预装功能也行,或者手动产生更新事件也可以。总之,我们根据实际应用需求来定。

聊到这里,关于咨询者的疑惑基本解释得差不多了。

或许眼尖的人看到上面第一种操作输出的PWM波形里面有个非常细窄的尖脉冲,它是怎么回事呢?示波器问题?非也!【见下图椭圆形框住的细长线】

图片

此处尖脉冲产生的原因是------

当发生比较中断时我们才去做修改参数动作,在做计数器清零操作前,计数器的值已经大于设置的CCR值【0x7f】,按照当前PWM输出模式及极性选择,输出则变为低电平了。但是,在中断里我们很快又将计数器值做了个清零,此时计数器值又小于CCR值【0x7f】了。同样,按照当前PWM配置,输出又变回高电平,最终就产生了这么个一下一上的尖脉冲。【注:这里涉及PWM输出原理,需要的自行补课。】

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

    关注

    2240

    文章

    10675

    浏览量

    348872
  • 控制
    +关注

    关注

    4

    文章

    997

    浏览量

    122157
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112066
收藏 人收藏

    评论

    相关推荐

    STM32定时器(一)PWM输出

    STM32定时器分类众多,按照内核、外核标准分为两部分:核内定时器+核外定时器
    的头像 发表于 07-21 14:51 2717次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>(一)<b class='flag-5'>PWM</b>输出

    STM32定时器功能

    STM32定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一.楼主是用的是HAL
    发表于 08-12 06:31

    STM32的通用定时器和高级定时器功能

    比较之后,并依据相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲模式、强制输出等。一般来说,STM32的通用定时器和高级定时器都具有比较输出
    发表于 08-18 07:15

    STM32定时器功能

    的程序有很多相似之处,因此在PWM的程序中进行修改即可。首先需要先了解一下32的定时器STM32定时器功能十分强大,有 TIME1 和
    发表于 08-18 07:10

    stm32定时器pwm模式输入捕获功能

    stm32定时器pwm模式输入捕获##stm32中的定时器,除了TIM6和TIM7,其他定时器
    发表于 08-18 07:41

    STM32定时器功能简介区别

    ,TIM3,TIM4,TIM5是通用定时器;TIM1和TIM8为高级定时器。这些定时器使STM32具有定时,信号的频率测量,信号的
    发表于 08-19 07:31

    STM32高级定时器-PWM简单学习案例

    高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。
    发表于 04-21 14:47 4703次阅读
    <b class='flag-5'>STM32</b>高级<b class='flag-5'>定时器</b>-<b class='flag-5'>PWM</b>简单学习案例

    stm32定时器中断程序

    STM32定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM
    发表于 10-12 16:59 1.3w次阅读

    如何通过STM32定时器输出PWM

      本文将介绍通过STM32定时器输出PWM,如果对定时器不太熟悉的同学可以看下之前的文章《STM32基础
    的头像 发表于 02-20 15:08 2.1w次阅读
    如何通过<b class='flag-5'>STM32</b>的<b class='flag-5'>定时器</b>输出<b class='flag-5'>PWM</b>?

    [STM32]通用定时器的使用

    STM32的通用定时器定时、输出PWM功能的使用本次还是使用发光二极管来验证定时器的使用目录
    发表于 11-22 19:06 24次下载
    [<b class='flag-5'>STM32</b>]通用<b class='flag-5'>定时器</b>的使用

    STM32-通用定时器-PWM输出

    1 通用定时器PWM概述1.1STM32定时器输出通道引脚这里以TIM3为例来讲解。STM32的通用定时
    发表于 11-26 15:36 22次下载
    <b class='flag-5'>STM32</b>-通用<b class='flag-5'>定时器</b>-<b class='flag-5'>PWM</b>输出

    STM32F4单定时器独立输出四路PWM脉冲

    本文以STM32F405单片机为例,介绍如何用一个定时器的四个通道独立地输出四路PWM脉冲。主要使用定时器输出比较的翻转功能和捕获比较中断。
    发表于 11-30 10:06 28次下载
    <b class='flag-5'>STM32</b>F4单<b class='flag-5'>定时器</b>独立输出四路<b class='flag-5'>PWM</b>脉冲

    STM32F103C8T6定时器TIM4通道1、2输出PWM

    STM32F103C8T6定时器TIM4通道1、2输出PWM这美妙的波形,真好,我他喵的终于把你弄出来了。STM32F103C8T6使用定时器
    发表于 12-02 18:21 66次下载
    <b class='flag-5'>STM32</b>F103C8T6<b class='flag-5'>定时器</b>TIM4通道1、2输出<b class='flag-5'>PWM</b>

    STM32CubeMX_定时器中断_PWM

    文章目录前言STM32CubeMX新建工程基本定时器配置生成代码定时器中断PWM配置工程代码前言STM32CubeMX_环境搭建_GPIO_
    发表于 12-05 13:51 13次下载
    <b class='flag-5'>STM32</b>CubeMX_<b class='flag-5'>定时器</b>中断_<b class='flag-5'>PWM</b>

    STM32定时器功能和用法详解

    1. STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本
    发表于 02-11 15:04 27次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>功能</b>和用法详解