基于ARM的微伏信号在线监测系统设计
本设计中数据采集和显示电路的核心器件采用32位ARM7内核嵌入式处理器S3C44B0X。S3C44B0X内置部件有8通道10位ADC(模数转换器)、8KB cache(高速缓存器)、内置SDRAM(同步动态存储器)、LCD控制器、2通道UART(通用异步收发器)、4通道DMA(直接存储器存取)、71个通用I/O端口等。
本设计中使用S3C44B0X完成A/D数据采集、LCD控制液晶显示器、键盘输入和故障报警四个主要功能。经前置放大电路处理完成之后的0~2.5V电压电极性信号,由S3C44B0X的10位精度片上A/D采集到CPU中。S3C44B0自带LCD控制器,利用DMA控制器从系统RAM中的显示缓冲区读取显示数据,提供给LCD控制器刷新液晶显示屏。键盘和报警电路利用S3C44B0通用I/O端口进行控制。
本系统软件设计基于μClinux操作系统和MicroWindows图形用户界面。μClinux操作系统是从Linux内核派生而来,在标准的Linux基础上进行了适当的裁剪和优化,具有易配置、体积小、易移植的优点。用MicroWindows图形用户界面实现类似桌面电脑的视窗效果,易于实现人机交互。
系统软件包括操作系统自带的设备驱动程序、操作系统运行环境、根据用户需要自定义的设备驱动程序、封装了底层驱动的中间层接口程序、高级应用程序几个部分。在本系统软件设计中,分别在驱动层和高级应用层程序中实现,其中高级应用层程序框图如图4所示。

图4 高级应用程序框图
高级应用程序的设计以控制算法为核心,多个任务为控制服务。系统内核定时将测得的数据通过回调函数传递给高级应用程序。高级应用程序为每个被测通道分配一个数据缓冲区,数据缓冲区是个含有10个无符号整型数的数组,GCC编译器默认无符号整型数长度为16位。测量电路中ADC为10位模数转换器,缓冲区中的每个单元的低10位存储数值,最高位为1表示该数据无效或者已经被处理,为0表示该数据有效并等待处理,第10~14位表示数据编号,用以区分不同通道的数据。内核驱动程序把测量数据按格式准备好后,回调函数把数据传送给高级应用程序。应用程序只要使用“与”、“或”操作就可以提取数据类型、实际数据等信息。
3.1 自定义设备驱动
设备驱动程序是操作系统和硬件设备之间的接口,它主要完成对设备初始化、实现内核和应用程序与设备之间的数据交换、检测处理设备错误等功能。在μClinux操作系统使用设备文件的方式来进行设备管理应用,一个具体的物理设备被映射为一个设备文件,用户程序可以像对其它文件一样对此设备文件进行打开、关闭、数据读写等操作。
系统软件设计中的驱动层部分,除了使用μClinux操作系统自带的设备驱动程序以外,需要对外部设备编写自定义的设备驱动程序,以满足操作系统的要求。以字符设备为ADC为例,主要对其编写自定义的驱动程序。使用结构体file_operations{}作为ADC字符设备的函数接口,内核通过这个函数接口来操作设备。自定义后的file_operations{}结构体如下:
struct file_operations ADC_fops = {
read: ADC_read, //从设备中读数据操作
poll: ADC_poll, //查询设备
ioctl: ADC_ioctl, //进行读、写以外的IO控制操作
open: ADC_open, //打开设备
release: ADC_release, //关闭设备
……};
编写自定义的驱动程序完成后,内核调用相应的函数即对ADC设备文件进行open、ioctl等具体操作。
3.2 图形用户界面设计
图形用户界面(GUI)把图形视窗引入到嵌入式平台上,其友好的界面为大多数用户所接受,也得到越来越广泛的应用。本设计采用MicroWindows来实现图形界面,以窗口形式显示测量数据及其它参数。MicroWindows是一个较早出现的、开放源码的嵌入式图形用户界面软件,它提供了比较完整的图形功能,支持多种外部设备输入,具有占用空间小、可移植性好的优点。在μClinux操作系统上使用MicroWindows易于图形程序的开发。
MicroWindows采用了层次化结构:在底层提供设备的驱动,在中间层通过一个可移植图形引擎实现绘制多边形、区域填充、使用颜色等,在顶层实现多种API以适应不同的应用环境。MicroWindows API 之间采用消息传递的基本通信机制。消息被储存在应用程序的消息队列中,不同消息对应不同的事件,核心的API通过传递对应相应事件的消息来实现各种功能,如窗口的创建、绘制、移动等等。
在本设计中,编写基于Microwindows的应用程序,基本结构为初始化、创建窗口与资源、进入消息循环三部分。主程序中相关部分如下所示:
int WINAPI WinMain()
{MwRegisterEditControl(NULL); // 申明不使用控件
wndclass.style= CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndclass.lpszClassName = szAppName; // 创建窗口属性的结构体变量
RegisterClass(wndclass);
hwnd=CreateWindowEx(); //创建窗口
while (1)
{if(PeekMessage(msg,NULL,0,0,PM_REMOVE)) //消息查询
{TranslateMessage(msg);DispatchMessage(msg);} //传递消息至窗口处理程序
ScanKey_function(); //扫描键盘
RxKeyvalue(hedit_Param);
……}}
在调用窗口创建函数CreateWindowEx()后,系统在内存中创建了一个虚拟的窗口,之后调用窗口显示函数ShowWindow()就可将虚拟窗口显示为可视窗口,成为Windows风格的视窗界面。在本设计中,主程序运行时不断调用提取消息函数PeekMessage(),查看消息队列是否收到任务信息,当有信息产生时,就执行对应的消息处理函数。同时,在消息循环里也反复调用键盘缓冲区查询函数RxKeyvalue (),查看是否有键盘输入,以便随时响应。
4. 抗干扰措施
在本设计中,采用低温漂的基准稳压电源为前置放大电路供电,并且在每个元件的电源管脚处加去耦电容。元器件选用高精度、漂移小的精密运算放大器;选用高精度、低温漂的精密电阻;信号线采用双绞线或屏蔽线。印刷板布线时,尽量缩短前置放大电路的信号线,并确保了电路接地、屏蔽良好。
5 结语
本文创新点在于设计和实现了一种基于ARM的微伏信号在线监测系统,以差动放大方式消除外界对测量信号的干扰,利用S3C44B0X微处理器和μClinux操作系统实现液晶屏显示数据、人机交互和故障自动报警功能,为实现微伏信号在线监测提供了一种体积小、功耗低、操作灵活的解决方案。本设计已投入使用,长时间工作稳定。
评论