首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F4 -使用计时器控制非相邻计时器

STM32F4 -使用计时器控制非相邻计时器
EN

Stack Overflow用户
提问于 2017-03-24 23:15:43
回答 3查看 1.9K关注 0票数 0

我的处理器是STM32F437ZGT6,我希望计算两个不同的脉冲串(RPM)。范围是相当宽的,我可能有一个发动机,怠速在150转,我们从凸轮得到一个脉冲,所以每转0.5个脉冲,或每秒1.25个脉冲。在另一个极端,我可能需要在每分钟3000转,每秒23000个脉冲下数460个飞轮牙齿。我有一个可用的预分频器,所以我可以将外部事件除以最多8,但即便如此,这在更高的速度下也会变得过于强烈,因为每个事件或8个事件都会导致中断。

我正在考虑的一种替代方案是让一个计时器使用外部事件作为时钟,它只会对时间窗口内的事件进行计数。我的困难来自于确定如何使用另一个计时器通过设置和清除CEN或一些类似的操作来控制窗口。

在RM0090的18.3.15节中,定时器同步示例显示一个定时器控制另一个定时器,定时器1控制定时器2。我认为这可能是有用的,但尽管我没有阅读,否则我看不到任何两个计时器可以配对。我感兴趣的信号实际上提供了两个计时器。TIM1 ch1和TIM9 ch1。

任何建议都将不胜感激,因为我不想胡乱拼凑出某种Rube Goldberg方案,即一个定时器触发ISR,然后ISR打开和关闭时间窗口。

我应该注意到,提供了一个查询表,它提供了预期的发动机速度和每转的脉冲数。

谢谢,jh

EN

回答 3

Stack Overflow用户

发布于 2017-03-25 02:56:15

如果只想对外部事件进行计数,可以选择定时器的外部时钟源。(参考手册中的“时钟选择”点)。SPL应该有一个例子。并在每次需要时从Tim CNT寄存器读取计数。这里的问题是要足够频繁地阅读计数。

通常自动重新加载寄存器是2个字节,因此在溢出和丢失计数值之前,您有最多2^16个计数。定时器2和5有4个字节的自动重新加载寄存器,因此最多有2^32个计数。

如果您需要超过2^32个计数,您至少有两种方法:

定时器级联,将一个定时器事件设置为另一个定时器事件的时钟。你可以在参考手册中找到“使用一个定时器作为另一个定时器的预分频器”。级联为您提供高达2^64的计时器。在"TIM_CascadeSynchro“文件夹中有一个SPL示例。不那么漂亮,但更简单的方法是创建一个计数器变量,并在计时器irq处理程序中递增它。可以在cnt_variable * TIMx-> ARR中找到计数的数量。几个级联变量提供了无限的计数器)。

票数 0
EN

Stack Overflow用户

发布于 2017-03-26 01:15:28

谢谢你的帖子。我将尝试添加一些细节。RPM 1输入到TIM3 ch2和TIM4 ch1中。RPM 2送入TIM1 ch1和Tim9 ch1。两者都具有每秒1.25个脉冲到每秒30000个脉冲的范围。我得到了每转的脉冲数,范围从0.5到460,以及预期的发动机转速,150 - 3000转每分钟,所以我可以缩放一些东西。馈送两个不同计时器的原因是能够基于速度(每秒脉冲数)使用不同的计数技术。对于低速,我可以使用ISR捕获事件(脉冲)并获取计时器计数。但是当脉冲计数变高时,我想使用一种不同的方法,以避免每个通道每秒产生超过1000个中断。所以我的想法是让一个定时器控制另一个定时器。一个定时器只需对事件进行计数,而不会产生中断。第二计数器将控制第一定时器将被允许收集事件的时间段。

谢谢,jh

票数 0
EN

Stack Overflow用户

发布于 2017-03-27 16:54:00

似乎您需要:定时器同步,根据主定时器的触发输出启用/禁用从定时器。有关说明,请参阅RM0090的以下部分:

段落中的

  • 18.3.14定时器和外部触发器同步从模式: Gated mode
  • 18.3.15 Timer synchronization in段落使用一个定时器启用另一个定时器

在寄存器和TIMx_SMCR:bits TSSMSTIMx_CR2:bits 彩信的寄存器部分也有很好的解释。

TIMx内部触发连接(表93、97和100)с包含一个定时器的触发输出与另一个定时器的输入的可能连接。可用作主控的计时器如下图所示:

可以使用SPL库中的TIM_ExtTriggerSynchro示例进行代码复制粘贴。

我认为最好的方法是:

  1. 将RPM引脚设置为从定时器的外部时钟源。
  2. 通过主定时器的输出比较设置从定时器的启用/禁用。因此,更改更新寄存器值,您可以更改更新事件上的主定时器中断的持续时间(可能在较少的事件上,主定时器中断处理程序中的measurement.
  3. Set register).
  4. Do TIMx_CCRx TIMx_RCR

而且在我看来,你可以只使用16位计时器作为转速计数器。即使在30000个脉冲上,也会每隔2^16/30000 =2.18秒溢出一次,这对于STM32F4时钟频率来说是很少见的。并且使用具有例如2秒周期的中断的其它定时器来进行计算。

祝好运!

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

https://stackoverflow.com/questions/43003145

复制
相关文章

相似问题

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