一.超声波液位检测原理
1.超声波检测原理
超声波水位传感器是利用空气声学回声测距原理来进行水位变化测量的新型水位测量仪器。由收发共用换能器发射一声脉冲、经声管传声遇水界面产生反射,回波经由同一换能器接收。测得声波在空气中的传播时间及现场声速,算出换能器发射面至水面的距离,依据换能器安装基准面及水位零点得到水位值。特点是非接触测量,无需建造水位测井,安装方便,自动测量;具有声速补偿;检测示意图如下图:
2.超声波传输时间的计量方法分析
根据超声波测距的原理,发射换能器发出的超声波,在媒介中传播到物体表面,经过反射后再通过媒介返回到接收换能器,通过测量超声波从发射到接收所需的时间(t),根据媒介中的声速(v),就能计算出从换能器到物体表面之间的距离(L)。
被测距离的表达式:L=1/2*v*t;
v:声速值。单位:m/s。
L:超声波探头距所测液位距离。单位:m。
t:测量范围内声波的运行时间。单位:s。
采用脉冲计数的方法间接测量被测时间,可以满足高精度要求。
二.原理图
1.设计功能
水箱液位检测系统是通过超声波测距模块对水位进行监控,并将受到的信号送到单片机中进行处理,能够对水箱的静态或动态液位进行实时测量,显示被测液位值;当水箱液位低于设置的下限值时,开启注水阀;当液位超限后,蜂鸣器报警,并开启出水阀。
2.整体框图
根据系统的设计要求,采用单片机为主控芯片,该系统主要由传感器模块 ,液晶显示器模块,控制键盘,报警电路等模块组成,其系统框图如图2-4所示:
3.超声波模块电路
(1)超声波发射电路
声波在空气中传播受空气介质影响,距离越大衰减越大。为能接收远距离得回波,采取有效措施有:增加驱动功率,减小声波频率(频率越低,衰减越慢)。具体电路如图:
超声波发射电路由NE555振荡电路、晶体管放大电路、变压器以及压电超声波传感器组成。40KHz振荡信号由NE555集成块和周围电路产生,然后送至放大电路驱动压电传感器发出一系列的脉冲群,每一个脉冲群持续时间大约为0.15ms 左右。信号经过三级管放大,再经过阻抗匹配电路即变压器(变压器输入输出比1∶10 ) 后,驱动超声波发射头,发射换能器两端就加上了高电压,内部的压电晶片开始震动,经过压电换能器将发出40KHZ的脉冲超声波。
(2)超声波接收电路
微弱信号需要放大整形,超声波发射器在发射超声波时,有一部分声波从发射器直接传到接收器,这部分信号直接加到回波信号中,干扰回波信号的检测。超声波接收电路将接收换能器输出的微弱信号,进行滤波、放大、检波、整形,得到大幅值电信号,供单片P1.6口辨识。具体电路如图所示:
4.总体硬件原理图
三.程序设计
单片机上电后进入主函数,先对系统的各个电路进行初始化,然后开始发射超声波并启动计时器,等接收电路接收到超声波信号后,引发单片机内部中断。计时完毕后主程序开始处理数据,最后做出相应的动作。
/******主函数**********************************************/
void main(void)
{
initIO(); //初始化IO端口
delay500ms(); //启动延时,给器件进入正常工作状态留够时间
initLCD1602(); //LCD初始化
putLineCharsToLCD1602(lineOne, 8, 8, "D:000cm "); //显示distance (总)距离(检测探头到水库底部的距离)D
putThreeCharToLCD1602(lineOne, 8 + 2, uiD); //显示三位数值
putLineCharsToLCD1602(lineOne, 0, 8, "H:000cm "); //显示设定的最高报警水位H
putThreeCharToLCD1602(lineOne, 0 + 2, uiH); //显示三位数值
putLineCharsToLCD1602(lineTow, 0, 8, "L:000cm "); //显示设定的最低报警水位L
putThreeCharToLCD1602(lineTow, 0 + 2, uiL); //显示三位数值
putLineCharsToLCD1602(lineTow, 8, 8, "C:000cm "); //显示当前CURRENT水位C
initTimer0(); //初始化定时器0
initTimer1();
//阀门动作:初始先排水
io_Control_Inlet = isio_Control_Inlet_OFF;
io_Control_Outlet = isio_Control_Outlet_ON;
g_flagSwitch = isNo;
while(1)
{
io_US_TX = 1; //启动超声波模块信号
delay10us();
io_US_TX = 0;
while(io_US_RX == 0); //等待计时开始
TR0 = 1; //开启定时器0,计时开始
IT1 = 1; //设置外中断INT1输入信号模式(1:Falling only仅下降沿有效 0:Low level低电平有效)
EX1 = 1; //使能外中断INT1
while(EX1 == 1 && g_flag == isNo)//等待中断或超时退出
{
uchar ucKeyValue = GetKey(); //在等待中检测按键
if(ucKeyValue) execute_key_task(ucKeyValue); //如果有键按下则执行按键任务
}
if(CalculatedWaterLevel() == isNo) continue; //计算水位,如果超出范围返回isNo并重新循环
TR0 = 0; //暂时关闭定时器0
//清零定时器和计数变量以及标志
TL0 = 0;
TH0 = 0;
g_flag = isNo;
ucCount = 0;
g_flag05s = isNo;
TR0 = 1; //打开定时器0
while(g_flag05s == isNo) //延时0.52秒,以防止此期间返回的超声波产生错误信息,并使显示变化放慢,保证视觉效果
{
uchar ucKeyValue = GetKey();
if(ucKeyValue)
{
if(ucKeyValue == DATA_KEY_DEC)
{
g_flagBeepTimer = isNo;//用减小按键取消报警标志
}
execute_key_task(ucKeyValue); //如果有键按下则执行按键任务
}
}
TR0 = 0; //暂时关闭定时器0
//清零定时器和复位标志
TL0 = 0;
TH0 = 0;
g_flag = isNo;
//-----------------------------------
//水箱清洗提示:
if(g_flagBeepTimer == isYes)
{
buzzerCall();
//用减小按键取消报警标志
}
//-----------------------------------
}
}
关注公众号-单片机实例设计,发送“超声波液位”获取资料。