摘 要:介绍了ARM9和嵌入式实时操作系统μC/OS-II在大射电望远镜5米模型上悬索控制中的应用。介绍了基于ARM9处理器(Atmel公司的AT91RM9200)的触摸屏、LCD等电路的设计。分析了用AT91RM9200产生6路独立的PWM信号的方法。给出了在嵌入式实时操作系统μC/OS-II下的多任务应用软件的设计实例,并成功实现了六轴联动。
关键词:ARM9 μC/OS(MicroC/OS) RTOS 六轴联动
“大射电望远镜FAST(Five hundred meter Aperture Spherical Telescope)预研究”是中国科学院知识创新设计方案[1]。通过六根悬索驱动馈源舱完成馈源的大范围跟踪,保证馈源舱的定位精度在50cm以内。为验证方案的可行性,实地已建造了50m缩比实验模型。现由于实际需要,还建立了5m缩比实验模型(以下简称FAST 5m)。5m缩比模型的馈源舱一级粗调由自动调整和手动调整组成,自动调整由工业控制计算机实现,手动调整主要目的是把馈源舱调到指定位置,为自动调整作准备。手动调整分为点动调整和精确调整两部分。为了调整方便,需要LCD和触摸屏,并要求较高的实时性,加上复杂的控制程序,这就需要更高的CPU处理速度和更大的系统内存,因此选用32位ARM处理器并且使用嵌入式实时操作系统。本文详细讨论AT91RM9200和μC/OS-II在5m缩比模型的一级粗调中手动调整的运用。
1 系统硬件的组成
现FAST 5m试验模型只用一个控制柜,控制六台交流伺服电机调整六根索来控制馈源舱的位置,类似于六轴联动。需要六路独立的脉宽调制信号(PWM),整个硬件框图如图1。
图1 系统硬件总体框图
图2 LCD和触摸屏的接口电路
1.1 AT91RM9200及其外围电路
AT91RM9200是Atmel公司推出的一款用于工业控制的ARM9处理器,它基于ARM920T内核, 工作在180MHz频率下,运算速度可高达200MIPS[2]。AT91RM9200集成了丰富的系统外围和应用外围及标准的接口,集成了高速片上SRAM和低延迟的外部总线接口(EBI)。高级中断控制器(AIC)、外围数据控制器(PDC)、电源管理控制器(PMC)集成了USB2.0接口、以太网10/100 BaseT MAC控制器,这些接口极大地扩展了外部器件的种类[3]。
AT91RM9200 内部只有16KB的SRAM,远远不能满足应用程序的要求。为了能运行嵌入式操作系统和运用程序的要求,需要扩展外部SDRAM及Flash。
1.2 LCD和触摸屏接口电路
在FAST 5m模型手动调整中,采用了LG推出的LB06V2显示屏TFT-LCD和触摸屏,其面板尺寸6.4英寸,分辨率480×640[4]。LCD触摸屏的接口电路如图2所示。LCD控制芯片采用Epson公司的S1D13506。该芯片内部不带显存,需要扩展FPM/FDO-DRAM。考虑到整个界面操作在图形模式下,需要较大的显存,采用OKI 公司的MSM5118155F的16M bit动态存储器(EDO RAM)。S1D13506驱动LB06V2显示屏需要的60MHz的BUCLK时钟由AT91RM9200提供,25MHz的CLK1和12.5MHz的CLK2由ICS1523提供,AT91RM9200通过I2C总线控制ICS1523输出的所需CLK1和CLK2的频率,以适应不同规格的LCD或VGA需求。由于S1D13506访问RAM需要等待70ns,这造成LCD显示速度比较慢。本系统并不需要频繁切换图形界面,主要考虑到AT91RM9200是一款很适合工业控制用的高速ARM处理器。
AT91RM9200集成了SPI控制器,可与触摸屏控制芯片(ADS7846)直接相连接。这使电路设计简单,还可以高速地进行数据传输。本系统中SPI的CLK工作在14kHz,完全能保证ADS7846转换的数据准确传输到AT91RM9200。
1.3 电机控制接口电路
AT91RM9200 有六个相同定时/计数器(TC), 可用这六个TC产生12路PWM信号,虽然一个TC可产生两路PWM信号,但是这两路PWM频率相同,只是脉冲宽度不同。图3是其中一个TC的部分原理图。本系统中TC控制交流伺服电机频率(控制电机的速度),8254控制脉冲的个数(控制电机的角位移)。
其基本工作原理:把TC配置成产生波形状态,选择AT91RM9200内部时钟或外部时钟作为16位TC的时钟源,启动计数器(CLKSTA), TC从零开始计数。
当TC中的值与RA中的值相等,输出控制器可使TIOA输出高电平;当TC中的值与RC中的值相等, 输出控制器可使TIOA输出低电平,同时复位TC,使TC重新计数。这样可产生方波信号。RC的值控制TIOA输出脉冲的频率,RA和RC可控制PWM的占控比。当TC的值达到RA、RB、RC的值时还可产生中断,也可把这些中断屏蔽掉。这样产生的PWM频率可从几赫兹到几兆赫兹。TIOB产生PWM信号的原理与TIOA完全一样。
本系统中把TIOA配置为脉冲输出口,TIOB为外部事件触发输入口(即伺服控制卡中的脉冲计数卡产生的中断), 当伺服控制卡中的脉冲计数器(8254)计数到设定值时产生中断,由TIOB通过RS触发器停止TC计数。这样可实现伺服电机的速度和位置控制。
伺服控制卡的脉冲计数器的核心器件是两片8254[5],可进行六路独立的脉冲计数,如图4所示。
图3 TC部分原理图
图4 伺服控制卡原理图
2 软件开发
由于目前大部分基于ARM9的嵌入式系统一般用Linux,用于实时性要求不高的的设备。采用μC/OS需要写ARM9启动代码,初始化SDAM、FLASH、USRT、SPI、触摸屏控制芯片、LCD控制芯片等。写这些底层驱动代码时,在Linux网站开放的源代码很值得借鉴和参考。
2.1 嵌入式实时操作系统μC/OS-II
目前商用的嵌入式操作系统产品很多,十分成熟,并且提供了强大的开发和调试工具,但开发成本昂贵且大部分不提供源代码,并不适合小型系统的开发。μC/OS-II面向中小型嵌入式系统,其主要特点:公开源代码、可移植性、可固化、可裁减、支持多任务、具有可确定性等[4]。本系统不需要网络和文件系统,μC/OS-II是一个很适合本系统的嵌入式系统。
μC/OS-II的移植过程比较简单。它在ARM7处理器上的移植相当成熟。在AT91RM9200上的移植与ARM7处理器上的移植类似, 由于篇幅的限制,本文不具体介绍μC/OS-II在AT91RM9200上的移植过程。μC/OS-II要求用户提供一个周期性的10~100次/秒时钟源,实现时间的延时和超时功能[4]。AT91RM9200内有一个Period Interal Timer(PIT),它是一个十六位的减法计数器, 使用它很容易给μC/OS-II提供10~100次/秒时钟节拍。
PIT计数器产生时钟节拍为100次/秒的程序代码如下:
void uCOS_TickInit()
{
volatile int status;
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_SYS,1,0, OS_CPU_IRQ_ISR );
// 配置 PIT 中断
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS);
// PIT产生中断使能
AT91C_BASE_ST->ST_IDR=AT91C_ST_PITS;
status = AT91C_BASE_ST->ST_SR;
AT91C_BASE_ST->ST_PIMR = 327;
// 为μC/OS产生100Hz的系统时钟
AT91C_BASE_ST->ST_IER = AT91C_ST_PITS;
}
2.2 应用程序
基于μC/OS-II的应用系统工作时,首先初始化CPU;接着进行操作系统初始化,主要完成任务控制块(TCB)初始化、TCB优先级表初始化、空任务的创建等;然后开始创建新任务;最后调用OSStart()函数启动多任务调度。应用程序的编写主要考虑任务如何划分、任务的优先级、任务之间的通讯。
本系统靠触摸屏实现人机接口,故把检测触摸屏状态设为优先级最高,每10ms检测一次触摸屏状态。控制界面采用类似Windows的控件编程方式,把每一个控件看作一个任务来处理, 以手动精调控制界面(见图5)为例,上面有10个控件:控制电机位置的滚动条控件(6个)、控制馈源舱运动速度的滚动条控件(1个)、6台电机位置复位按钮控件(1个)、切换到自动控制和手动控制按钮控件(各一个)、电机启动控件(1个),加上前面的触摸屏检测任务,在此需建11个任务。它们之间靠消息通讯,触摸屏任务主要完成给其它11个任务发消息。每当检测到ADS7846产生PENIRQ,通过SPI接口向ADS7846发送A/D转换和读A/D转换结果指令,把结果转换到当前触摸屏按下点的坐标值,再把这个坐标值以消息的形式发出去,然后调用OSTimeDly(1)函数延时10ms。其余10个任务调用OSQPend()等待消息(坐标值),如坐标值在此控件内,触发相应的事件。其程序部分代码如下:
viod main()
{
初始化硬件 ;
OSInit();
OSTaskCreate(TouchSreen,(void*)0,(OS_STK*)&TouchStk
[500],4); //创建触摸屏任务
…………
OSTaskCreate(MotorRun,(void*)0,(OS_STK*)&RunTaskStk
[8000],6); // 创建电机RUN任务
OSStart(); // 启动多任务
}
void TouchSreen(void *pdata){
…………
OS_ENTER_CRITICAL();
μCOS_TickInit(); //为μC/OS-II提供100Hz的系统时钟
OS_EXIT_CRITICAL();
Ads7846_Init(); //初始化触摸屏控制芯片
while(1){
if(ADS7846_Int_Flag==1){ //是否触摸屏按下
OSTimeDly(1);
//延时10ms发送A/D开始转换指令;
读A/D转换的结果;
…………
发送消息(即触摸屏按下的坐标值);
ADS7846_Int_Flag=0;
}
OSTimeDly(1);
}
要实现六轴联动,就必须在程序中加入控制算法。由于悬索与馈源舱控制系统具有精确模型难以得到、 变结构的特点且控制精度要求较高,可采用的算法能用于动态未知的系统,并能实时适应受控对象的变化,采用非参数模型自适应控制算法[6]。把这种算法加在RUN按钮事件下。
本程序中还有许多中断服务程序,都放在OS_CPU_C.C中。例如,为了使电机运转连续以保证悬索馈源舱系统做平稳的扫描运动,要求当前伺服指令执行后需要更新脉冲的频率(RC的值)和脉冲计数的个数(8254)在几毫秒内完成,同时又要有很好的实时性,必须采用中断服务方式实现。
3 测试
作者编写了底层硬件的驱动,把μC/OS-II成功地移植到AT91RM9200上,并编写了基于触摸屏图形控制界面。本系统中有三个可互相切换触摸屏图形控制界面,其中手动精调控制界面见图5。
本系统输出的脉冲可从7Hz到几MHz, AT91RM9200中TIOA(见图3)最高可输出15MHz的脉冲,但由于8254计数器的最高计数频率为10MHz,制约了整个系统的脉冲输出频率,这完全可以满足一般的伺服驱动器的要求。选择TC计数器(见图3)的CLK为TIMER_CLOCK2(7.5MHz),RA=1,RC=3,这时输出的频率应为CLK/RC=7.5/3=2.5MHz,占空比为(RC-RA)/RA=2,输出电压的平均值为3.3×2/3=2.2V,用Fluke 196C示波器测得实际输出波形与理论完全一致,如图6。
本系统在大射电望远镜5米模型上通过调试,运行良好。目前ARM处理器绝大部分都用于手持设备,对实时性要求不高,但工业控制中要求实时性高。本系统也只用到AT91RM9200处理器的部分资源,从某种角度上讲是有点浪费,但作者把ARM9处理器和μC/OS-II用在工业控制上是一次尝试,从控制的鲁棒性都证明了AR91RM9200和μC/OS-II在控制电机多轴联动的效果是令人满意的。如充分利用AT91RM9200集成的USB2.0接口、以太网10/100BaseT MAC控制器,完全可以满足复杂的工业控制。随着嵌入式系统和ARM处理器的发展,ARM处理器在工业控制中会越来越多。
图5 手动精调控制界面
图6 Fluke 196C示波器测得实际波形
参考文献
1 段宝岩.新一代大射电望远镜机电光一体化设计研究[J]. 中国机械工程,1999;10(9):1002~1004
2 ARM920T Technical Reference Manual
3 Atmel Electronics. AT91RM9200.date sheet.768B-ATARM.
4 SHAO Bei-bei 译. MicroC/OS-II The Real-Time Kernel (Second Edition).北京:
北京航空航天大学出版社,2003
5 佘海波.基于ISA总线的八轴联动伺服卡在大射电望远镜悬索馈源系统中的应用[J].
电子机械工程,2002;18(2)
6 张玉魁. 大射电望远镜控制软件系统的研究.西安电子科技大学硕士学位论文, 2001;01