小弟想用TIM3的CH1来捕获脉冲,奈何计数器TIM3_CNT只有16位,72M主频时低于1.1KHz的脉冲就捕获不到,想用上计数器的溢出标志进行补充,扩大捕获周期,看了下资料没找到计数器的溢出标志,还请高手指点,谢谢。
我是想在每次溢出时进行计数,计算脉冲频率的时候结合定时器的溢出次数和当前的捕获值,脉冲计算完成后清溢出计数,这样就可以捕获周期比较长的脉冲,然后又不用分频损失精度,只是看定时器的那些标志位有些晕乎,不知道怎样能实现我的要求,还请高手指点!
计数器的溢出标志在定时器里面肯定是有的,在仔细看下DATASHEET
经过一段时间的调试还发现定时器有丢失捕获标志的现象,勘误表里面也有提到,做个32位计数器多好啊!!!
现在发现一个致命问题,溢出计数和脉冲捕获相结合的方式要求每次捕获发生时都能捕捉到,因为我在计算输入脉冲的时候对溢出计数清零,如果捕获事件发生了5次,程序中仅捕捉到3次(采用查询的方式),计算脉冲就会出现错误,除非是程序采取中断方式进行捕捉,但高频脉冲输入时,频繁的中断显然是极大的开销,会影响其他重要事件的执行力度(eg:PWM输出)。
高频脉冲输入时,怎么会有计数溢出呢?既然有计数溢出,就不可能有频繁的中断。
请讲清楚你的真正需求。
外部脉冲输入不是我能控制的啊,我需要捕获1Hz~50KHz的脉冲。
这个频率范围是有点大,1HZ肯定要溢出了,建议加个倍频电路,不然定时器可能要溢出N次了
50kHz的周期是20us,这个时间对于STM32的72MHz主频来说并不算快,不会有你说的频繁中断问题。
同意 11楼:版主 的观点。
我以前在普通的89C51上用过50us定时中断,外接晶振是11.0592, 执行最快的单字节指令也要1us多,现在的STM32的72MHz主频,执行一条指令要比那时的51快N倍,20us的中断频率应该可行,不会有你说的频繁中断问题。
不知道你的产品用在什么地方,对可靠性要求有多高,我这个要用在工业控制领域,除了性能需要的中断,其他地方都不允许使用中断。
每20us产生一次中断,你的可靠性都保证不了,那么怎么样的硬件环境才能满足你的要求呢?即使是使用32位的定时器,也不能避免每20us产生一次中断呀,难道使用32位的定时器你有什么高招避免频繁中断?
32位的定时器我直接采用查询的方式计算脉宽就行了,也就是说中断是留给跟性能相关的功能使用,像脉冲捕获这些功能还有串口通讯这些都是不能使用中断的。
用中断是最省事的方式,什么功能都使用中断,系统的核心性能如何保障,这个是做产品不得不面对的问题。
谢谢5楼的指点,另外还需设置updata标志的触发源,以我为例,需要在计数器上溢时产生updata标志。
TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Regular);
#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /*!< Source of update is counter overflow/underflow. */
32位的定时器我直接采用查询的方式计算脉宽就行了,也就是说中断是留给跟性能相关的功能使用,像脉冲捕获这些功能还有串口通讯这些都是不能使用中断的。 ...
如果采用查询的方式可以解决问题,溢出标志也可以使用查询方式呀,为什么一定要用中断呢?
关键是我在6楼提到的问题,查询的时候会有漏掉捕获事件的问题,造成计算脉冲错误。