汽车安全性设计说明.docx
《汽车安全性设计说明.docx》由会员分享,可在线阅读,更多相关《汽车安全性设计说明.docx(61页珍藏版)》请在冰豆网上搜索。
汽车安全性设计说明
1引言
汽车的安全性一直都是消费者所关注的,其实在发生交通事故时,对人们安全起最主要保障作用的却是我们最常见的安全装置——安全带。
经过40多年的发展,安全带逐渐走向成熟,现在欧美的安全带均由强度极大的合成纤维制成,带有自锁功能的卷收器,采用对驾、乘人员的肩部和腰部同时实现约束的三点式设计。
系上安全带后,卷收器自动将其拉紧,当车辆万一出现紧急制动、正面碰撞或发生翻滚时,乘员会使安全带受到快速而猛烈的拉伸,此刻卷收器的自锁功能可在瞬间卡住安全带,使乘员紧贴座椅,避免摔出车外或碰撞受伤。
但是当高速前进的汽车突然停车时,要将车中人前冲的身体维持在座位上,必须有很大的力量,因此安全带一定要强力,必须满足一定的质量标准才能投入使用。
根据有关机构统计,在所有可能致命的车祸中,如果正确使用性能良好的安全带,可以挽救约45%的生命。
所有这些都说明,随着汽车工业的飞速发展和汽车的普及,为了减少交通事故的发生,保护人身的安全,汽车安全带的实际应用确实非常必要,而保证安全带的良好性能则是更实质的部分。
而我国目前还没有能检测安全带质量性能的装置和系统,目前大学从国外引进一台设备,正投入研究。
本系统就是针对这些而开发的,成功后能起到实际作用,对社会具有一定的推广意义。
2.系统设计
本系统设计容既涉及到微机并行接口的开发知识,又有DEPHI软件编程。
主要是软件的开发与应用研究。
安全带的性能有两项技术指标:
(1)在加速度达到最大时,位移必须在5cm之。
(2)刹车期间平均加速度变化率
20。
系统中的性能测试都是围绕这两项指标的。
2.1硬件设计
根据预定要求,先将两路模拟信号或脉冲信号经过多路开关MUX选择,然后经过放大器将信号放大到0~10V,再送到A/D板;A/D板将这些模拟信号或脉冲信号转换成12位数字量,送到ISA总线,然后进行校正,转换成参数数值。
其中为实现高速采集,使用了8255A作ADC的接口进行查询式采集。
经测试,采集一个数据大约要50us左右。
采集板的布局如下所示:
图1.采集板卡
2.1.1主要芯片介绍
(1).AD574
AD574是具有三态输出锁存器的逐次逼近型A/D转换芯片,可以作12位转换,也可作8位转换。
转换速度较快,为25us,部含有与微型计算机连接的逻辑控制电路,使用起来非常方便。
若转换成12位二进制数,可以一次读出,也可分成两次输出,即先读出高8位后读出低4位。
本系统采用12位转换。
AD574外部设置5跟控制线(CE、
、R/
、12/
、
)和一根状态线(STS)。
5个控制信号的功能定义如下:
CE:
片允许信号,高电平允许工作。
简单应用中可固定接高电平。
:
片选中,低电平有效。
R/
:
双功能引脚,作为读数据或启动转换的控制信号。
R/C=1,
用于读数据;R/C=0,用于启动转换。
12/
:
数字量输出位数控制,12/
=1,1次输出12位数据;12/
=0,1次输出8位数据。
:
双功能引脚,用于分辨率和字节选择。
在转换启动时,若
=0,则AD574作12位转换器用;若
=1,作8位转换器用。
在读数据时,若
=0,则读高字节;若
=1,则读低字节。
以上信号线中,
、CE、和R/
三个信号组合起来实现启动转换和读数据。
当
=0、CE=1和R/
=0时,启动A/D进行转换;当
=0、CE=1和R/
=1时,读取数据。
这5个控制信号的电平状态与AD574所产生的操作对应关系如表1所示:
CE
R/
12/
AD574A的功能操作
0
X
X
X
X
不允许转换
X
1
X
X
X
未接同芯片
1
0
0
X
0
启动一次12位转换
1
0
0
X
1
启动一次8位转换
1
0
1
高电平(+5V)
X
一次输出12位
1
0
1
低电平(数字地)
0
输出高位字节
1
0
1
低电平(数字地)
1
输出低位字节
表1:
AD574的控制信号的作用
STS:
状态线,表示转换器状态,在转换期间,STS为高;当转换结束时,STS变低。
可用此信号来查询转换是否结束。
(2).8255A可编程并行接口
8255A是一个具有两个8位(A口和B口)和两个4位(C口高/低4位)并行I/O端口接口芯片,能适应CPU与I/O接口之间的多种数据传送方式的要求。
如无条件传送、应答(查询)传送和中断方式传送,与此相应,8255A设置了0方式、1方式以及2方式(双向传送)。
8255A可执行功能很强,容丰富的两条命令(方式字和控制字)为用户如何根据外界条件(I/O设备需要哪些信号线以及它能提供哪些状态线)来使用8255A构成多种接口电路,组建微机应用系统提供了灵活方便的编程环境。
8255A在执行命令过程中和执行命令完毕之后,它所产生的状态保留在状态字中,以供查询。
本系统用的是8255的0方式。
0方式是一种基本输入/输出工作方式。
通常不用联络信号,或不使用固定的联络信号,因此,所谓基本I/O方式是指查询方式传送,也包括无条件传送。
在0方式下不设置专用联络信号线,需要联络时,可由用户任意指定C口中的哪根线完成某种联络功能,本系统是指定的PC7口作为联络信号的。
由于无固定的专用联络信号,因此也就在端口与I/O设备之间无固定的时序关系,由用户根据数据传送的要求决定输入/输出的操作过程。
2.1.2硬件结构简单框图
CD4067是一个16路的多路转换开关。
由于AD574是单通道模拟量输入,每次只能转换一路数据信号,因此要通过CD4067进行通道选择。
这个系统用到了CD4067的两个通道。
通道0接位移信号,通道1接加速度信号。
CPU发出选通道信号命令,驱动器传送到74LS138译码器,输出地址锁存器,打开通道开关,准备接受模拟信号。
接口处信号经信号放大器放大到0~10v,输入到AD574模数转换器,将模拟信号转换成数字信号,通过ISA总线输入电脑。
I
S
A
总线
AD574
(12位)
STS
CD4067
MUX
8255A
放大器
IN0>
IN1
ABCDpc7
图2.采集电路简图
采用8255A作ADC的接口,这种接口电路设计方便,尤其在与CPU连接时的信号线及其时序配合中不需作什么工作。
加上是可编程,使用灵活。
本系统中用的是8255A的PC7口作联络信号,接AD574的STS状态线,通过简单编程就可方便查询数据是否转换完毕,然后再将查询结果传送到CPU,以便做下一步的处理。
2.2软件设计
系统启动时,先要进行设备自检,看两路通道是否都能正常采集。
采集底值是在没加任何信号时采集的一个基准值,以后采集的数据都要减去这个基准值。
采集完后,将数据存入文件。
可以直接查看测试结果,该部分给出了所需要的主要参数值。
也可以进行曲线绘制查看采集时段数据的详细分布情况,此部分能绘制三个量程的参数—时间图,曲线分六屏显示,默认采集4000次。
用户也可自己输入采集次数。
可用光标任选曲线段进行评估。
之后,能连接打印机将图形打印出来。
软件部分的主要模块结构如下图所示:
设备自检
数据采集
查看测试结果
绘制曲线
打印
图3.软件部分总体结构图
2.2.1所用编程语言简介
本系统是在Delphi5.0环境下开发的。
Delphi是由Inprise公司(前Borland公司)推出的可视化编程环境,它提供了一种方便、快捷的Windows应用程序开发工具。
Delphi使用了MicrosoftWindows图形用户界面的许多先进特性和设计思想,采用了可重复利用的完整的面向对象程序语言(Object-OrientedLanguage)。
Delphi使用“可视化”的编程方法。
程序员不必自己建立对象,利用Delphi所提供的可视“控件”,只要在提供的程序框架中加入完成功能的代码,如选择命令、移动鼠标等,而不必考虑按精确次序执行的每个步骤。
在这种机制下,不必编写一个大型的程序,而是建立一个由若干微小程序组成的应用程序,这些微小程序可由用户启动的事件来激发。
这样就可以快速创建强大的应用程序而勿需涉及不必要的细节。
另外,在Delphi中能方便的嵌套使用汇编语言。
本系统中与硬件接口的地方全部是用汇编编写的。
这样既方便对底层硬件的访问,又能提高代码的执行效率。
所以Delphi环境非常有利于软硬件的结合。
2.2.2设备自检模块设计
设备自检原理就是从所选通道读出的电压值必须要与所加的电压值相当,所以核心就是从端口读出多组数据值并显示出来。
各端口地址分别为:
选通道----228H;启动转换----221H;读高8位数据----221H;读低8位数据----220H。
此单元定义了一个计时器(Timer)控件Timer1,Timer控件可以在应用中以重复的时间间隔产生一个事件,由于属于非可视化控件,在运行时不可见,常用来做一些后台处理。
该控件只有一个事件OnTimer,将需要循环执行的程序段放在这个事件里,计时器的Interval属性指定了两个Timer事件之间的毫秒数。
缺省值为1000(1秒),计时器将每秒(近似等间隔)激发一次Timer事件。
本模块将核心部分(读通道电压值)放在Timer1的OnTimer事件里,输出多组值到列表框Listbox1。
这是通过语句listbox1.Items.add(s)来实现的,这里调用了Tstrings类的相应方法来处理Items中的数据。
事件由Timer控件的enabled属性来启动,该属性为True时,定时器开始工作,为False时暂停。
开始时令其为false,当选定通道后开始工作。
由于只有两路通道,在单元中添加了两个单选按扭RadioButton,按扭组放在一个GroupBox控件里。
另外还定义一个字节型变量tdhao,用来保存所选通道序号0或1,0通道是用来采集位移信号的,1通道采集加速度信号。
由以下语句来给tdhao赋值:
ifradiobutton1.checked=truethentdhao:
=0
elseifradiobutton2.checked=truethentdhao:
=1;
OnTimer事件的程序流程图如下页图所示:
选通道
启动转换
延时
读高8位
读低4位
数据处理并显示
判断tdhao的值
Timer1.enabled=true
为0或1否则
图4.设备自检流程图
Ontimer事件每次开始时都会检测是否tdhao为0或1,只有满足时,才会继续往下执行。
当然最初会给tdhao赋个初值。
后面汇编语句的选通道部分直接将tdhao变量值读入端口。
汇编采集部分的核心程序如下:
movdx,228h//选通道
moval,tdhao
outdx,al
movdx,221h//启动转换
outdx,al
movbx,20h//延时,等待转换结束
b:
movcx,0e000h
c:
loopc
decbx
jnzb
movdx,221h//读高8位
inal,dx
movx1,al
movdx,220h//读低4位
inal,dx
movx2,al
其中x1和x2是定义的全局整型变量,存储读取的高低位二进制值,以作进一步转换。
这里的数据要进行处理主要是由于AD574的12条输出数据线的高8位接到系统总线的D0----D7,而把低4位接到数据总线的高4位,低4位补0,以实现左对齐。
所以读出数据后高8位应该乘以16,而低4位则要除以16,再相加即可。
这一点由语句x2:
=(x2div16)+x1*16;来实现。
此外,还必须转换为电压值。
AD574的精度为12位,最高量程为10V。
所以应该由公式x2*10/4096来转换。
但是由于汇编语句的需要,x1和x2都设置成为整型变量,为保证精度,可以先乘以一个放大几倍的数,得出结果后再相除和取余。
这样得到的商就是结果的整数部分,而余数则是小数部分,在输出时再一起输出,见如下语句所示:
x1:
=(x2*10000)div(4095);
x3:
=x1mod1000;
x1:
=x1div1000;
s1:
=inttoStr(x1)+'.'+inttoStr(x3)+'V';
listbox1.Items.add(s1);
其中s1为字符型变量,这是listbox输出的格式需要。
S1也将数据的整数和小数部分连接了起来,起到中介的作用。
随着OnTimer事件的反复执行,数据会逐渐增多,listbox会自动加上滚动条,但是交换通道检查时,还是必须清空listbox1。
基于对程序控制的方便,添加了“暂停”、“继续”、“清空”、“返回”四个按扭。
按暂停按扭,执行Timer1.enabled:
=false;定时器停止工作;按继续,使Timer1.enable=true,定时器重新开始工作;清空按扭可以清空listbox1的容,并将光标移到首行,由以下两条语句来实现:
listbox1.clear;listbox1.tag:
=0;clear是系统定义的方法。
Tag为listbox的属性,指行标。
点返回按扭退回到主界面。
清空和继续按扭在程序开始时是无效的,在formcreate事件中设置其enabled属性为false即可。
只有在listbox1中有数据后,清空按扭才生效;同样,只有在按下暂停按扭后继续按扭才生效。
这都是通过在相应事件中设置enabled属性为true来实现的。
2.2.3采集模块设计
在信号输入之前首先要采集底值。
为保证一定的精度,每路通道的底值都是采两次之后取的平均值。
然后可以输入信号,进行实时测试。
之后的汇编采集部分方法与采集底值是相同的,但是必须根据一定的加速度灵敏度、位移传感器电阻值、位移传感器长度来对数据进行处理,得出所需要的实际参数值。
这在后面会有详细说明。
此单元的采集用的是查询式采集,这是为了满足高速采集的需要。
下面根据采集部分的流程图分别作出说明:
(图见下页)
8255A的初始化是由以下三条语句来完成的:
movdx,22fh//8255A命令口地址
moval,10011011b//初始化命令
outdx,al//送到命令口
方式字10011011是指将8255三个并行端口中的A口和B口都指定为0方式,输入;C口的上半部和下半部也都为输入。
选通道部分端口地址为228H,由于只有两路通道,将依次进行采集,没有使用循环。
然后往221H端口写入任意数据就能启动转换了。
先看核心采集程序的流程图:
读STS
8255初始化
选通道
启动转换
STS=0?
读高8位
读低4位
数据处理
否否
是
图5.采集程序流程图
接下来开始检查是否转换完毕。
系统将循环检测STS信号,直到其为0为止。
这里以8255的PC7口作为状态信号,即将STS状态线连到8255A的PC7口,系统直接查询PC7口即可。
见下面程序段:
movdx,22eh//查STS端口
q1:
inal,dx
andal,80h//PC7作控制信号
jnzq1
转换完毕后就能读取数据了,还是先读高8位,后读低4位。
读出后高8位乘16,低8位除16。
这部分的相关程序可以参考设备自检部分或附录源程序代码。
采集底值时将这部分程序依次执行了四遍,每个通道采了两个值取的平均。
测试部分则循环采集k次,k是由用户输入的,如果用户没有输入,将默认采4000组数据。
程序中定义了两个公用数组gh[]和lh[]分别用来存放采集的加速度和位移值。
下面的程序段将采集的数值转换为加速度和位移值。
gh[j]:
=10000*gh[j]div4095;//0.001g,14mv/g
gh[j]:
=gh[j]divjia;//jia为所输入的加速度灵敏度,单位v/g
先将采来的数据转换为电压值,再除以加速度灵敏度,转换为加速度的单位。
由于gh[j]是以mg为单位存储的,所以10v电压以10000mv计算。
另外这也满足了整型数据的除法精度,排除了除0的可能性。
//(位移转换)
if(cj1<>1000)or(cj2<>1000)then//若无输入,则采用默认数据
begin
R:
=5000;//位移传感器电阻值5000欧姆
S:
=100;//位移传感器长度100mm
end;
N1:
=R*2048div5000;//N1:
位移传感器最大阻值对应二进制数
forj:
=1toido
begin
SX:
=S*LH[j]DIVN1;//sx:
实测长度
LH[j]:
=SX;//单位为毫米
end;
位移转换的算法思路见上面的注释。
其中N1之所以这样因为用1mA的电流输入5K电阻,只能产生5V电压,只能达到A/D芯片满量程的一半,所以对应二进制数也只有4096的一半,即2048。
若用户无输入,系统默认的参数值为:
jia=2v/g,R=5000,S=100mm,在formcreate事件中赋值。
这些值与电压的对应关系为:
加速度1v—0.5g位移1v--2cm。
判断用户是否输入,可在相应的editchange事件里设置变量值来检测。
此部分见附录程序清单。
可以将所采数据作为文本存盘。
见下面程序段:
p:
=formatdatetime('yyyy/mm/dd/hh/nn',now)+'.txt';
Assignfile(tex,p);
REWRITE(TEx);
forj:
=1toido
begin
WRITE(tex,lh[j]:
6);//以每个字6个字节的格式存盘
WRITE(tex,gh[j]:
6);
end;
CLOSEFILE(TEx);
其中tex是一个文件类型的变量,通过调用Assignfile过程可以初始化这一文件变量,即建立文件变量(F)与外部文件之间的联系。
P为自定义的外部文件名,中间调用了读取系统时间的函数,有利于识别测试时间。
之后的Rewrite函数是以写方式打开文件的方法,通过调用这个函数可以创建并打开一个新文件。
在下面的for循环中,调用Write过程向文件中写入数据,数据存放在数组lh[j]和gh[j]中,以每个字6个字节的格式存储。
写完之后,调用CloseFile过程中断文件变量tex和p所指外部磁盘文件之间的联系。
这个过程将释放文件变量,并关闭该外部文件。
另外,除了处理本次实验采集数据外,本系统还必须能对以往数据进行分析,所以将“读数据文件”也放在这个单元里,可以直接将数据从已有文件读入数组gh[]和lh[]中,进行下一步分析处理。
这里用到了公用对话框控件中的opendialog控件,此控件用于打开一个已经存在的文件,用户选择某一文件,其所在的驱动器、文件夹、文件名以及文件扩展名将被赋予opendialog的filename属性。
在程序运行中使用execute命令来显示打开对话框,当用户选择一个文件并单击打开时,返回true;如果用户选择cancel,则返回false。
参考下面的程序注释:
ifDialogopen.Executethen
begin
assignfile(tex,Dialogopen.filename);
Reset(tex);//以读方式打开文件
forj:
=1to3990do
begin//从数据文件读出的数据值赋给数组
read(tex,x1);
read(tex,y1);
lh[j]:
=x1;
gh[j]:
=y1;
end;
CLOSEFILE(TEx);
edit15.text:
='已读文件';
for循环中调用Read过程读取数据,通过中间变量x1和y1赋给数组元素。
值得注意的是,由于干扰信号的存在,用这样的数据绘成曲线会出现很多毛刺,所以必须先进行滤波处理。
这里进行了两次滤波:
第一次是让本次值的80%与上次值的20%相加作加权平均。
从第3个值开始,如下所示:
p1:
=(gh[1]+gh[2])div2;
forj:
=3to3990do
begin
gh[j]:
=(gh[j]*80+p1*20)div100;
p1:
=gh[j];
end;
第二次在此基础上每三个值求一次平均,再将这个平均值赋给这相邻的三个值。
如下程序:
forj:
=1to3990do
begin//每三个数求一次平均值
p1:
=jmod3;
ifp1=1then
begin
p1:
=(gh[j]+gh[j+1]+gh[j+2])div3;
gh[j]:
=p1;
gh[j+1]:
=p1;
gh[j+2]:
=p1;
end;
end;
2.2.4绘制曲线模块设计
在Delphi中绘图时,是将图形画在窗体、Image控件、画框(Paintbox)中的画布Canvas上。
画布也有自己的属性,它本身也是一个对象(控件),但一般不能单独使用。
本单元中使用的是窗体form7的Canvas,用的最多的是它的画笔(Pen)属性。
系统能实现0.45g、0.8g、2g三个量程的绘图,这是为了满足用户精度和量程大小的需要。
此单元根据公有变量fennei的值来识别是哪个量程的绘图,其中整型变量fennei的值是在单元2中选择量程时定下的。
对应0.45g、0.8g、2g三个量程,fennei的值分别取为4,2,1。
这样取值是为了分量程绘图时比例转换的方便,在下面会有说明,这部分有四个主要事件。
(一)画网格、填纵轴坐标
在网格上显示曲线更有利于观察,另外纵轴坐标会随量程而不同,需要专门填写。
画曲线时所用的坐标是根据窗体左上角为(0,0)推得的。
画网格时画笔的颜色设置为蓝色,语句canvas.pen.color:
=clblue;可以实现。
另外网格横线和竖线的间距均为50。
画横线时左边坐标取50,右边取到750。
moveto(50,j);lineto(750,j);就可以画一条从(50,j)到(750,j)的横线。
j为纵坐标值,初值为50,每画完一条线增加50,一直到j=540。
这样能画完g-t曲线和s-t曲线的网格横线。
两种曲线网格横线间隔40,所以要分两个循环来完成。
画竖线时,由于两种曲线的网格竖线是分开的,一条线必须分两次画。
每条线先从(I,50)画到(I,250),再从(I,290)画到(I,540)。
这里I是指变动的横坐标,初值为50,也是每次增加50,一直到I=750。
可以用一个循环完成。
下面开始填写s-t曲线的纵坐标,由于各个量程的位移刻度值相同,所以直接推出相应的坐标填写刻度即可。
见下面程序段:
canvas.textout(30,275,'单位:
cm');//s-t曲线的纵坐标刻度canvas.textout(30,290,'10');
canvas.textout(30,330,'8');
canvas.textout(30,380,'6');
canvas.textout(30,430,'4');canvas.textout(30,480,'2');
canvas.textout(30,530,'0');
但是要填写g-t曲线的纵坐标还要先根据分类号fennei来判断是哪个量程的绘图。
如