测控系统是水动力实验中的重要测试设备。在实验中有压力、拉力、加速度等物理量通过传感器转换成电压值,需要准确记录。虽然实验模型有很多种,但是共用传感器及测控系统,因此对测控系统的通用性和用户界面友好性提出了要求。本文采用嵌入式架构设计了测控系统。
本文设计的系统硬件基于STM32芯片,具有很强的扩展能力,易于移植,其外设单元资源丰富,能够达到系统要求的精度和范围。
1、硬件架构
采用嵌入式架构(见图1)的优点是通用性强,便于在多平台移植;主控芯片外围电路模块丰富,包括ADC、DA、CAN和SDIO等接口,独立完成对多种类型设备的测量、控制。芯片的主频高,运算能力也很强,适合嵌入复杂的算法。完全适合作为测控系统,具备系统升级和扩展的空间。
图1 嵌入式测控系统硬件架构
系统采用意法半导体推出的STM32F103,是基于Coretex-M3内核的32位ARM芯片系列,而ZET6属于该系列的高容量芯片,片内Flash为512KB,片内SRAM为64kB,主频72MHz,具备26位地址线和16位数据宽度。
系统的显示屏为翰彩4.3寸TFT液晶屏,分辨率为640×480,显示屏驱动模块是SSD1963,采用了16位(5位红色,6位绿色,5位蓝色)64K接口模式,由FSMC数据接口连接控制。覆盖电阻式触摸屏,控制芯片ADS7843输入触摸屏四路电压,用SPI通讯输出触摸点位置信息。图2所示为LCD接口电路。
图2 LCD驱动模块的接口电路
内部ADC模块是12位逐次逼近型,有16通道,采样率最高1MHz。STM32F103的CAN总线单元被称为bxCAN(BasicExtendedCAN),它支持CAN协议2.0A和2.0B;选用的CAN收发器是TJA1050,在CAN协议控制器和物理总线之间起到接口的作用,设计有120Ω的终端匹配电阻以适应不同的总线网络。图3所示为CAN模块的接口电路。另外,本文还设计了RS232接口以适应不同接口要求。
图3 CAN模块的接口电路
2、软件设计
本设计采用的STM32F103ZET6属于大存储器芯片,可以直接在工程里使用ST公司标准库自带的大存储器芯片启动代码,这个文件已经配置好了初始状态、中断向量表。用户自己需要设置的是使用的模块和通道,即CAN模块、ADC模块、USART模块和FSMC模块。
2.2、显示驱动
实现本文中的STM32F103利用FSMC(FlexibleStaticMemoryController)接口驱动显示电路。FSMC接口是一种总线接口,有4个专用的片选信号,可以访问最多4个NOR、NAND闪存或SRAM存储设备。本文系统采用存储块1(Bank1)作为数据、控制区域,其基地址从0x60000000开始,显示芯片数据或命令选择信号接在FSMC_A16上,因此LCD的指令地址、数据地址定义如下:
#defineBank1_LCD_Data((uint32)0x60010000)//数据
#defineBank1_LCD_Cmd((uint32)0x60000000)//指令
根据显示芯片SSD1963的指令集,编写了基础的画点、画线、画矩形的函数,便于以后作为uC/GUI的基础软件。触摸屏驱动的芯片ADSL7843用SPI口分别读出触摸点的x轴、y轴数据即可。
2.3、uC/OS移植与实现
uC/OS-II通过了FAA(FederalAviationAdministration)认证,在实时性要求很高的嵌入式工业控制领域能够放心使用。移植工作包括:
(1)在os_cpu.h中设置参数。A)使用的数据类型,即统一表达数据单元长度。B)设置堆栈参数如增长方向、操作单位等。ARM支持的是自顶向下的堆栈增长方式,即堆栈空间从高地址向低地址增长。单次堆栈操作单位是INT32U。C)任务中断宏定义选项:屏蔽所有中断,恢复所有中断,进行任务切换。前两个是为了保证重要函数或任务运行中的数据不会被改变(即代码临界段),第3个是用于uC/OS-II的任务切换。
(2)在os_cpu_c.c中使用C语言编写任务堆栈初始化函数:OSTaskStkInit()。这个函数在创建任务的时候被OSTaskCreate()或者OSTaskCreateExt()调用,初始化任务堆栈,它是与处理器的特性紧密联系的。
(3)在os_cpu_a.asm中用汇编语言编写任务切换等底层函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()。
OSStartHighRdy()在多任务系统启动函数OSStart()中调用,它设置系统运行标志位OSRunning=TRUE;将就绪表中最高优先级任务的栈指针加载到SP中,并强制中断返回。这样就绪的最高优先级任务就如同从中断返回到运行态一样,使得整个系统得以运转。
图4 uc/OS-II任务状态转换图
2.4、uC/GUI的移植与实现
uC/GUI是一种嵌入式应用中的图形支持系统[6]。它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境,并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。它的设计架构是模块化的,由不同的模块中的不同层组成。uC/GUI的软件构架如图5所示。最底层直接对LCD硬件操作,不同的系统需要根据LCD的控制器做相应的移植。第二层是LCD驱动程序最主要的层面,它利用硬件操作层实现最基本的绘图函数。第三层的uC/GUI函数库实现了复杂绘图函数的封装,给用户层提供API接口,解决了绘图中出现的大部分问题。用户加入自己的应用程序,利用API接口实现系统的图形界面。
图5 uc/GUI软件结构图
uC/GUI进行移植工作,主要包括:
(1)在guiconf.h中定义多系统支持、窗口管理等。
(2)在lcdconf.h中的总线接口和寄存器接口进行硬件接口的配置和定义。
(3)LCD驱动编程的实质是液晶屏上的点对应的显存编程,最底层调用函数为画点函数,根据自身平台情况根据总线接口和寄存器接口或者LCD控制器寄存器进行操作。首先写好底层驱动器对图形显示的操作函数:SetPoint(),GetPoint()等;其次,实现基本绘图函数,如画圆、画线、画方框等:GUI_Line(),GUI_Rectangle()等。最后,设置底层驱动器与uC/GUI之间的接口函数,因为有上述基础,只需对应填写接口函数。
完成全部步骤后,要使uC/GUI能运行于uC/OS-II系统上,还需要编写uC/GUI与uC/OS-II、触摸屏的接口文件,即修改GUI_X_Touch.c和GUI_X_uCOS.c文件。
3、软件流程
系统的整个软件流程采用任务分配执行方式,是按照定时节拍由任务切换完成的。从任务的角度可分为底层硬件接口的驱动任务和显示、触摸驱动任务。
表1列出了系统中建立的任务及其优先级、堆栈大小、任务目的等。
表1系统中建立的任务及其参数
图6左侧所示是软件流程初始化函数。
图6 软件初始化函数及主任务流程图
主任务的目的是初始化uC/OS-II时钟节拍,使用统计任务,建立用户任务。建立了4个用户任务,因为需要保证数据采集的准确性,所以ADC采样任务优先级较高,仅次于主任务,而用户界面和触摸驱动任务排在最后。uC/OS-II的任务结构规定必须为无返回的结构,也就是无限循环模式。所以主任务是延时0.5s无限循环。
中断函数的配置包括DMA中断和系统时钟中断。
ADC采样任务在系统建立后以530kHz采样周期始终进行,但是把AD采样的结果显示到屏幕上需要等待1kHz采样时钟中断程序用来发送启动信号量。
设计AppTaskUserIF任务作为用户界面任务,主要负责窗口建立、显示和刷新的工作。在界面任务中,建立一个主窗口作为父窗口,子控件为各个通道的瞬时值、平均值文本控件,启动按钮控件和倒计时文本控件。
4、系统应用
在水动力实验中应用本文设计的测控系统,体积为12cm×10cm×4cm,用具有水密性的盒子安装,如图7所示。实验要求5通道采集,采样频率100Hz,在达到实验状态后,采集10s数据,求平均值,显示并记录数据。经过测试,系统精度达到了1.46mV。
5、结论
在嵌入式系统中,uC/OS-II和uC/GUI的体积小,功能全面,在STM32的ARM核上移植有成熟的经验,得到了广泛的应用。多任务的操作系统能够及时扩展和裁剪,非常适合嵌入式灵活多变的要求。本文设计的基于STM32的嵌入式测控系统功能完善,配备的触摸屏增强了操作互动性,很强的扩展性能够适用于不同的场合,具有很高的应用价值。