高级会员

- 积分
- 750
- 金钱
- 750
- 注册时间
- 2015-3-27
- 在线时间
- 98 小时
|
发表于 2020-8-17 16:20:00
|
显示全部楼层
本帖最后由 弦子的弦 于 2020-8-17 16:26 编辑
第一点,不知道你的测试情况,因为按程序运行的次序,有可能你观测点在发送中断和改变变量值的语句之间。
第二点,不成立,前后没有逻辑关系
第三点,可以,如果我没理解错你的意思,是一定是这样的。
第四点,TIM_GetITStatus(TIM5, TIM_IT_CC1) 表示读取TIM5中TIM_IT_CC1的状态,这个应该表示中断捕获通道1,然后将他的状态和RESET比较,如果不是,那么就说明有捕获中断产生, 然后进行进行下一个判断,是否捕获到一个下降沿。
输入捕获的核心逻辑其实比较简单,假设一种情况,正常状态下是低电平的IO口,每过一小段时间就会有一个高电平产生,然后又恢复到低电平,现在你需要来捕获这个高电平的时间。
- 首先,你需要配置定时器,包括它计数的范围和频率,然后配置他是上升沿触发捕获的,溢出自动重新转载,并使能触发会产生中断
程序运行的时候,当有一个上升沿产生,定时器就会将此刻的计数存放到特定的寄存器中(硬件自动完成),并产生一个中断,这个时候,你可以在中断中读取计数的值(第一次读值),并切记要改变定时器的捕获极性,也就是接下来,是下降沿捕获了。
当这个高电平结束后,肯定会产生一个下降沿,此时就有现了捕获中断,定时器又将值写入到特定计数器中(硬件自动完成),那么你就把这个值读取出来(第二读值)。
你已经读取了2个值,明显的,这2个值的差,就是高电平的时间。
这是一个简单的程序,但是他会有一点小问题,比如,如果你捕获的时间很长,定时器已经运行了多个周期了,定时器溢出就会重新计数(这个是通过软件配置成这样的),那么这样你再作差,显然不准确的,所以你可以在定时器溢出产生中断的时候,用一个变量作为标记,溢出中断多少次都记录下来。
另一个,在多PWM捕捉的时候,每一次捕获,都需要和前面一次捕获作差,来计算出高电平,或低电平的实际。所以你还需要注意另一个问题,就是这个上升沿(或下降沿),是否是第一个高电平(或低电平)产生的,如果是第一次产生,那么是不需要和前面低电平的计数作差的。我以前写过红外时序的解码相关的程序,其中就需要用到输入捕获,或许你可以参考一下:https://blog.csdn.net/qq_17351161/article/details/107437382 |
|