微机械惯性器件是集微型精密机械、微电子学、半导体集成电路等新技术于一身的世界前沿新技术。随着微电子技术的发展,目前微机械惯性器件凭借其价格低、可靠性高、尺寸小、重量轻等特点引起了国内惯性技术及微电子技术领域的广泛关注。以陀螺仪和加速度计为核心部件的惯性导航系统已成为现代飞机、大型舰只和潜艇的一种重要导航设备,在其他一些民用领域中也有着十分广泛和重要的应用。以惯性系统为基础发展起来的惯性测量和惯性定位系统,可以用于大地测量、地图绘制、海洋调查、地球物理勘探、管道铺设选线、石油钻井定位和机器人等需要大范围测量及精确定位的场合[1]。
本文在嵌入式Linux环境下使用ARM9开发板实现了对IMU输出数据的采集和动态显示,为进一步的工程应用打下基础。
1 微惯性测量单元IMU
微惯性测量单元由6个传感器组成,包括3个微机械陀螺仪和3个微机械加速度计,配置在立方体的3个正交平面上。其基本原理为古典的牛顿力学原理,由三根轴的陀螺确定载体的姿态,安装在三根轴上的加速度计测出载体的加速度值,积分得到速度,再积分得到位移[1,2]。
本文所采用的惯性测量单元为XW-IMU5200。它以DSP为核心处理器,采用16 bit高精度多通道并行A/D转换。其A/D转换器的采样率至少是惯性传感器带宽的4倍,能够保持惯性传感器的固有频率。6路并行采集通道可实时接收加速度计和陀螺仪以及温度传感器的信号,保证了数据采集的一致性。图1所示为本文所采用的XW-IMU5200的外观。
XW-IMU5200内部有一个0.8 μs的计时器。计时器计数从0~216,然后开始新的周期(高位溢出后继续)。每个数据周期中,在读取内部计时器之前和之后,分别对两组惯性测量数据进行采样,然后将得到的数据做数字滤波并封装;惯性测量数据、计时器数据、温度数据通过XW-IMU5200的RS232口送出。
如图2所示,Ti是周期的起点。从Ti到Ti1为0.1 ms,实现第一组数据的采样;从Ti1到Ti2为1 ms,读取内部计时器;从Ti2到Ti3为0.1 ms ,实现第二组数据的采样;从Ti3到Ti4进行滤波并封装数据,对IMU为1.8 ms, 对IMU而言,最大数据输出速率约为100 Hz,波特率为115 200 b/s。
XW-IMU5200的测量数据包为19 bit,其定义如表1所示,数据为Little Endian格式,即低位(LSB)字节在先。
2 Arm-linux环境下的MEMS IMU数据采集实现
2.1 交叉编译环境的建立
本设计所采用的ARM9开发板为S3C2440处理器,内嵌Linux系统。
因嵌入式开发一般需要在PC机上进行,需要在宿主机建立交叉编译环境,以下给出建立交叉编译环境的步骤:
(1)安装linux环境;
(2)下载交叉编译文件包 cross-2.95.3.tar.bz2;
(3)建立交叉编译环境目录 /usr/local/arm/;
(4)复制安装包到目录下,在此目录下解包文件,命令为:tar jxvf cross-2.95.3.tar.bz2;
(5)配置环境变量,修改bashrc文件,在文件最后一行添加环境变量,代码为export。
PATH=/usr/local/arm/2.95.3/bin: $PATH,保存退出后重启Linux。
至此,交叉编译环境建立完成。
2.2 串口通信的实现
本设计所采用的微惯性单元数据通过RS232串口输出,同时所使用的ARM开发板上也附有串口,因此完成数据采集必须通过串口通信。
串口通信是仪器仪表设备通用的通信方式,它用于ASCII码的字符传输,主要由地线、发送和接收数据线3根数据线完成,其他线用于握手。
串口通信的最重要的参数配置是:波特率、数据位和奇偶校验位,在进行串口通信时,必须正确设置参数。Linux中所有的设备一般位于/dev下,串口1和2的名称分别为/dev/ttyS0和/dev/ttyS1.通过对struct termios结构体的各成员值的设置来进行串口设置,如下:
#include<termios.h>
Struct termio
{
unsigned short c_iflag; /*输出控制模式标志*/
unsigned short c_oflag; /*输出模式标志*/
unsigned short c_cflag; /*控制模式标志*/
unsigned short c_lflag; /*本地模式标志*/
unsigned char c_line; /*行标志*/
unsigned char c_cc[NCC; /*控制字符*/
};
其中,c_cflag包含对数据传输率、字符大小、数据位、停止位、奇偶校验位和硬件流控的设置。
串口配置主函数如下:
int main(void)
{
int fd;
int nread,i;
char buff[512]="0";
if((fd=open_port(fd,1))<0)
{
perror("open_port error");
return;
}
if((i=set_opt(fd,38400,8,'N',1))<0)
{
perror("set_opt error");
return;
}
printf("fd=%dn",fd);
while(1)
{
while((nread = read(fd,buff,sizeof(buff)))>0)
{
if(buff[i]==0xaa&&buff[i+1]==0x18);
printf("header foundn ");
}
}
close(fd);
return;
}
串口波特率为9 600 b/s,数据位为8 bit,无奇偶校验位,1 bit停止位。对于串口的操作同读写文件,使用read、write函数。如上串口调通后,根据产品的解码进行数据的解算,其算法可表示为:
IMU_meas.gyro[i]=IMU_data.gyro[i]*G_S/SCALAR;
//陀螺仪输出数据解算,i取值1、2、3分别代表正交方向三路陀螺仪
IMU_meas.acc[i]=IMU_data.acc[i]*A_S/SCALAR; //加速度计输出数据解算,i取值1、2、3,分别代表三路加速度计
本文忽略温度信息只考虑6路传感器信息,其中G_S为陀螺仪的角度范围,A_S为加速度计测量范围,scalar为常值215。
2.3 数字低通滤波
低通滤波属于经典滤波的范畴,它通过一定的运算关系改变输入信号频率成分的相对比例或滤除某些频率成分,对MEMS IMU进行滤波的目的就是尽量滤除信号中的各种噪声成分,因为MEMS IMU输出信号的有用成分基本位于低频段,加之实时性能的要求,这里只选择相比FIR滤波器阶次低得多的IIR滤波器3]。
随机采集一组数据进行滤波说明,如图3为转台静止状态下y轴MEMS陀螺仪输出的5 000点数据,采样频率为100 Hz。