输入捕获实验 首先,先让定时器可以正常的计数,就是对定时器预分频值,预装载值,这个如何配置在定时器中断实验里面已经学习过了了。我们需要的是在这基础上,用这个定时器去捕获输入高电平的时间。 原理差不多是这样的: 原理如上图:当IO口电平发生变化或者定时器溢出的时候,进入定时器中断,设置一个捕获标志位和溢出计数器次数的参数。因为上升沿进入中断时,将捕获标志位置1,当下降沿进入中断时,将捕获标志位置0,同时,对溢出计数器次数的参数进行清0。所以,标志位从1变到0的时间就是高电平的时间。因为有时候高电平太长,单用一次定时器循环的话时间不够,所以每当定时器溢出的时候,如果捕获标志位为1的话,就对定时器溢出的参数加1,否则不变。这样就对长时间高电平也可以实行计时间。 这个实验主要比定时器中断实验多了捕获功能,需要用到一些寄存器。 tiM5_ICInitStructure.TIM_Channel= TIM_Channel_1; //CC1S=01 TIM5_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //上升沿捕获 TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM5_ICInitStructure.TIM_ICFilter = 0x00; /IC1F=0000 配置输入滤波器不滤波 因为TIM5有四路通道,所以通过寄存器TIMx_CCMRx控制哪路输入的通道 TIMx_CCER 寄存器中的 CC1P 位和 CC1NP 位来控制捕获是上升沿捕获还是下降沿捕获 TIMx_CCMR1 寄存器中的 IC1PS 位来控制分频,这里不分频 TIMx_CCMR1寄存器中的IC1F:输入捕获滤波器 ,具体的手册里都有介绍 进入中断后,主要就是看溢出标志位和捕获标志位 其中,捕获标志位寄存器里有,在TIMx_SR的CC1OF:捕获/比较 1 重复捕获标志 (Capture/Compare 1 overcapture flag),这个寄存器我在TIM5里面找不到,在9-14里面有对这个寄存器详细介绍。 溢出计数器参数,是对是否捕获到高电平进行判断,如果有,则他加一,如果没有,则这个值等于1。因为比较难,我画了中断函数里的流程图: 而且,画流程图真的挺不错,本来还不是太懂的,画了流程图之后,完全明白了。
|