超声波测距.docx
- 文档编号:4976803
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:21
- 大小:169.61KB
超声波测距.docx
《超声波测距.docx》由会员分享,可在线阅读,更多相关《超声波测距.docx(21页珍藏版)》请在冰豆网上搜索。
超声波测距
超声波测距
超声测距
该电子产品-超声测距仪是在按键的步进控制下实现在30cm~120cm的距离探测,并具有数码管实时显示探测距离值功能,设定距离值报警功能,手动调整报警范围等功能。
1.硬件电路原理设计
该超声测距仪其硬件电路框图如图1所示(虚线框图电路不在机器内部PCB电路板上)。
整个电路可分为电路板供电电路,超声波发射接收电路,控制、显示及报警电路三个大的部分。
交流220V的市电经经变压、整流滤波、稳压的处理后输出±12V和+5V的恒定直流电压供应整个电路各个部分电源使用。
脉冲产生电路产生的40KHz的脉冲信号经驱动电路驱动功率后进如超声波发射器,让其发出超声波。
超声波接收器接受到发射器发出的超声波信号后经信号方大、处理比较后进入单片机微控制器,单片机将进行计算分析后在数码管显示模块显示出当前测量距离值。
并与从按键处设定的报警上下限值进行比较,当超出其所设定值时,报警电路将启动,红色警报灯点亮。
图1硬件电路框图
下面将分别按照上面陈述的电路分三个部分进行分析,图2是其电路原理图
图2硬件电路原理图
1.1电路板供电电路设计
电路板供电电路如图2所示,220V的市电经变压器变压后输出两路交流15V电压,此电压经整流、滤波处理后输出±15V直流电压,分别经三端集成稳压芯片U1(7812),U2(7912),输出恒定的+12V电压和-12V电压,这两路电压提供运放芯片所需电源及PCB板电路部分需要电压。
+12V电压经U3(7805)后输出恒定+5V电压,供应单片机、555芯片等芯片所需电源。
图2电路板供电电路原理图
1.2超声波发射接收模块设计
超声波发射接收模块电路如图4所示,单片机PD7端口控制脉冲产生电路的启动与否,脉冲产生电路由555芯片接成多谐振荡器,选取合适的元器件参数,U4(555芯片)第三脚将输出40KHz的矩形波脉冲信号,此信号经反相器U5(CD4049)接成的驱动电路后进入超声波发射器,由电压信号转换为机械信号,发射出超声波。
555芯片输出信号同时将此信号反馈到单片机PD3端口,当单片机接收到此脉冲信号的上升沿,将触发其内部定时技术器工作,开始测距。
此反馈接法也调高了测距精度。
超声波接受器接到发射器产生的超声波信号后(正弦波)经运放芯片U6(LM358)两路放大后输入运放芯片U7(LM311)的同向输入端进行信号比较,反向输入端的基准电压信号通过调节精调电位器VR2获取,此电压调节电路即超声测距仪测量灵敏度调整部分。
U7同时具有去除干扰信号等功能。
经电压比较后的得到+12V矩形波脉冲信号经反相器U5将得到+5V的矩形波脉冲信号,输入单片机PD2端口触发中断,单片机内部计数器停止计算。
对所测距离进行计算分析。
J2,J3端口连超声测距仪后面板的超声波发射接收器。
图4超声波发射接收模块原理图
1.3控制、显示及报警模块设计
超声测距仪采用ATMEGA16单片机作为微控制器。
其控制电路图如图5所示。
I/O口PA和PB部分端口分别连接前面板四位数码管的段选端和位选段。
ATMEGA16单片机内部具有上拉电阻,具有很强的带负载能力,因此I/O端口未加三极管驱动电路便与LED数码管相连,而限流电阻放置于前面板的数码管段选端上,减少PCB板的元器件数。
J6端子座连接前面板的按键模块。
J7为单片机JATA接口,使超声测距仪具有产品程序维护,升级功能。
图5控制电路原理图
超声测距仪的报警电路如图6所示。
当所测量距离范围在报警设置值内,单片机PC7端口将输出高电平控制继电器的导通。
此时报警指示灯点亮。
继电器输出端子座连接超声测距仪前面板的报警接口,此报警接口可外接电路设备(如电动机)作为超声测距仪的扩展功能。
图6报警电路原理图
2软件设计
2.1算法特点
应用中值法:
采样数据中的5个数据,舍去其中的最大值和最小值之后,求取平均值有利于测量的精确性,提高测量精度,减少实属浮动,是我们此次程序算法的一大亮点;算法:
超声波的速度等于2倍超声波的路程/时间,即V=2S/T,所以距离=V*T/2应用公式假设声速为340m/s,则1cm时间=1/17000=58.852us,所以130cm的时间等于58.852*130=7.647ms,在此我们选用了定时计数器T1、8分频,即定时计数器T1计数时间为1/1000000=1us,用以提高精度定时计数器T1计满所用的时间等于65535*1=65.535ms,超声波可以走65.535/58.852*1000=1113.556cm,所以有充足的量程,然后我们在这里应用了超声波的声速算法公式,即V=331.4*sqrt(1+T/273)(T为温度),让计算出来的数值更加精确,而我们的误差修正则用了计算值-实际误差系数的方法而不是乘以误差系数,因为实际测量时由于超声波接收换能器有个起振过程,所以决定了一开始本因接收到的超声波,没接收到,使测量时间恒长于实际时间,所以测量值恒大于实际值一定的值,而且当距离变远时,接收到的幅度下降不大,反而是噪声大幅提高,从而使最后的比较器连噪声也通过了,造成无法正常视数,所以,误差系数变化很小连1mm都没有,所以这里我们采用了做差的方法,在加上我们采用了double变量,精确到小数点后很多位,提高精度;误差累计修正及滤波:
一阶滤波,滤波系数为0.1软件滤波减少干扰,应用C语言的四舍五入函数ceil,避免累积误差和视数抖动;
2.2程序框图
开始端口初始化设置后,开始发射超声波,待接收到超声波发射反馈信号后进入外中断INT1中断程序,置位标志位后跳出死循环;延迟200us,待接收到超声波接收信号进入外中断INT0中断程序或者是定时计数器T1计满溢出进入相应中断程序,置位标志位后跳出死循环显示;开始进行计算,后将值显示。
然后再判断是否再报警距离以内,报警与否;接着按键扫描,判断是设置报警下限还是报警上限,是步进加1cm还是步进减1cm,最后延迟显示;不断循环。
图7超声测距仪主程序
图8超声测距仪子程序
3.创新点
3.1超声波发射模块中脉冲信号的产生。
超声波发射模块所需的脉冲信号由555芯片接成多谐振荡器电路产生矩形波脉冲信号,因所选取的超声波发射器在40KHz的脉冲信号驱动下,其发射功率将会最大,并且信号的占空比也会有影响,而50%的占空比最佳,图10是555多谐振荡器的基本接法,其脉冲周期T=t1+t2。
t1代表充电时间(电容两端电压从DDU上升到DDU所需时间)
t1≈0.7(R1+R2)C
t2代表放电时间(电容两端电压从DDU下降到DDU所需时间)
t2≈0.7R2C
因而有T=12t+t≈0.7(R1+2R2)C
对于矩形波,除了用幅度、周期来衡量以外,还存在一个参数占空比q,
q=T/tP因此我们在此选用了10K电阻和10K滑动变阻器再加上102,实现这一目的,如图11所示。
并且我们在此应用了反馈信号,使测量值更加准确。
图9多谐振荡器电路图10多谐振荡器电路
3.2AVR单片机复位电路
AVR单片机内部有上电复位电路,开机时会自动产生复位电平,从而使单片机自动复位,因此我们节省了一些成本。
3.3按键和555驱动设计
由于考虑到AVR单片机单口内部都自带了上拉电阻,有很强的驱动能力,因此我们节省了按键部分的上拉电阻和555芯片控制部分的三极管和部分电阻,从而节约成本。
3.4上限过值报警
按键设置键时不但可以设置下限报警,还可以设置上限报警,当距离高于设置值时,自动报警。
3.5回差设置
为了避免视数抖动时,继电器反复开关伤害继电器本身,也不实用,所以我们设置了回差报警回差值为1cm。
附件
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharTAB[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xC6,0x89,0xC7,0xBF};
//定义数组用以数码管显示查表,分别为0,1,2,3,4,5,6,7,8,9,无,C,H,L,-
ucharH=1,L=0,Back=0,Gi=0,Go=0,Clear=0,Out1=0,Out2=0,Out3=0;
//定义标志位,H为高位设置标志位、L为地位设置标志位、Back为按键返回标志位、Gi为延迟重复标志位、Go为按键跳出标志位
//Clear为无接受信号标志位、Out1为外反馈信号中断标志位、Out2为接收信号中断标志位、Out3为定时器溢出标志位
uintJuLi=30,Max=120,Min=30,Distance=0;
//定义变量,JuLi为之前距离值及显示变量、Max为最大值设置变量、Min为最小值设置变量,Distance为当前距离值变量
interrupt[EXT_INT0]voidext_int0_isr(void)
{
TCCR1B=0x00;
Out2=1;
Clear=0;
GICR=0x00;
GIFR=0x00;
}
//外部中断INT0服务子程序,当接收到外部接收信号下降沿时进入终端服务子程序
//关闭定时计数器T1,置位中断标志位Out2,清零无接收信号标志位Clear,关闭外中断
interrupt[EXT_INT1]voidext_int1_isr(void)
{
TCCR1B=0x02;
Out1=1;
GICR=0x40;
GIFR=0x40;
}
//外中断INT1服务子程序,当接收到外部反馈信号下降沿时进入终端服务子程序
//开启定时计数器T1,置位中断标志位Out1,开启外中断INT0
interrupt[TIM1_OVF]voidtimer1_ovf_isr(void)
{
TCCR1B=0x00;
Out3=1;
Clear=1;
}
//定时计数器T1溢出中断服务子程序,当无接受到信号时,定时计数器计满自动中断,表明无接收到信号
//关闭定时计数器T1,置位标志位Out3,置位无接收信号标志位Clear
voidPanDuan(void)//报警判断子程序
{
uchara;
if(Clear==1)//判断是否无接收到信号,(是,将要判断的距离设置在最大值和最小值之间)
{
a=JuLi;
JuLi=(Min+Max)/2;
}
if(JuLi>Min&&JuLi { PORTC.7=0; } if(JuLi { PORTC.7=1; } if(JuLi==(Min+Max)/2)//判断是否被设置在最大值和最小值之间,即无接收到信号,(是,还原距离值) { JuLi=a; } } voidDelay_X(uintDisPlay)//按键延迟服务子程序 { uchari,j,ab[4]; uintx; for(j=0;j<25;j++)//重复延迟25次,延迟时间为25*4等于100ms { x=DisPlay;//将显示的数值送入显示变量x中,避免动态扫描出现无显示情况 for(i=0;i<3;i++)//将显示的值送到数组ab【4】中 { ab[i]=x%10; ab[i]=TAB[ab[i]]; x=x/10; } if(H==1)//判断是显示高位H,还是低位L { ab[3]=TAB[12]; } if(L==1) { ab[3]=TAB[13]; } for(i=0;i<4;i++)//移位显示数值 { PORTA=(0x01< PORTB=ab[i]; delay_ms (1); PORTB=0xFF;//***重点***//避免会出现不该又显示的,显示了视数值的像 } } Gi++; if(Gi==5)//判断重复显示次数是否为5,即延迟为5*100等于500ms,避免按键时跳出按键程序 {//置位按键返回标志位Back Back=1; } } voidJia(void)//步进加1cm子程序 { Back=1;//置位返回标志位Back,即按下加键后,设置键有返回功能 PanDuan();//判断警报与否子程序调用,//***重点***//在设置时,一旦先前距离在设置警报距离内,开警报 if(H==1)//判断是设置高位 { if(PORTD.5==0&&Max<120)//判断是否按下加键,同时要求设置距离不大于量程最大值测量距离,(是,步进加1) { Max++; } Delay_X(Max);//延迟100ms显示,避免按键抖动,也保证的按键有自动累加功能,即按住加按键会步进加1cm } if(L==1)//判断是设置低位 { if(PORTD.5==0&&Min { Min++; } Delay_X(Min);//延迟100ms显示,避免按键抖动,也保证的按键有自动累加功能,即按住加按键会步进加1cm } } voidJian(void)//步进减1cm子程序 { Back=1;//置位返回标志位Back,即按下减键后,设置键有返回功能 PanDuan();//判断警报与否子程序调用,//***重点***//在设置时,一旦先前距离在设置警报距离内,开警报 if(H==1)//判断是设置高位 { if(PORTD.6==0&&Max>Min)//判断是否按下减键,同时要求设置距离不小于最小值,(是,步进减1) { Max--; } Delay_X(Max);//延迟100ms显示,避免按键抖动,也保证的按键有自动累减功能,即按住加按键会步进减1cm } if(L==1) { if(PORTD.6==0&&Max>30)//判断是否按下减键,同时要求设置距离不小于量程最小测量距离,(是,步进减1) { Min--; } Delay_X(Min);//延迟100ms显示,避免按键抖动,也保证的按键有自动累减功能,即按住加按键会步进减1cm } } voidHorL(void)//最小报警距离和最大报警距离设置判断程序 { uchara=0; while(a==0)//第一次按下设置键后,在案件程序下死循环 { if(PORTD.5==0)//判断是否按下加键,是(跳入加子程序) { Jia(); } if(PORTD.6==0)//判断是否按下减键,是(跳入减子程序) { Jian(); } if(H==1)//判断延迟显示为高位还是低位 { Delay_X(Max); } if(L==1) { Delay_X(Min); } if(PORTD.4==0&&Back==1)//判断是否第二次按下设置键,同时返回标志Back是否置位,(是,设置各标志位) {//***重点***//设置显示低位设置,同时置位跳出按键程序标志位Go H=0; L=1; Back=0; Gi=0; Go=1; } if(PORTD.4==0&&Back==1&&Go==1)//判断是否第三次按下设置键,同时返回标志Back是否置位,即跳出按键标志位Go是否置位, {//(是,设置个标志位)//***重点***//设置下次按下设置键时一样从高位开始显示, H=1;//跳出死循环标志为a置位 L=0; Back=0; a=1; Gi=0; Go=0; } } delay_ms(200);//延迟200ms,防止设置键按键抖动 } voidKey(void)//设置键按键判断子程序 { uchari; for(i=0;i<10;i++)//重复10次,判断是否按下设置键 { if(PORTD.4==0) { HorL(); } } } voidLED_Show(uchard)//数码管动态扫描显示距离子程序,变量d为延迟显示时间 { uchari,j,ab[4]; uintx; doublea,b; Key();//***重点***//确保在延迟显示距离时,设置键依然有效 a=Distance;//将现在测量到的距离送入变量a中 b=JuLi;//将之前测量到的距离送入变量b中 if(Clear==1)//判断是否无接收到接收信号,(是,保留之前的距离值) { a=JuLi; } a=ceil(0.9*a+0.1*b);//一阶滤波,滤波系数为0.1软件滤波减少干扰,应用C语言的四舍五入函数ceil,避免累积误差和视数抖动 JuLi=a;//将处理后的当前距离值送入显示变量JuLi中 for(j=0;j { if(JuLi<=130&&JuLi>=100&&Clear==0)//判断是否在130cm到100cm之间,同时接收到信号,(是,显示为XXX) { x=JuLi; for(i=0;i<3;i++) { ab[i]=x%10; ab[i]=TAB[ab[i]]; x=x/10; } ab[3]=TAB[10]; for(i=0;i<4;i++) { PORTA=(0x01< PORTB=ab[i]; delay_ms (1); PORTB=0xFF; } } if(JuLi<100&&JuLi>=10&&Clear==0)//判断是否在99cm到10cm之间,同时接收到信号,(是,显示为XX) { x=JuLi; for(i=0;i<2;i++) { ab[i]=x%10; ab[i]=TAB[ab[i]]; x=x/10; } ab[2]=TAB[10]; ab[3]=TAB[10]; for(i=0;i<4;i++) { PORTA=(0x01< PORTB=ab[i]; delay_ms (1); PORTB=0xFF; } } if(JuLi<10&&JuLi>=6&&Clear==0)//判断是否在9cm到6cm之间,同时接收到信号,(是,显示为X) { x=JuLi; for(i=0;i<1;i++) { ab[i]=x%10; ab[i]=TAB[ab[i]]; x=x/10; } ab[1]=TAB[10]; ab[2]=TAB[10]; ab[3]=TAB[10]; for(i=0;i<4;i++) { PORTA=(0x01< PORTB=ab[i]; delay_ms (1); PORTB=0xFF; } }if(JuLi>130||JuLi<6||Clear==1)//判断是否在130cm以上或者6cm一下或者无接收到信号,(是,显示为----) { x=JuLi; for(i=0;i<3;i++) { ab[i]=TAB[14]; } for(i=0;i<4;i++) { PORTA=(0x01< PORTB=ab[i]; delay_ms (1); PORTB=0xFF; } } } } FaShe(doubleT,doubleXiShu)//发射超声波子程序,变量T为温度系数,变量XiShu为误差系数 { uchari; uintz=0,ad[5],min,max; doublex; for(i=0;i<5;i++)//重复发射和接收5次,作为采样,供精准运算使用 { TCCR1A=0x00; TCNT1H=0x00; TCNT1L=0x00;//设置定时计数器T1初始值为0 GICR=0x80; GIFR=0x80;//启用外中断INT1 MCUCR=0x0E;//设置外中断INT1为上升沿中断,INT0为下降沿中断 MCUCSR=0x00; TIMSK=0x04;//设置定时计数器为8分频 SREG.7=1;//开启总中断 PORTD.7=1;//发射超声波 while(! (Out1==1));//判断是否接收到反馈信号,(是,跳出死循环) delay_us(200);//延迟200us发射超声波 PORTD.7=0;//关闭发射超声波 delay_us(200);//延迟200us避免超声波直波干扰 while(! (Out2==1||Out3==1))//判断是否接收到超声波接收信号或者是定时计数器计满,(是,跳出死循环显示) { LED_Show (1); } ad[i]=TCNT1L;//将定时计数器T1的低位数据送入数组ad【5】 ad[i]=ad[i]+TCNT1H*256;//将定时计数器T1的值计算出来并送入ad【5】 Out1=0; Out2=0; Out3=0;//清零所有中断标志位 SREG.7=0;//关闭总中断 LED_Show(10);//延迟显示时间为10*4=40ms,避免超声波回波干扰,超声波走1cm的时间为1/17000=58.852us }//即超声波走130cm的时间为58.852*130=7.647ms,因此我们延迟足够长的时间 min=max=ad[0]; for(i=1;i<5;i++)//计算出测量5次中的最大值和最小值 { if(max if(min>ad[i])min=ad[i]; } for(i=0;i<5;i++)//计算测量5次值的和 { z=z+ad[i]; } x=(z-min-max)/3;//计算舍去最大值和最小值,求平均值 //**************************重点***********************// //中值算法 //采样数据中的5个数据,舍去其中的最大值和最小值之后,求取平均值 //有利于测量的精确性,提高测量精度,减少实属浮动,是我们此次程序算法的一大亮点 x=x*331.4*sqrt(1+T/273)/20000-XiShu; //**************************重点**********************// //时间算法 //超声波的速度等于2倍超声波的路程/时间,即V=2S/T,所以距离=V*T/2 //应用公式假设声速为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 测距