我的处理器是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
答案 0 :(得分:0)
如果您只想计算外部事件,可以为计时器选择外部时钟源。 (参考手册的“时钟选择”)。 SPL应该有一个例子。 每次需要时,都可以从Tim CNT寄存器中读取数据。 这里的问题是经常阅读计数。
通常自动重载寄存器为2个字节,因此在溢出之前最多有2 ^ 16个计数,并且丢失计数值。 定时器2和5具有4个字节的自动重载寄存器,因此您最多可以有2 ^ 32个计数。
如果你需要超过2 ^ 32的计数,你至少有两种方法:
- 定时器级联,通过将一个定时器事件设置为另一个定时器事件的时钟。
您可以在参考手册中找到“将一个定时器用作另一个定时器的预分频器”。
级联为您提供高达2 ^ 64的计时器。
“TIM_CascadeSynchro”文件夹中有一个SPL示例。
- 不太美观,但更简单的方法是创建一个计数器变量,并在计时器irq处理程序中增加它。
计数数量可以为cnt_variable * TIMx-> ARR
。
几个级联变量给出了无限制的计数器。)
答案 1 :(得分:0)
感谢您的帖子。我会尝试添加一些细节。 RPM 1被送入TIM3 ch2和TIM4 ch1。 RPM 2被送入TIM1 ch1和Tim9 ch1。两者的范围均为每秒1.25个脉冲,最高可达每秒30000个脉冲。我得到每转的脉冲数,范围从0.5到460,预期的发动机转速,150 - 3000转,所以我可以稍微扩展一下。馈送两个不同定时器的原因是能够使用基于速度(每秒脉冲数)的不同计数技术。对于低速,我可以捕获事件(脉冲)并使用ISR获取定时器计数。但是当脉冲计数变高时,我想使用不同的方法,以便每通道每秒不会产生超过1000次中断。所以我的想法是有一个计时器控制另一个。一个计时器只会计算事件而不会产生中断。第二个计数器将控制第一个计时器被允许收集事件的时间段。
谢谢, JH
答案 2 :(得分:0)
似乎你需要:根据主定时器的触发输出启用/禁用从定时器的定时器同步。 可在RM0090的以下部分中找到说明:
对于寄存器 TIMx_SMCR ,TIMx寄存器部分也可以找到很好的解释:位 TS 和 SMS ; TIMx_CR2 :位彩信。
TIMx内部触发连接(表93,97和100)可以确定一个定时器的触发输出与另一个定时器的输入之间的可能连接。您可以用作主计时器的计时器标记在下图中:
来自SPL库的TIM_ExtTriggerSynchro 示例可用于代码复制粘贴。
我认为最好的方法是:
在我看来,你可以使用16位定时器作为RPM计数器。即使在30000个脉冲上,每2 ^ 16/30000 = 2,18秒也会有溢出,这对于STM32F4时钟频率来说很少见。并使用其他计时器,例如,2秒周期,中断计算。
祝你好运!