前言:该文章主要讲解以stm32f103c8t6为主控,用HAL库来对HC-SR04超声波模块的进行代码编写。代码的主要核心思路是通过定时的输入捕获模式对Echo的信号进行捕获,这里我采用的是双通道的形式分别捕获Echo的上升沿和Echo的下降沿。通过分别读取两个通道捕获的计数值,然后做差就可以得到Echo信号的高电平时间。
1.HC-SR04实物图:
1.1HC-SR04引脚说明:
- Vcc:+5V电源供电
- Trig:输入触发信号(可以触发测距)
- Echo:传出信号回响(可以传回时间差)
- Gnd:接地
2.超声波模块的性能指标
3、超声波模块原理
在TRIG 管脚输入一个10US 以上的高电平(一般建议50US 左右),芯片(TP,TN 管脚)便可发出8个40KHZ 的超声波脉冲,然后(RP,RN)检测回波信号。当检测到 回波信号后,通过ECHO管脚输出,如图5所示。
根据ECHO管脚输出高电平的持续时间可以计算距离值。即距离值为:(高电平时间 *340m/s)/2。 当测量距离超过测量范围时,CS100A仍会通过ECHO管脚输出高电平的信号,高电 平的宽度约为33ms。如图6所示:
测量周期:当芯片通过ECHO管脚输出的高电平脉冲后,便可进行下一次测量,所 以测量周期取决于测量距离,当测距很近时,ECHO 返回的脉冲宽度较窄,测量周期就 很短;当测距较远时,ECHO返回的脉冲宽度较宽,测量周期也就相应的变长。 最坏情况下,被测物体超出测量范围,此时返回的脉冲宽度最长,约为 33ms,所 以最坏情况下的测量周期大于33ms即可(比如测量周期可取50ms)。
4、代码详解
当我们搞明白上面的原理后,就可以根据上面的原理来编写代码了
4.1 Trig 的初始化
根据原理可明白超声波模块的触发是要给Trig一个不低于10us的一个高电平信号。
Trig引脚初始化
Trig发出起始信号
4.2 Echo的初始化
Echo是用来接收Trig传过来的信号的,通过计算传过的信号中高电平的时间就可以计算出距离了。这里我采用的是双通道的形式分别捕获Echo的上升沿和Echo的下降沿。通过分别读取两个通道被捕获的计数值,然后做差就可以得到Echo信号的高电平时间。
定时器输入捕获初始化,
打开IC_IT中断和事件中断(需要注意的是:stm32f103c8t6的定时器2,3,4的中断源都是一样的,(如定时器2的中断源都是TIM2_IRQn)。而定时器1的中断源是详细的分开的)
这里打开事件中断的目的是记录每次计数器溢出的次数,防止在第2个通道捕获计数器的值时与第一个通道捕获时不在一个计数周期内,这样获取Echo高电平时间在做差时可能出现负数。(注意:每次都有清除事件中断产生的标志位)
4.3计算距离
根据Echo管脚输出高电平的持续时间可以计算距离值。即距离值为:(高电平时间 *340m/s)/2。(这里再除以2 是因为Frig发出超声波到Echo接收超声波一来一回,所以要除以2)
高电平时间 = ECHO_Time2 -ECHO_Time1 (两个通道捕获的计数值做差)(注意该获取的时间单位是微妙)
ECHO_Time=ECHO_Time2-ECHO_Time1; ECHO_Time高电平时间