我们有时会利用STM32片内的多个TIMER进行级联,实现同步启动。不过有人会遇到没法同步启动的情况;或者说基于相同的配置,某次可以成功,下次再来又不行了;或者说同样的芯片、同样的代码,别人的可以,而自己却不行云云。所谓不行、不成功就是指基于同步启动后,主从TIMER的PWM输出相位肉眼可见的不同步,明显存在启动时间差。
我这里不妨先以STM32G4芯片内TIM1/TIM2/TIM3为例来演示下实现过程。看看到底能否实现,会不会碰到无法同步的情形。如果有,可否解决。
根据该系列参考手册有关TIMER内部互联关系图可知TIM1/TIM2/TIM3就可以建立起主从关系。下图便是其中的一部分TIMER信号互联触发关系图。
我将TIM1/TIM2/TIM3按照下面的方式前后主从级联。
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路完全同频同相的波形。】
利用CubeMx完成配置后,基于STM32 HAL库添加用户代码进行验证测试。经测试,发现3路输出同步与否 跟 3个定时器的初始化代码顺序有明显的关系。
比如,基于上面初始配置顺序的3路输出就没有做到同步启动,貌似互不理睬。
同样,基于上面初始配置顺序的3路输出也没有做到完美同步启动,中间那路明显异类。
然而,基于上面初始化顺序的3路输出倒是同步完美。
现在3个TIMER,初始化配置代码摆放先后顺序共6种组合,我把6种组合的实现结果集中在下面表格里一起来看。
我们发现上面6种组合中,仅表格里最后一组可以实现完美同步输出,符合预期。
也就是说,只有初始化时遵循先主后从的配置顺序才可能实现完美同步启动。
在正确的配置顺序下,我们不妨看看启动后三个定时器的计数情况:【下图是两次随机暂停程序读到的3个计数器的值,见红线下划线标示的】
我们可以清晰地看到任意两次暂停得到的三个计数器的值,两两主从定时器的计数值相差1个定时器外设时钟单位,注意是TIMER外设时钟,并不是计数时钟,具体到这里就是1us/170。【因此刻没有对时钟源分频,计数时钟刚好等于TIMER外设时钟】
一般来讲,主从间的这1个TIMER外设时钟的延时不该对应用构成影响,若觉得有影响,大概率是您选错芯片了,或许该选个主频更高的。何况当对计数时钟做分频后,计数器往往没法感觉和区分这个细小延时的。当然,实在有强迫症或其它想法,如果计数时钟跟TIMER外设时钟相同,即未做分频前提下,我们还可以通过修改计数器初始值保证启动后保持相同计数值或预期值。比方,在正确初始配置顺序下,启动前将三个计数器的初始值稍作调整,见下图红线方框里的代码。
这样调整后,每次暂停程序运行时,三个计数器的值总是保持高度一致,不差分毫。
提醒:刚才通过调整计数初值实现彻底的计数器同步计数仅限于计数时钟源没有做分频的前提下,若计数时钟有被分频是不需要这么做的,也不能这么做。因为那1个主从启动硬件延时是跟着外设时钟走的,不是跟着计数时钟走的。当计数时钟被分频后,计数器往往感受不到那个延时了,显然分频系数越大越感觉不到主从间的那个延时。如果此时手动额外在计数器初值上加1或加2就弄巧成拙了,本来可以忽略的延时被你这么一加反而加大延时了。当然,为产生启动相差而有意调整计数初始值又是另外一回事了。
到此,我们也顺便看看像下面级联的情形,主从级联,从级并列多个定时器被同一触发信号触发。
具体到这里,TIM1的触发输出同时接到TIM2/TIM3/TIM4的内部触发输入。内部信号接法见上图。
我们照样使用cubeMx配置4个TIMER。
完成配置后,添加用户代码、稍加整理 。注意各定时器的初始化顺序,必须按照先主后从的顺序进行,同级并联的无所谓先后。至于各定时器的启动函数顺序,原则上要求跟初始化顺序反过来,即按照先从后主的顺序来启动。
运行代码,可以看到4个TIMER输出的PWM输出同步得很完美。同样,我们也可以通过随机暂停程序查看4个定时器的计数值的情况。下图就是任意时刻暂停程序后得到的4个计数器的数据。详见下面截图底部表格说明。
显然,在初始计数值相同情况下,主从定时器的计数值相差1个定时外设时钟,这点跟上面的测试是一致的。另外,基于一个触发信号下的同级定时器没有计数差值。
总的说来,STM32芯片内多个TIMER实现同步启动完全可以实现,而且可以做到很好的同步,配置也简单。通常使用计数器的使能信号作为触发信号。应用中最常见的问题莫过于定时器初始化顺序不当,记得按照先主后从的顺序进行,否则会导致无法实现整体同步启动及预期输出,这里特作提醒。
审核编辑:汤梓红
-
芯片
+关注
关注
453文章
50410浏览量
421849 -
PWM
+关注
关注
114文章
5146浏览量
213410 -
STM32
+关注
关注
2266文章
10872浏览量
354826 -
定时器
+关注
关注
23文章
3237浏览量
114475
发布评论请先 登录
相关推荐
评论