基于STM32F103ZET6 HC_SR04超声波测距模块
这是最后的实验现象,改变不同的角度即可测得距离
板子 pz6806l 超声波模块 hc_sr04
hc_sr04模块讲解
通过该超声波模块说明书,可明白供电需vcc 5v 还需gnd echo(回响信号) trig(触发信号)
也就是说总共需要4根线,其中vcc和gnd只需要接到开发板上的5v电源和gnd即可
这是我的接线图
echo 使用的是pc3引脚,trig 使用的是pc2引脚
pc3和pc2只是普通的引脚,没任何特殊性,可凭自己想法配置不同的引脚
从超声波时序图看出,若想能够使用该模块,
1 使用你要触发信号拉高10us以上
2 接着模块内部自己发出8个40khz脉冲,不需要管,接着模块会输出回响信号,而回响信号高电平的
脉冲宽度,与距离成正比
以上知道这些就可以正常使用,至于距离公式后面会再解释
注意:
接着就是代码部分,主函数最后再介绍
hc_sr04配置函数及echo高电平时间
首先是头文件
配置一个变量 time,用于存储回响信号高电平的时间
void hc_sr04_init(void); 该函数是引脚的配置函数
float get_hcsr04length(void);该函数是用来发送触发信号,并得到回响信号的高电平时间
void hc_sr04_init(void)
{
gpio_inittypedef gpio_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_gpioc ,enable);//打开gpioc的时钟
gpio_initstructure.gpio_pin = gpio_pin_2;//配置引脚2,trig触发信号
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp;//配置为推挽输出
gpio_init(gpioc, &gpio_initstructure);
gpio_resetbits(gpioc,gpio_pin_2);//触发信号,首先把它拉低,避免额外影响
gpio_initstructure.gpio_pin = gpio_pin_3;//配置引脚3,echo回响信号
gpio_initstructure.gpio_mode = gpio_mode_in_floating;//配置为模拟输入
gpio_init(gpioc, &gpio_initstructure);//echo信号
gpio_resetbits(gpioc,gpio_pin_3);//也同样拉低
}
float get_hcsr04length(void)
{
gpio_setbits(gpioc,gpio_pin_2);
delay_us(20);
gpio_resetbits(gpioc,gpio_pin_2); //trig发送触发信号,延时10us以上就可以了
while(pci(3)==0) //当echo一直是低电平的时候,就清空,并且关闭计时器
{
tim_setcounter(tim2, 0);
tim_cmd(tim2,disable);
}
while(pci(3)==1)//一旦echo被拉高了,就说明模块传需要的数据回来了,打开计时器
{
tim_cmd(tim2,enable);
}
time=tim_getcounter(tim2);//当被拉高的echo再次变回低电平时,将计时器的值赋给time
return time;//返回time
}
计时器函数的配置
void tim_counter(void)
{
tim_timebaseinittypedef tim_timebasestructure;
rcc_apb1periphclockcmd(rcc_apb1periph_tim2,enable);//使能tim2的时钟
tim_timebasestructure.tim_period = 65535;
tim_timebasestructure.tim_prescaler = 71;//72mhx/72=1us,
tim_timebasestructure.tim_clockdivision = 0x0;
tim_timebasestructure.tim_countermode = tim_countermode_up;//向上计数模式
tim_timebaseinit(tim2, & tim_timebasestructure);
tim_cmd(tim2,disable);//关闭,需要的时候再打开
}
部分主函数
int main(void)
{
float distance=0;//存储距离
delay_init(72); //配置滴答计时器
rcc_configuration();//时钟配置
gpio_configuration();//gpio配置,只是pc0(led0),用来提示系统正常运行
tim_counter();//计时器的配置
usart1_configuration();//串口配置,
hc_sr04_init();//hc_sr04初始化配置好(即pc2,pc3的配置)
while(1)
{
gpio_resetbits(gpioc,gpio_pin_0);//提示系统正常运行进该循环
distance =(get_hcsr04length()*340/2/1000);//从函数得到距离值,340是声音的速度,除于2,是因为声波发出到接收,是一次来回,除于1000,是将距离定为mm(毫米),该函数返回的就是之前time的值
printf("距离是%.2f\r\n",distance);
delay_ms(1000);//延时1秒钟,这样不会输出太过频繁
}
}
这是我的工程文件
百度网盘 密码 v3y7
https://pan.baidu.com/s/1mnvf70_gnz5aqsm6xinrma
如有需要,可结合自己板子修改下代码即可使用,欢迎交流,咱们共同进步