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
    +关注

    关注

    2305

    文章

    11124

    浏览量

    371340
  • 控制
    +关注

    关注

    5

    文章

    1031

    浏览量

    125089
  • 定时器
    +关注

    关注

    23

    文章

    3361

    浏览量

    121834
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32定时器(一)PWM输出

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

    STM32有哪几种定时器 STM32高级定时器有哪些功能

    SysTick定时器功能比较单一,主要是供给系统使用的,系统默认设置为1ms触发一次中断。而用户想要使用自己的定时器STM32提供的用户定时器
    的头像 发表于 07-27 16:25 6427次阅读
    <b class='flag-5'>STM32</b>有哪几种<b class='flag-5'>定时器</b> <b class='flag-5'>STM32</b>高级<b class='flag-5'>定时器</b>有哪些<b class='flag-5'>功能</b>

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

    高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。
    发表于 04-21 14:47 5549次阅读
    <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.4w次阅读

    stm32定时器输入捕获

    不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。 一、输入捕获概念 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时
    发表于 10-13 09:13 2.5w次阅读
    <b class='flag-5'>stm32</b><b class='flag-5'>定时器</b>输入捕获

    如何利用stm32的高级定时器产生PWM

    stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用
    发表于 10-24 15:48 7235次阅读
    如何利用<b class='flag-5'>stm32</b>的高级<b class='flag-5'>定时器</b>产生<b class='flag-5'>PWM</b>

    如何通过STM32定时器输出PWM

      本文将介绍通过STM32定时器输出PWM,如果对定时器不太熟悉的同学可以看下之前的文章《STM32基础
    的头像 发表于 02-20 15:08 2.3w次阅读
    如何通过<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定时器-基本定时器

    目录定时器分类基本定时器功能框图讲解基本定时器功能时钟源计数时钟计数
    发表于 11-23 18:21 32次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>-基本<b class='flag-5'>定时器</b>

    STM32——高级定时器、通用定时器、基本定时器的区别

    STM32——高级定时器、通用定时器、基本定时器的区别
    发表于 11-26 15:21 110次下载
    <b class='flag-5'>STM32</b>——高级<b class='flag-5'>定时器</b>、通用<b class='flag-5'>定时器</b>、基本<b class='flag-5'>定时器</b>的区别

    STM32-通用定时器-PWM输出

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

    Stm32入门——Systick定时器Systick定时器是什么?从原理上来说,Systick定时器和开发板上的通用定时器没有区别。从
    发表于 12-07 17:51 12次下载
    <b class='flag-5'>Stm32</b>入门——Systick<b class='flag-5'>定时器</b>

    STM32定时器功能和用法详解

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

    STM32定时器的分类及中断原理

    本文主要介绍常规定时器中的TIM3,实现定时器中断的功能STM32定时器的分类在其中一篇文章中已经介绍过,本文主要内容主要介绍
    的头像 发表于 01-12 17:29 8710次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>的分类及中断原理