基于STM32超声波测距系统设计
摘 要
随着社会的发展和科技的进步,人们对测距的要求越来越高,特别是在一些要求实时测距的场合,传统的测距方式已经无法满足人们的需求,而超声波测距由于其非接触和实时反馈的特点在生活中得到广泛应用。
本系统硬件部分由电源模块、控制模块、显示模块、报警模块、超声波模块组成。电源模块的芯片是NCP1117系列芯片,目的是给单片机提供3.3V的稳定电压;控制模块用的是STM32F103C8T6芯片,用于控制整个测距系统的运行;显示模块用的LCD1602显示器,用于显示系统所测的距离的值和报警值,单位mm;报警模块用的是蜂鸣器和LED灯,在系统所测的距离值低于报警值时发出声光警报;超声波模块用的HC-SR04传感器,收到单片机的信号后会进行超声波的发射与接收。软件部分主要是配置各个模块的管脚及其输入输出方式,以及在何时启动各个模块的报警、采集数据的处理及传输。
本超声波测距系统具有结构简单、易实现、成本低等特点,适用于精度要求不是特别高的日常生活领域。
关键词
超声波测距;非接触式;STM32;Keil uVision5
目 录
第1章 概述 1
1 选题的意义 1
第2章 系统设计方案 2
2.1 超声波测距原理 2
2.2 系统结构 3
第3章 系统电路设计 6
3.1 系统电源电路设计 6
3.2 系统控制电路设计 7
3.3 系统显示电路设计 9
3.4 系统报警电路设计 10
第4章 软件设计 11
4.1 主程序程序设计 11
4.2 超声波程序流程图设计 12
第5章 组装与调试 14
5.1 实物电路测试 14
5.2 实物功能测试 16
第6章 总结 21
致谢 22
参考文献 23
附录 24
第1章 概述
1 选题的意义
早期精度较低的机械测距仪器便可满足人们生活和科技的需求,随着科学技术的进步,首先传统的机械测距仪器在精度方面不能够满足需要;其次在应用场景方面,传统的机械测距仪器局限性很大,例如在测量井深、液面高度、管道长短等场合。而超声波测距在这些方面优势明显,所以超声波测距技术发展迅速。
由于超声波指向性强,传播过程中能量损失小,并且在介质中,超声波的传播距离较远,所以超声波非常适合测量距离。并且超声波测距能够根据实时的反馈进行调整,方便在使用过程中进行控制。
由于超声测距是非接触式的检测技术,不受光线、被测对象颜色等的影响,相较于其它仪器,其更耐高温、潮湿、腐蚀气体等恶劣的环境影响,具有工作稳定、低维护、使用寿命长等特点。所以超声波测距在现实生活中应用广泛,例如汽车倒车雷达、井深测量、液面测量、管道长度测量等。目前主流的超声波测距方法有以下三种:
(1)相位法:精度高,但检测范围有限;
(2)声波幅值法:易受到反射的超声波的影响;
(3)渡越时间法:工作模式简单,直观。
第2章 系统设计方案
2.1 超声波测距原理
超声波是频率超过20KHz的机械波,作为一种特殊的声波,具备声波基本物理特性——反射。同时,超声波方向性集中、能量损耗低、可在多种介质间传播,当声波在不同的介质间传播时,大部分能量会在介质面反射。通过发射与接收的时间差与声波在介质中固定的传播速度,可以计算出发射点到反射点的距离。
产生超声波需要用到超声波发生器,常用的超声波发生器一般有两种,一种是机械式发生器,另一种是电气式发生器。机械式包括加尔统笛、气旋笛和液哨等,电气式包括压电型、电动型和磁致伸缩型等。其中较常用的是压电式超声波发生器。
压电式超声波发生器,是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。对它的两极外加脉冲信号,频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离,即时间差算法。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为v,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离s,即s=vt/2。在压电式超声波传感器中,时间的测量通常用对脉冲计数得到,发射端发射脉宽为t的脉冲,往返的时间间隔以脉冲个数n反映出来,即T=nt,则压电超声传感器测距公式为s=vnt/2。
超声波的传播速度v受温度和空气密度等因素影响,近似公式C=+0.607×T℃(为0℃时的声波速度332m/s,T为实际温度)。如果测距精度要求很高,则可通过改变硬件电路增加温度补偿电路的方法或者在硬件电路基本不变的情况下通过软件改进计算公式的方法来加以校正。
2.2 系统结构
超声波测距系统靠单片机驱动超声波模块发射超声波,然后启动定时器,在接收到返回的超声波后停止定时器计时,所得数据按照单片机程序中的公式进行计算得到距离数据,再将其输送到显示模块进行显示。并且其设有一个预警值,若数据低于阈值便会触发声光报警,精度为mm。预警值可通过按键电路进行设置大小,系统框图如图2.1所示。
图2.1 超声波测距系统框图
2.2.1控制电路
本设计的控制电路的核心是STM32F103C8T6芯片。STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,采用LQFP48封装,性价比高。其程序存储器FLASH容量是64KB,RAM容量是20KB,2个ADC合计12路通道,37个通用I/O口,4个定时器,2个IIC、2个SPI和3个USART,可实现串口通讯功能,工作电压23.6V,工作温度为-40℃85℃,系统时钟可达到72MHz。其引脚分布图如2.2所示。
图2.2 STM32F103C8T6引脚图
2.2.2 显示模块
本设计采用的显示器是LCD1602字符型液晶显示器可以显示16×2个字符,其具有显示质量高、体积小、功耗低等优点;且LCD1602采用数字式接口,操作简单方便。LCD1602内部储存了160个字符图形,其包含阿拉伯数字、英文字母、常用标点等,每个字符都有固定的代码,我们在程序中输入对应的代码,LCD1602就会把字符显示出来。
2.2.3 超声波模块
系统的超声波模块采用HC-SR04传感器,该传感器可以2cm~400cm的非接触式距离感测,测距精度可达3mm;工作电压为5V,静态工作电流小于2mA,工作稳定。其驱动方式是通过单片机I/O口发送10μs的高电平,模块会自动发送8个40kHz的超声波,并检测是否有信号返回。如果信号返回,则在I/O口输出高电平,高电平的持续时间就是超声波从发射到返回的时间,即测量距离=(高电平持续时间×声速)/2。HC-SR04传感器有4个管脚,两个引脚接电压和接地,另外两个引脚分别为触发信号输入和回响信号输出,实物图如图2.3所示。
图2.3
第3章 系统电路设计
3.1 系统电源电路设计
因为STM32单片机工作电压是3.3V,电源适配器产生的电压是5V,所以我们需要设计对其进行降压处理。我选用的是NCP1117ST50T3G芯片,保证STM32单片机3.3V的供压。电源电路图如3.1所示。
图3.1 电源电路
C5和C7两个二极管是储能电容,用来保证电流的恒定与充足,而C6和C8这两个电容用来吸收脉冲干扰并将其释放到GND。
为了判断电源电路是否正常工作,我在输出口放了一个LED灯,若灯亮则电路正常工作。图3.2为LED灯电路。
图3.2 指示灯电路
LED2为电源指示灯,其中R6电阻是为了防止电路被烧坏而添加的限流电阻。
3.2 系统控制电路设计
3.2.1 STM32F103C8T6单片机
主要作用是程序的执行与外部电路的控制。其中PC13口连接声光报警电路,输出低电平是报警;PA1、PA2、PA3三个端口分别连接三个按键,用于调节报警值,当按下PA1时,会进入报警值设置状态,按下PA2是提高报警值,按下PA3降低报警值;PC15端口连接超声波传感器HC-SR04的输入端,PC15输出高电平时传感器开始工作,PC14连接HC-SR04的输出端,输出高电平。用来接收超声波发射到返回的时间数据。PB12、PB13、PB14连接LCD显示器的片选端,PB8、PB7、PB6、PB5连接LCD的数据端,用来发送数据,单片机引脚图如图3.3所示。
图3.3 STM32F103C8T6单片机
3.2.2 晶振电路设计
为了提供更精准的时钟,我采用外部晶振和电容组成晶振电路使单片机内部产生自激振荡,为单片机提供12MHz的正弦信号。其相当于单片机的心脏,控制着程序的执行。图3.4为晶振电路。
图3.4 晶振电路
3.2.3 复位电路设计
最简单的复位电路由电容和电阻串联构成。因为电容的电压是不能突变的,当系统一上电,单片机的RST管脚会出现一个高电平,高电平持续时间由电容值决定,若检测到RST管脚持续20μs的高电平,单片机就会复位。图3.5为复位电路。
图3.5 复位电路
3.3 系统显示电路设计
系统显示部分采用的是LCD1602液晶显示器,其与单片机的连接如图3.6所示。
图3.6 lcd1602显示电路
1引脚和2引脚分别是LCD1602的接地和电源引脚。3引脚是背光调节引脚,用于调节亮度。46为片选引脚,分别与单片机的PB12、PB13、PB14端口连接。1114引脚为数据传输引脚,与单片机的PB8、PB5、PB6、PB7端口相连。15和16分别是背光控制引脚,分别接电源和接地。
3.4 系统报警电路设计
在测量距离达到预警值时会触发声光报警。单片机的PC13口连接了PNP三极管和LED1,当达到预警值时,PC13口输出低电平,二极管导通,LED1亮;三极管导通,使蜂鸣器接通高电平,发出声音。若PC13口输出高电平,则发光二极管截至,LED1灭;三极管截至,蜂鸣器停止报警。
图3.7为LED1电路图,图3.8为蜂鸣器电路图。
图3.7 led1电路图
图3.8 蜂鸣器电路图
第4章 软件设计
4.1 主程序程序设计
软件部分是配合硬件驱动超声波模块进行超声波的发射和接收,记录发射和接收超声波的时间,并计算数据后发送到LCD显示器上,并在其数值低于预警值时驱动电路中LED和蜂鸣器报警。图4.1为主程序流程图。
图4.1 主程序流程图
系统启动后,主程序开始首先对我们所用到的单片机引脚及外设进行初始化,然后进行LCD显示;JuLi这一栏用来显示所测目标距离;Set用来显示报警值,初始设置的是100mm。接下来系统会对按键端口进行扫描,当我们按下KEY1键时,此时停止超声波数据的采集,LCD屏右上角会显示字母H,这代表我们进入预警值设置模式,此时我们按下KEY2键会提高预警值,按下KEY3键会降低预警值。当扫描到无按键按下时,进行超声波数据的采集,并通过公式(超声波往返时间*340)/(2×1000)得出距离数据(单位mm),并将其发送到LCD屏幕上进行显示,同时与预警值进行比较,若低于预警值则触发声光报警;反之则继续采集数据。
4.2 超声波程序流程图设计
超声波的驱动程序时利用单片机内部的定时器测得超声波发射和返回的时间,图4.2为超声波模块的程序流程图。
图4.2 超声波程序流程图
在按键扫描完毕后,系统开始执行超声波的程序。首先单片机会通过pc15端口给超声波模块发送一个10us的高电平,超声波模块开始发送8个40KHz的超声波,接收到反射的超声波后,此时在单片机pc14接收口会输入一个高电平,在pc14口有输入时单片机会打开定时器,在输入变为低电平时会停止定时器,此值为该次测距的时间,接下来经过程序公式(超声波往返时间*340)/(2×1000)得出距离数据(单位mm),并在判断其达到预警值时,在PC13口输出低电平,使蜂鸣器发出声音,LED1灯亮;未达到报警值时会继续发射超声波。
第5章 组装与调试
5.1 实物电路测试
在组装好实物后对电路进行测试,首先给电路上电,按下开关,用万用表测STM32单片机的VCC口,正常工作的电压是3.3V,实际测得电压3.303V,代表单片机正常工作,如图5.1所示。
图5.1
接下来对显示模块进行测试,lcd1602的工作电压是5V,实际测得电压是5.012V,显示模块正常工作,如图5.2所示。
图5.2
最后对超声波模块进行测试,HC-SR04传感器的正常工作是3.3V,实际测得电压3.303V,结果如下图5.3所示。
图5.3
5.2 实物功能测试
在测试完超声波测距系统的电路后,接下来来测试系统是否实现功能。在按下开关键时,LED2灯亮了,代表电源模块正常工作,如图5.4所示。
图5.4
接着来测试该超声波测距系统的极限距离。HC-SR04模块的最大距离是4米,在实际的测试中,其最大距离可达4.586米,不过会非常不稳定,会显示1米多的数据,可能是接收到了折射的超声波。结果如图5.5所示。
图5.5
接着进行最小距离的测试。HC-SR04的最小距离是3mm,经过实际测试,在到了35mm左右的距离,测试的距离数据不稳定,经常容易突变到几米,结果如图5.6所示。
图5.6
并且在测最小距离时,被测物体离超声波测距系统距离低于100mm时,蜂鸣器开始发出声音,LED1灯亮,报警系统正常工作。
接下来进行精度测试,在离超声波测距系统100mm的位置放置了被测物体,所测得的数据为106mm,如下图5.7所示。
图5.7
接着把被测物体移动到离超声波测距系统110mm的位置时,测得的数据为115mm,如下图5.8所示。
图5.8
精度测试结果有些误差,猜测可能是尺子放置位置和移动被测物体导致的。
接下来对报警值的设置功能进行测试。在按下key0键时,lcd屏幕出现了H字母,这代表系统进入报警值的设置模式,此时系统停止发射超声波,距离值为上一次的测试结果不会改变。如图5.9所示。
图5.9
接下来再按下key1键,屏幕上设置的安全值set变为101mm,按了2次,安全值变为102mm,每按一次key1键安全值就会加1,如图5.10所示。
图5.10
再按下key2键,屏幕的安全值set变为99mm,按下3次key2键,安全值变为97mm,每按一次key键安全值会减1,如图5.11所示。
图5.11
经过测试,超声波系统的安全值设置功能正常实现。
第6章 总结
本次基于STM32单片机设计的超声波测距系统,通过STM32单片机驱动超声波模块发射超声波采集接受数据,将距离信息直接显示在LCD屏上。
因为我觉得STM32的库函数很好用,而且几次学院组织的培训中都是用的SMT32系列的芯片,所以我选择了STM32系列的芯片完成这次设计。
本次设计的超声波测距系统的测距精度方面还不够完善,可以加温湿度传感器,来排除温湿度的测距的影响。
附录
(1)硬件电路图
(3)主要程序
#include "stm32f10x.h"
#include "delay.h"
#include "LCD1602.h"
#include "led.h"
#include "key.h"
#include "stm32f10x_tim.h"
#include "TIM_Counter.h"
#include "hc_sr04.h"
float Distance=0;
u32 Juli=0;
u8 caiji=0;
u8 key_mode=0;
u8 baojing=1; //报警标志
u32 set_w_num_H=100; //设置的safe数值
//按键扫描
void scant()
{
if(!KEY0){
while(!KEY0);
if(key_mode<1){
key_mode++;
}
else{
key_mode=0;
caiji=0;
}
}
switch(key_mode){
case 0: Lcd_ShowSring(1,15," ");break;
/==========shezhi通道========
case 1: LED1=1; caiji=1;Lcd_ShowSring(1,15,"H"); break;
default :break;
}
/
//模式a,通道安全距离进行设置加减
if(key_mode==1){
if(!KEY1){
delay_ms(100);
if(!KEY1){
if(set_w_num_H<1000) {
set_w_num_H++;
}
else {
set_w_num_H=0;
}
}
}
if(!KEY2){
delay_ms(100);
if(!KEY2){
if(set_w_num_H>0) {
set_w_num_H--;
}
else {
set_w_num_H=1000;
}
}
}
Lcd_Display_4Date(2,6,set_w_num_H);
}
}
int main(void)
{
delay_init();
NVIC_Configuration();
Init_LEDpin();
KEY_Init();
LCD_init();
usart_config();
Lcd_ShowSring(1,0,"Juli:");
Lcd_ShowSring(2,0,"Set :");
Lcd_Display_4Date(2,6,set_w_num_H);
TIM_Counter();
hc_sr04_init();
while(1)
{
scant(); //按键扫描
if(caiji==0){
Distance =(Get_hcsr04length()*340/2/1000);//距离值340声音速度,除于2,除于1000,距离mm,是之前time的值
Juli=(u32)Distance;//转换为整型
Lcd_Display_4Date(1,6,Juli);//显示 Juli/10为cm
delay_ms(1000);//1秒
if(Juli<set_w_num_H) //判断
{
LED1=~LED1;//声光报警
}
else{ LED1=1;}
}
}
}
(4)元件清单文章来源:https://www.toymoban.com/news/detail-762291.html
STM32F103C8T6 1 三极管8550 1
LCD1602 1 自锁开关 1
HC-SR04 1 电源头 1
按键 3 USB线 1
滑动变阻器103 1 万用板 1
蜂鸣器 1 电阻1K 1文章来源地址https://www.toymoban.com/news/detail-762291.html
到了这里,关于基于STM32超声波测距系统设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!