输入捕获实验 捕获是如何实现的?与定时器有什么关系?它为什么就能够捕获到呢? 先入为主:可以利用定时器捕获某些IO口的高电平脉宽,脉宽时间可以通过串口打印得到。 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时器除了TIM6和TIM7,其他的都具有输入捕获功能。STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。 捕获模式与比较模式的理解: 捕获模式的原理是选定的输入引脚发生选定的脉冲出发沿的时候,则该时刻定时器的计数值TIMx_CNT将被保存,同时产生中断(TIMx_CNT的值不会与任何东西进行比较)。该功能最常用的的就是测量一个外来脉冲的脉宽。 比较模式的原理是当CCRx寄存器中设定的值与定时器计数器值相等的时候,相关引脚发生电平跳变,同时产生中断。该功能常应用于产生一个一定脉宽的PWM波形。 数字滤波器由一个事件计数器组成,它记录到N个事件后会产生一个输出的跳变: 这个N可以取值具体参考中文手册,意思是说:我采样高电平,只有连续采样到N个电平是高电平的话我才认为是有效的高电平,低于N个我就认为是无效的。 PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx信号。 3. 这两个ICx信号分别在相反的极性边沿有效。 4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。 5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。 6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期) 7. 由此可以计算出PWM的时钟周期和占空比了 frequency=f(TIM时钟频率)/n。 duty cycle=(高电平计数个数/n), 若m为高电平计数个数,则duty cycle=m/n 若m为低电平计数个数,则duty cycle=(n-m)/n 注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的 最小频率= TIM时钟频率/65535。 测量脉宽的理解: 输入捕获的原理是,定时器正常计数运行,当外部脉冲到来时,将定时器计数值存起来,当下次脉冲到来时,求出这两次计数值差值,即为这两段脉冲的周期。例如,定时器计数到10,外部脉冲到来,使用last_time_CH1存储10,下次脉冲到来,此时定时器计数值运行到110,使用this_time_CH1存储110,之后做差,tmp16_CH1存储差值100,由于定时器运行于100KHZ,10us计数值增加一次,所以脉冲周期为100*10=1000us=1ms,即为1KHZ。当然,定时器会溢出重装,此时需要将差值补偿运算,tmp16_CH1 = ((0xFFFF - last_time_CH1) + this_time_CH1);可测量的范围取决于定时器运行的频率,如果外部频率慢到当定时器整个计数一周后也没有触发两次,会发生溢出,此时计数值已不准确。所以定时器时钟配置取决于外部脉冲频率,应配置得当使得脉冲频率范围不致溢出。由于每次外部脉冲都会触发中断,尤其是四通道时,所以使用中断方式会略微占用CPU资源,使用DMA可以解决这一问题。 得到脉冲周期后,即可通过运算获得外部频率,进而测速。 本文来源:https://www.wddqw.com/doc/8f358e62cc84b9d528ea81c758f5f61fb7362807.html