0、引言
磁致伸缩线性位移传感器是一种利用磁致伸缩原理来测量物体超长行程绝对位移的高精度位置传感器,它不但可以测量运动物体的直线位移,还可给
出运动物体的位移速度模拟信号,方便的多种输出方式可满足各种测量、控制和检测的要求。对于用户来说,如何对传感器产生的模拟信号进行数字化以及数据采集处理是值得研究的领域。近年来,磁致伸缩线性位移传感器,无论在精度上和性能上都有了很大提高,根据不同的应用领域,可以借助微机强大的数据处理能力,通过可靠硬件电路和软件设计来达到信号数字化和数据高速准确采集处理的目的。
1、磁致伸缩线性位移传感器工作原理
磁致伸缩线性位移传感器内部结构如上图所示。磁致伸缩线被安装在不锈钢管内,磁环在不锈钢管外侧可自由滑动,电子装置中的脉冲发生器产生电流脉冲(起始脉冲)并沿波导线传播,产生的磁场与活动磁环固有的磁场矢量叠加,形成螺旋磁场,产生瞬时扭力,使波导线扭动并产生张力脉冲(波导脉冲),这个脉冲以固定的速度沿波导传回,在线圈(转换器)两端产生感应脉冲(终止脉冲),通过测量起始脉冲与终止脉冲之间的时间差就可以精确地确定被测位移量,如下图所示。因为张力脉冲在波导管上的速度恒定,用测得的时间差乘以此速度,得出磁环的位置。这个过程是连续不断的,每当磁环运动时,新的位置就会被感测出来。
1.1、位置计算
位置/mm=时差/s×传感器的传送速度/mm·s-1一零点位置/mm
1.2、更新时间及频率响应
传感器的更新时间对伺服控制系统的应用非常重要。由于磁铁距离传感器的电子零件越远,波导脉冲传播所需的时间就越长,所以传感器的更新时间与距离成正比。传感器的最长更新时间可估算如下:
更新时间=(量程十零点位置)/传感器传送速度
等价频率响应=1/更新时间
1.3、性能参数
某进口磁致伸缩线性位移传感器产品性能参数:
最大分辨率:0.002%Fs;迟滞误差:优于0.002%Fs;工作温度:测杆-40℃~+85℃,电子部件-20℃~+80℃;非线性(士%Fs):优于0.05.(300mm以下最大误差150μm);量程范围(mm):0-150~0-5000.
2、数据采集系统的硬件结构
系统下位机选用内藏4k字节,快擦写EEP-ROM的8位单片机AT89C51.该芯片可改写,为系统的设计与开发调试提供了极大的方便。
2.1、信号调节电路
将所设计电路板与传感器装配在一起,这样有利于系统的小型化,但却使系统电路板处于不利的工作环境之中,如工作期间会产生噪声和温度升高等,为了使传感器产生的4~20mA的电流信号转换为满足A/D转换器输入要求的标电信号,电流信号放大电路采用了OP07型运算放大器(放大倍数为2.7.输出电压为0~10V),由于其噪声峰一峰值仅为0.3μV,且具有失调电压低,输入阻抗高,温漂系数小等特点,较好地满足了设计要求。
2.2、A/D转换电路
系统采用美国AD公司的AD574芯片,此芯片是一种高集成度、低价格的逐次比较式12位A/D,转换结果通过三态缓冲器输出,可直接与8位或16位数据总线微处理器接口,芯片内部带基准电源和时钟,转换时间为25μs,采用了单极性输入,输入信号幅度为0~+10V,传感器信号经信号放大电路后加于AD574的13脚。AD574工作一般分两个过程,首先是转换过程,当CE=1,CS=0,R/C=0时,启动AD574开始转换,此时当A₀=0时,就进行12位转换;其次是读取12位并行转换结果,当CE=1,CS=0.R/C=1时,可一次读出转换的12位数据。
2.3、单片机系统
AT89C51是美国ATMEL公司推出一种低功耗、高性能的CMOS控制器,下位机AT89C51的4个I/O口中,Po、P₂口的P₂o~P₃作为12位数据口,P₁、P₃口各引脚用于管理其它各芯片的控制与联络信号线。它与Intel公司的8031完全兼容,而且还拥有4KB的EEPROM和128KB的RAM,在本系统中无须扩展程序存储器和数据存储器就可实现系统功能,简化了电路设计,且使系统的可靠性得到了很大的提高。
2.4、串行通信电路
在以单片机为基础的数据采集和实时控制系统中,通常采用RS-232接口就可完成PC机与AT-89C51单片机之间的通信,但由于RS-232所传送的距离不超过30m,考虑到传感器控制单片机系统需要远离PC操作机,所以,使用专用的接口将RS-232协议转换为RS-422协议进行远距离传送。
3、数据采集系统的软件设计
系统的软件设计主要包括AT89C51单片机的C语言编程和上位机PC机在Windows98下用Vi-sualC++6.0编程两部分,我们将主要讨论Win-dows98环境下的软件设计,在VisualC++6.0提供的文档与视图分离技术和串行通信控件MSComm的基础上,采用切分窗口技术实现数据存放与显示操作的分离,运用多媒体定时器和多线程技术来采集数据,并利用自定义消息和事件来协调程序的同步。
3.1、用多媒体定时器实现高精度实时数据采集
多媒体定时器可以通过函数TimeBeginPeriod()设置最小定时精度,即按所需定时精度要求来设置硬件定时器8253的计数初值,使计数器的精度提高,而且它不依赖于Windows的消息处理机制,而是相当于采用了一个多线程,即由函数Time-SetEvent产生的一个独立线程,在一定的中断周期到达后,直接调用回调函数进行数据处理,而不必等到应用程序的消息为空,保证了定时器的实时响应。我们使用Windows系统向我们提供的两个可实现多媒体定时器的API函数:TimerSetEvent()和TimeKillEvent(),并定义了用于实现定时事件的回调函数:VoidCALLBACKTimeFunc(),可以完成毫秒级精度的计时和控制。
3.2、数据处理算法设计
通过对传感器的原始工作波形的分析,观察到采样时有周期性尖峰脉冲干扰的现象,并且考虑到数据处理时系统滞后时间常数相对较大,而采样周期较短,采用防脉冲干扰平均值法与加权平均滤波法组合的复合滤波程序。首先对采集到的n个数据进行比较,去掉最大值和最小值;然后对剩下的n-2个数据(按原采样顺序)进行加权平均滤波,具体算法是对n-2个采样值分别乘上不同的加权系数之后再求累加和,加权系数取先小后大,以突出后若干采样的效果,加强系统对参数变化的趋势的辨识。各个加权系数均小于1.且相加为1.这样,加权运算之后的累加和就是有效采样值。在具体编程中,为方便计算,取各加权系数均为整数,且和为256.加权后除以256即为所得。本算法中取n=8.6个加权系数按线性递增变化,采用此滤波方法后,效果良好。
3.3、使用多线程技术编程
对于数据采集系统来说,显示处理与采集很可能会在时间上产生冲突,影响程序的正常运行,接受数据也会出错。因此,在程序中使用了多线程技术,并创建了一个专门的辅助线程来实现数据采集,需要采集数据时创建该线程,并在此线程中启动多媒体定时器,在采集结束或退出程序时,删除定时器,退出该辅助线程。此外,由于辅助线程没有自己的消息循环,为了实现辅助线程与主线程之间的通话,我们利用Windows的消息机制,定义了两个自定义消息WM_USER+100(用于数据处理和显示)和WM_USER+101(用于串口通信时发送握手信号)。当采集到数据后通过PostMessage()函数向主线程发消息进行数据处理和显示。在编程过程中,我们的辅助线程必须谨慎地保持与主线程的互操作的同步,我们使用MFC提供的类CEvent(从Csyn-cObject派生),调用Cevent::SetEvent设置适当的事件来同步辅助线程和主线程。主要源程序如下:
void CSensorView::OnInitialUpdate()//初始
化串口
{
CFormView::OnInitialUpdate();
……
m_Comport。SetCommPort(1);//select COM2
m_Comport。SetInputMode(1);// 设置 输入方式为二进制方式
m_Comport。SetSettings(”9600.n,8.1″);//设置波特率等参数
m_Comport。SetRThreshold(1);//当 com 接收 buffer 中有>=1个字符时引发一个关于 接受数据的 Oncomm 事件
……
}
void CSensorView::OnButtontrans()
{
/ / – – – – – – – – – – – – – 为 发送按钮添加鼠标单击消息处理函数
AfxBeginThread(ThreadProc,GetSafe-Hwnd());//启动辅助线程
…
Transmitt();//发送握手信号函数,当下位机收到信号确认后将发送数据,引发Oncomm事件,接收采集数据
}
//在辅助线程中启动多媒体定时器进行数据采集
UINT ThreadProc(LPVOID pParam)
{
::WaitForSingleObject(m_eventTrans,INFI-NITE);
ATimerID=timeSetEvent(20.0.ATimer- Func,(DWORD)this,TIME_ONESHOT);
timeKillEvent(ATimerID);
::PostMessage(hWnd,PR_MESSAGE,0. 0);//执行自定义消息函数 ProcessData()
return 0;//结束辅助线程
}
void CALLBACK ATimerFunc (UINT,UINT,DWORD User,DWORD,DWORD)//定时器回调函数
{
HWND hWnd=((CSensorView’)(User))一 >GetSafeHwnd();
::PostMessage(hWnd,TR_MESSAGE,0. 0);//执行自定义消息函数
}
void CSensorView::ProcessData()//数据处理函数,包括滤波和平滑
{
……
CSensorDoc’pDoc=GetDocument();
……
pDoc->UpdateAllViews(this);
}
//在 Display中动态显示
void Display::OnUpdate(CView’pSender, LPARAM IHint,CObject’pHint)
{
extern CEvent m_eventTrans;
……
CSensorDoc’pDoc=(CSensorDoc’)GetDoc-ument();
CDC’pDC=GetDC();
……
ReleaseDC(pDC);
m_eventTrans。SetEvent();
}
4、试验
根据所介绍的数据采集系统,研制了试验样机,并进行了性能测试。通过示波器观测,得到了磁致伸缩线性位移传感器原始工作波形图,如上图所示。8位7段LED显示器显示最大电压跳变范围约在士10LSB(相当于±12mV)。在性能测试中,分别对静态和动态的传感器信号进行了数据采集与处理。静态试验中图形显示为一条直线,8位7段LED显示器显示数字码跳变稳定在士LSB,数字处理效果良好,完全满足精度要求;动态试验中,通过以不同的速度滑动传感器磁环获得不同规律的信号,得到不同的动态工作曲线,如下图所示为其中一条曲线,经过反复测试,实时动态响应速度满足10Hz频率磁致伸缩线性位移传感器的响应速度。
5、结束语
磁致伸缩线性位移传感器数据采集系统经数字滤波,接收的数据跳变在士LSB范围之内,满足精度要求;实时动态响应速度满足磁致伸缩线性位移传感器响应速度。试验样机工作性能良好,且此系统对其它传感器信号的数据采集也具有极好的参考价值。