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

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

3天内不再提示

STM32定时器同步启动示例及应用提醒

茶话MCU 来源:茶话MCU 2023-11-09 10:49 次阅读

我们有时会利用STM32片内的多个TIMER进行级联,实现同步启动。不过有人会遇到没法同步启动的情况;或者说基于相同的配置,某次可以成功,下次再来又不行了;或者说同样的芯片、同样的代码,别人的可以,而自己却不行云云。所谓不行、不成功就是指基于同步启动后,主从TIMER的PWM输出相位肉眼可见的不同步,明显存在启动时间差。

我这里不妨先以STM32G4芯片内TIM1/TIM2/TIM3为例来演示下实现过程。看看到底能否实现,会不会碰到无法同步的情形。如果有,可否解决。

根据该系列参考手册有关TIMER内部互联关系图可知TIM1/TIM2/TIM3就可以建立起主从关系。下图便是其中的一部分TIMER信号互联触发关系图。

93ebfe7c-7eaa-11ee-939d-92fbcf53809c.png

我将TIM1/TIM2/TIM3按照下面的方式前后主从级联。

940b22ca-7eaa-11ee-939d-92fbcf53809c.png

TIM1的触发输出TRGO作为TIM2的触发输入【ITR0】,TIM2的触发输出TRGO作为TIM3的触发输入【ITR1】,其中TIM2/TIM3均配置在Trigger从模式。至于TIM1和TIM2的触发输出【TRGO】信号均选择各自计数器的使能动作,即对定时器的TIMx_CR1@CEN位置1。对于处在Trigger从模式的定时器,外来触发信号具有对TIMER计数器使能的同等效果。TIM3的TRGO不必关注,因为TIMER级联应用时,TRGO信号是给下一级TIMER用的。

使用CubeMx对STM32G431进行配置。配置过程中将主从模式控制位MSM使能,具体参考下面配置。【注:3个定时器的时基参数及PWM配置都一样。未对计数时钟做分频。最后希望输出3路完全同频同相的波形。】

94467fc8-7eaa-11ee-939d-92fbcf53809c.png

9468bf0c-7eaa-11ee-939d-92fbcf53809c.png

947ff03c-7eaa-11ee-939d-92fbcf53809c.png

利用CubeMx完成配置后,基于STM32 HAL库添加用户代码进行验证测试。经测试,发现3路输出同步与否 跟 3个定时器的初始化代码顺序有明显的关系。

94ab6708-7eaa-11ee-939d-92fbcf53809c.png

比如,基于上面初始配置顺序的3路输出就没有做到同步启动,貌似互不理睬。

94cd9f4e-7eaa-11ee-939d-92fbcf53809c.png

同样,基于上面初始配置顺序的3路输出也没有做到完美同步启动,中间那路明显异类。

94e7ee08-7eaa-11ee-939d-92fbcf53809c.png

然而,基于上面初始化顺序的3路输出倒是同步完美。

现在3个TIMER,初始化配置代码摆放先后顺序共6种组合,我把6种组合的实现结果集中在下面表格里一起来看。

9510f442-7eaa-11ee-939d-92fbcf53809c.png

我们发现上面6种组合中,仅表格里最后一组可以实现完美同步输出,符合预期。

也就是说,只有初始化时遵循先主后从的配置顺序才可能实现完美同步启动。

95387562-7eaa-11ee-939d-92fbcf53809c.png

在正确的配置顺序下,我们不妨看看启动后三个定时器的计数情况:【下图是两次随机暂停程序读到的3个计数器的值,见红线下划线标示的】

954ddd26-7eaa-11ee-939d-92fbcf53809c.png

我们可以清晰地看到任意两次暂停得到的三个计数器的值,两两主从定时器的计数值相差1个定时器外设时钟单位,注意是TIMER外设时钟,并不是计数时钟,具体到这里就是1us/170。【因此刻没有对时钟源分频,计数时钟刚好等于TIMER外设时钟】

957a4e56-7eaa-11ee-939d-92fbcf53809c.png

一般来讲,主从间的这1个TIMER外设时钟的延时不该对应用构成影响,若觉得有影响,大概率是您选错芯片了,或许该选个主频更高的。何况当对计数时钟做分频后,计数器往往没法感觉和区分这个细小延时的。当然,实在有强迫症或其它想法,如果计数时钟跟TIMER外设时钟相同,即未做分频前提下,我们还可以通过修改计数器初始值保证启动后保持相同计数值或预期值。比方,在正确初始配置顺序下,启动前将三个计数器的初始值稍作调整,见下图红线方框里的代码。

959626d0-7eaa-11ee-939d-92fbcf53809c.png

这样调整后,每次暂停程序运行时,三个计数器的值总是保持高度一致,不差分毫。

提醒:刚才通过调整计数初值实现彻底的计数器同步计数仅限于计数时钟源没有做分频的前提下,若计数时钟有被分频是不需要这么做的,也不能这么做。因为那1个主从启动硬件延时是跟着外设时钟走的,不是跟着计数时钟走的。当计数时钟被分频后,计数器往往感受不到那个延时了,显然分频系数越大越感觉不到主从间的那个延时。如果此时手动额外在计数器初值上加1或加2就弄巧成拙了,本来可以忽略的延时被你这么一加反而加大延时了。当然,为产生启动相差而有意调整计数初始值又是另外一回事了。

到此,我们也顺便看看像下面级联的情形,主从级联,从级并列多个定时器被同一触发信号触发。

95c1dde8-7eaa-11ee-939d-92fbcf53809c.png

95dbfdc2-7eaa-11ee-939d-92fbcf53809c.png

具体到这里,TIM1的触发输出同时接到TIM2/TIM3/TIM4的内部触发输入。内部信号接法见上图。

我们照样使用cubeMx配置4个TIMER。

9600a8a2-7eaa-11ee-939d-92fbcf53809c.png

962585c8-7eaa-11ee-939d-92fbcf53809c.png

9643114c-7eaa-11ee-939d-92fbcf53809c.png

966796ac-7eaa-11ee-939d-92fbcf53809c.png

完成配置后,添加用户代码、稍加整理 。注意各定时器的初始化顺序,必须按照先主后从的顺序进行,同级并联的无所谓先后。至于各定时器的启动函数顺序,原则上要求跟初始化顺序反过来,即按照先从后主的顺序来启动。

运行代码,可以看到4个TIMER输出的PWM输出同步得很完美。同样,我们也可以通过随机暂停程序查看4个定时器的计数值的情况。下图就是任意时刻暂停程序后得到的4个计数器的数据。详见下面截图底部表格说明。

9695d4fe-7eaa-11ee-939d-92fbcf53809c.png

显然,在初始计数值相同情况下,主从定时器的计数值相差1个定时外设时钟,这点跟上面的测试是一致的。另外,基于一个触发信号下的同级定时器没有计数差值。

总的说来,STM32芯片内多个TIMER实现同步启动完全可以实现,而且可以做到很好的同步,配置也简单。通常使用计数器的使能信号作为触发信号。应用中最常见的问题莫过于定时器初始化顺序不当,记得按照先主后从的顺序进行,否则会导致无法实现整体同步启动及预期输出,这里特作提醒。

审核编辑:汤梓红

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

    关注

    447

    文章

    47788

    浏览量

    409143
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4900

    浏览量

    209906
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348755
  • 定时器
    +关注

    关注

    23

    文章

    3147

    浏览量

    112038
收藏 人收藏

    评论

    相关推荐

    定时器的使用方法 MM32主/从定时器同步与精准定时操作实例

    。这里所谓某一个条件可以是定时到时、定时器超时、比较成功等许多条件。这种通过一个定时器触发另一个定时器的工作方式称为定时器
    发表于 01-11 11:25 3913次阅读

    STM32定时器同步功能介绍

    STM32定时器同步功能1:将一个定时器用作另一个定时器的预分频测试程序说明:测试芯片为
    发表于 01-20 07:57

    STM32F1通用定时器示例详解--TIM15_Compleme

    STM32F1通用定时器示例详解--TIM15_ComplementarySignals
    发表于 12-07 18:15 0次下载

    STM32F1通用定时器示例讲解_Timebase

    STM32F1通用定时器示例详解—Timebase
    发表于 12-07 18:14 0次下载

    如何进行多个定时器主从级联同步输出详细配置示例说明

    有些应用场合,我们需要使用多个定时器主从级联,然后让各个定时器同时启动并做同频同相的PWM波形输出。要完成这个功能,有时发现实现起来似乎并没有那么顺畅,这里基于STM32F1系列芯片做
    的头像 发表于 02-03 12:27 4.4w次阅读
    如何进行多个<b class='flag-5'>定时器</b>主从级联<b class='flag-5'>同步</b>输出详细配置<b class='flag-5'>示例</b>说明

    关于STM32定时器触发SPI逐字收发之应用示例

    STM32定时器触发SPI逐字收发之应用示例
    的头像 发表于 01-14 16:35 5069次阅读

    基于STM32定时器捕获测量脉宽的应用示例

    我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程。 一般来讲,使用STM32
    的头像 发表于 01-02 18:17 1.2w次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>捕获测量脉宽的应用<b class='flag-5'>示例</b>

    STM32定时器-基本定时器

    目录定时器分类基本定时器功能框图讲解基本定时器功能时钟源计数器时钟计数器自动重装载寄存器定时时间的计算定时器初始化结构体详解实验
    发表于 11-23 18:21 28次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>-基本<b class='flag-5'>定时器</b>

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

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

    基于定时器捕获测量脉宽的应用示例

    我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程。一般来讲,使用STM32
    发表于 11-26 16:36 9次下载
    基于<b class='flag-5'>定时器</b>捕获测量脉宽的应用<b class='flag-5'>示例</b>

    STM32定时器学习---基本定时器

    STM32F1系列的产品,除了互联网产品外,工作8个,3种定时器,其中一种就是基本定时器。那么STM32单片机的基本定时器如何操作以及编程呢
    发表于 12-02 14:06 27次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>学习---基本<b class='flag-5'>定时器</b>

    ⭐❤️STM32之玩转定时器TIMX❤️⭐

    TIM8是STM32的高级定时器,TIM6,TIM7为基本定时器,其他为通用定时器基本定时器TIM6和TIM7
    发表于 12-28 19:08 17次下载
    ⭐❤️<b class='flag-5'>STM32</b>之玩转<b class='flag-5'>定时器</b>TIMX❤️⭐

    工程师笔记|高精度定时器同步功能

    关键词:高精度定时器同步 目录预览 1.引言 2.定时器同步结构 3.高精度定时器内部同步
    的头像 发表于 11-22 18:15 974次阅读

    STM32各类系列定时器概览

    功能,如时钟源;介绍了如何使用各种可用模式与功能;介绍了如何计算各种配置下的时基;除基本定时器模式外,还介绍了定时器同步序列以及用于电机控制应用的高级功能。本文档针对各模式提供了典型配置以及使用方法的
    发表于 08-31 10:49 0次下载

    STM32H7芯片系列中定时器同步启动并输出PWM波形的实现方法

    本文主要研究了STM32H7芯片系列中定时器同步启动并输出PWM波形的实现方法。
    的头像 发表于 10-24 14:56 686次阅读
    <b class='flag-5'>STM32</b>H7芯片系列中<b class='flag-5'>定时器</b><b class='flag-5'>同步</b><b class='flag-5'>启动</b>并输出PWM波形的实现方法