汽车记录仪数据采集系统的设计
扫描二维码
随时随地手机看文章
随着汽车产业的迅猛发展,汽车记录仪的需求也成倍增长。汽车记录仪又称为“汽车黑匣子”,能完整、准确地记录汽车行驶状态下的各种信息[1],能将汽车的行驶轨迹、制动性能、开关量信号完整记录,并能根据需要随时调出数据进行分析或者通过专用软件在电脑上再现。它被认为是确保汽车安全的有效手段,可以迅速获取有关行车数据,改善营运状况,成为车辆交通管理必不可少的设备。数据采集系统作为汽车记录仪的重要组成部分直接关系到记录仪的各项性能,对记录仪整体的功能影响甚大。
1 硬件电路结构
1.1 实时时钟模块
由于系统产生的各种数据和记录都与时间密切相关,对时钟的实时性要求很高,同时记录仪本身存在着断电的危险,为了准确记录车辆行驶状态,并对异常情况进行记录,因此选择实时时钟芯片来提供日期和时间。实时时钟芯片是一种不仅能支持每天时间更新,而且能够进行日期更新的永久时钟电路[2]。本文采用DALLAS公司的DS1302芯片,它性能高、功耗低,时钟校准也较为容易,通过3V锂电池和车内蓄电池两种方式供电,可以保证在蓄电池出现故障的情况下,该时钟芯片仍然能够正常工作,从而使记录仪的数据同样准确、可靠。其内部自带31B的静态RAM,存储容量满足应用的需要。数据在CLK的上升沿串行输入,在进行单字节或多字节传送时,开始的第一个字节为命令字节,用于指定31个字节中哪个将被访问。当进行任何数据传送时,其最高有效位MSB(位7)必须为逻辑1,如果为零,则禁止写DS1302。其时钟电路如图1所示,Vcc1与3V锂电池相连,Vcc2与蓄电池相连,5、6、7引脚分别接S3C2410的时钟端、数据端和复位端,通过主控制器S3C2410对时钟模块进行统一管理。
1.2 车速采集模块
记录仪从车辆启动开始就不停地对车辆的速度进行实时检测,并实时保存。速度是一个模拟变量,是时刻变化的。车速信号通过传感器以脉冲形式输入,为了防止周围环境及本身的干扰,采用单光耦芯片TLP521,切断输入和输出通道间直接的电信号联系,主要就是通过电-光-电的变换将电信号隔离开来。通过屏蔽和光耦隔离,得到波形干净的信号。为了得到良好的矩形波,使车速测量达到一定的精度,本系统采用施密特触发器LM311来完成波形的整形,信号采集功能完成后,采集到的信号需要送到可编程逻辑器件中进一步处理,然后再传送给主芯片S3C2410,尽量将所有的干扰信号在进入主控制器之前降到最低。在实际控制过程中各种干扰信号是不可避免的,为了尽可能地消除或减少干扰信号对系统的控制作用,除了在系统硬件及环境方面采取措施以外,在控制算法上也采取了一定的措施来抑制干扰信号的影响,在程序中采用连续多次采样求平均值的办法予以滤波[3]。车速脉冲采集模块硬件电路如图2所示。
1.3 开关量采集模块
开关量信号包括方向灯、倒灯、车门、远光灯、近光灯、刹车、鸣号、车辆启动等这类行驶过程中很重要的数字开关量,将它们采集并保存下来对事后分析有很大帮助[4]。可以通过ARM芯片的I/O端口对这些信号进行输入。但这些信号是高压信号,直接接到ARM板上可能会损坏CPU,这里采用光耦芯片TLP521对它们进行隔离,避免CPU受损。在S3C2410中,可以通过GPnCON(n是I/O口的组号)寄存器对GPIO引脚的使用功能进行设置。系统每隔0.2s对开关量信号采集一次,采集来的开关量可以从GPnDAT寄存器中读取。芯片的接口方式为4脚SPI,能够大大减少处理器需要提供的引脚数量[5]。当任一开关量输入信号状态发生变化时,通过中断的方式通知主处理器,从而减轻了处理器频繁查询的负担。图3是一路开关信号采集电路,其他开关量电路与此相同。
2 软件的设计
记录仪数据采集系统软件要求上电复位后,首先进行自检;然后显示初始界面(包括当前时间、行驶速度等);最后根据速度传感器传过来的脉冲个数以及持续时间判断汽车是否启动,若未启动则返回,若已启动则进入各数据量的检测。记录仪软件设计包括显示、速度采集、实时时钟、开关量采集、数据传送等, 采集系统软件流程图如图4所示。
汽车记录仪的初始化函数主要工作是为设备分配设备编号,设备的存取是通过一组固定的入口点来进行的,这套接口函数是由file_operations结构定义的,汽车记录仪主要包括以下成员:
Static int _ _init s3c2410_ts_init (void)
{ … …
ret = register_chrdev(0,DEVICE_NAME, &s3c2410_fops);};
static struct file_operations s3c2410_fops = {
owner: THIS_MODULE,
/*指向拥有该结构的模块的指针*/
open: s3c2410_ts_open, /*打开设备*/
read: s3c2410_ts_read, /*用来从设备中读取数据*/
release: s3c2410_ts_release,
/*file结构被释放时,将调用这个操作*/
poll: s3c2410_ts_poll,
/*用来查询读取或者写入是否会被阻塞*/
};最后都需要一个清除函数,该函数在模块被移除前注销接口,并向系统中返回所有资源
Static void _ _exit s3c2410_ts_exit (void)
{ ……
unregister_chrdev(tsMajor, DEVICE_NAME);
…… };
设测速函数为void mk_int()(void)interrupt()。测量汽车的行驶速度,实际上就是测量汽车速度传感器产生的矩形脉冲宽度。测得该脉冲的宽度后,然后根据公式(1)得出汽车的行驶速度。
K=(convert/(number*wave_width*co))*(real_speed/display_speed) (1)
其中,number表示速度传感器转一圈产生的脉冲数,wave_width表示每个脉冲低电平的宽度,co代表车辆每行驶1km速度传感器的转数,real_speed是车辆的标称速度,用于纠正系统误差,display-speed是车辆的实测速度,用于纠正系统误差,convert是车速的转换系数,该系数与系统的晶体振荡频率有关。其他部分相关程序如下:
(1)extern void flash_clear( ) extern void s3c2410_4k_clear( )清空S3C2410内存中和实时时钟芯片中的所有内容,这些只是在出厂初始化时使用[6]。
(2)extem void accident_time_record( )记录每次PC机上载和下传操作的时间。
(3)void accident_deal(void)非法关机处理程序[7]。记录仪在运行的过程当中,很有可能出现人为的或非人为的断电现象,在这种情况下,为了保证非法关机不丢失数据,在整个程序运行期间,描述汽车运行状态的一些重要的数据都保存在S3C2410中,当记录仪一上电时,就可以根据这些数据恢复到上次非法关机时刻的状态[8]。
系统通过LCD进行人机交换,其显示的基本函数如下:(1)void init_lcd( )LCD初始化程序; (2)void write_cmd(unsigned char cmd) 写指令到指令寄存器,用来控制显式模式,设置显示寄存器的地址;(3)void write_hc(unsigned int word)写8位数据到显示寄存器,即显示16×8点阵的半宽ASCII码字符;(4)void write_word(unsigned int word) 写16位数据到显示寄存器;(5)void clear_lcd( )清除LCD显示屏,并将光标移到起始位置。系统的整体软件结构如图5所示。
汽车记录仪是汽车电子化、智能化的一个重要应用。本文通过对汽车记录仪数据采集系统的研究,从硬件电路设计和软件分析两方面对实时时钟信号、车速采集信号、开关量信号分别进行了讨论,将此数据采集系统应用于汽车记录仪中,具有抗干扰能力强、精度高、实用性好等优点。
系统涉及的三个模块可以分别单独修改制做。主板的布线简单,成本较低。如果以后修改ARM电路板导致主板也需要修改的话可以降低整个系统的修改/升级成本。
系统包含一个掉电预备电源,当出现外部干扰导致记录仪意外掉电时,该电源能够迅速触发中断,从而保证实时数据不丢失。
系统主机模块采用高效的32位ARM嵌入式处理器为核心,能够有效地提高系统实时性。优化编写的代码对多任务进行了统筹兼顾地合理调度,有效地保证了实时性。此外,处理器丰富的内外部中断源的使用为复杂程序的灵活转换提供了方便,减轻了处理器负担。