赞
踩
最近在做小车避障的功能,需要用STM32F407控制5个传感器,结合板子的示例程序,调试了一段时间,终于成功读出5路传感器的测距信息。
传感器原理不详细说了,基本上从Trig脚给一个脉宽10us以上的脉冲,然后发射探头发出8个40KHz的脉冲,检测到回波后,从Echo管脚输出高电平,高电平的持续时间与距离值关系为:(高电平时间*340m/s)/2。使用中,只要采集到Echo脚高电平的持续时间,就能测距了。
在STM32F407上测量某一管脚的电平持续时间需要使用定时器的捕获功能(不知道有没有更简单的实现方法),查了手册,对于捕获模式的解释:在输入捕获模式下,当相应的ICx 信号检测到跳变沿后,将使用捕获/比较寄存器(TIMx_CCRx)来锁存计数器的值。发生捕获事件时,会将相应的CCXIF 标志(TIMx_SR 寄存器)置1,并可发送中断或DMA 请求(如果已使能)。如果发生捕获事件时CCxIF 标志已处于高位,则会将重复捕获标志CCxOF(TIMx_SR 寄存器)置1。可通过软件向CCxIF 写入0 来给CCxIF清零,或读取存储在TIMx_CCRx寄存器中的已捕获数据。向CCxOF 写入0 后会将其清零。其实就是在上升沿和下降沿分别记录定时器计数器的值,其差值相当于脉冲宽度。关于指点,网上找的图可以较清晰地表达:
首先设置定时器通道 x 为上升沿捕获,这样, t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。 这样,根据定时器的计数频率,可以算出 t1~t2 的时间,从而得到高电平脉宽。 在t1~t2时,可能计数器会超过设定值arr,产生定时器溢出,这样就要对定时器溢出处理。最终,如图所示,t1~t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。
我用了TIM2和T
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。