我的处理器是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
发布于 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中找到计数的数量。几个级联变量提供了无限的计数器)。
发布于 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
发布于 2017-03-27 16:54:00
似乎您需要:定时器同步,根据主定时器的触发输出启用/禁用从定时器。有关说明,请参阅RM0090的以下部分:
段落中的
在寄存器和TIMx_SMCR:bits TS和SMS;TIMx_CR2:bits 彩信的寄存器部分也有很好的解释。
TIMx内部触发连接(表93、97和100)с包含一个定时器的触发输出与另一个定时器的输入的可能连接。可用作主控的计时器如下图所示:

可以使用SPL库中的TIM_ExtTriggerSynchro示例进行代码复制粘贴。
我认为最好的方法是:
而且在我看来,你可以只使用16位计时器作为转速计数器。即使在30000个脉冲上,也会每隔2^16/30000 =2.18秒溢出一次,这对于STM32F4时钟频率来说是很少见的。并且使用具有例如2秒周期的中断的其它定时器来进行计算。
祝好运!
https://stackoverflow.com/questions/43003145
复制相似问题