首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32定时器自动重新加载预加载

STM32定时器自动重新加载预加载
EN

Stack Overflow用户
提问于 2021-02-25 14:56:14
回答 1查看 2.7K关注 0票数 2

复制的条件:

这是我想要解决的真实生活中的例子:我正在一个stm32f411RET上开发一个应用程序,它需要动态地改变两个PWM的周期。这两个PWM需要同步并且具有完全相同的频率,但是由于一些引脚限制,我使用两个不同的timers.In我的主循环,我计算我想要的周期,并调用:

一切都很好,但对我来说令人费解的是两个计时器的初始化设置的组合:

这对于定时器2来说是非常标准的,在定时器3上几乎可以使用相同的代码,唯一的例外是LL_TIM_EnableARRPreload(TIM2);更改为LL_TIM_DisableARRPreload(TIM3);

TLDR实际问题

当我改变这两个初始化函数中的任何一个时,定时器开始工作,但改变频率会使定时器完全停止工作。我从参考手册的第316页以及包含原理图的第320和321页了解了这个函数的作用,但我仍然不能理解为什么这个设置会导致定时器冻结。

附注:它可能有用,也可能没有用,所以我把它留在这里,定时器2的ARR寄存器是32位长,定时器3的ARR是16位,这从我发布的配置中并不明显,但我怀疑这会影响结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-28 02:44:48

首先,相同的初始化例程应适用于用于生成所需PWM信号的两个定时器,除非您使用的一个定时器与另一个定时器的配置不同。

值得注意的是,TIM_InitStruct.Autoreload在初始化期间设置为0,在计数器模式/脉宽调制模式下,定时器在ARR设置为0的情况下的行为未在参考手册中记录。明智的做法是根据计时器将TIM_InitStruct.Autoreload设置为UINT32_MAXUINT16_MAX

此外,查看问题中显示的初始化例程(针对定时器2通道3),调用LL_TIM_EnableARRPreload允许缓冲对ARR值的更改。缓冲ARR更改时,仅在发生更新事件(UEV)时更新ARR值。禁用缓冲更新时,ARR值将立即更新为新值。参考手册中的下图显示了带缓冲和不带缓冲的行为。

ARR缓冲(LL_TIM_EnableARRPreload):

ARR无缓冲(LL_TIM_DisableARRPreload):

在环路中动态更新PWM值(脉宽调制周期)和比较计数器值(脉宽调制占空比,CCRn)时,通常将两个更新都缓冲/预加载是一个好主意。使用LL_TIM_OC_EnablePreload启用CCRn缓冲,如您的初始化例程中所示。缓冲ARR改变,将保持ARR更新之间的脉宽调制周期的完整性,避免任何无意的长脉冲;特别是,如果系统发现自己处于ARR new < TIMx CNT < ARR old的情况下。请注意,如果希望保持脉宽调制信号同步,则两个定时器使用相同的ARR预加载配置非常重要。

请注意,如果计时器之前没有为不同的目的进行初始化,则以下调用是多余的。

LL_TIM_OC_DisableFast(TIM2,LL_TIM_CHANNEL_CH3);

LL_TIM_DisableMasterSlaveMode(TIM2);

LL_TIM_SetTriggerOutput(TIM2,LL_TIM_TRGO_RESET);

根据您希望脉宽调制信号同步的接近程度,您可能需要考虑一个定时器作为主机(TIMxCR2.MMS=001)和另一个定时器作为从机(TIMxSMCR.SMS=100)的基本配置,其中在启用主机时启用从属定时器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66363735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档