引 言/ y h- [/ k# z% I$ _
运动控制器是运动控制系统的核心部件。目前,国内的运动控制器大致可以分为3类:
4 g! b) Q7 ]7 j8 C$ A( H* ` 第1类是以单片机等微处理器作为控制核心的运动控制器。这类运动控制器速度较慢、精度不高、成本相对较低,只能在一些低速运行和对轨迹要求不高的轮廓运动控制场合应用。3 O. T0 }- U: V- x0 r3 r
第2类是以专用芯片(ASIC)作为核心处理器的运动控制器,这类运动控制器结构比较简单,大多只能输出脉冲信号,工作于开环控制方式。由于这类控制器不能提供连续插补功能,也没有前馈功能,特别是对于大量的小线段连续运动的场合不能使用这类控制器。
% E! h- p1 B3 f- P' F) e8 H 第3类是基于PC总线的以DSP或FPGA作为核心处理器的开放式运动控制器。这类开放式运动控制器以DSP芯片作为运动控制器的核心处理器,以PC机作为信息处理平台,运动控制器以插件形式嵌入PC机,即“PC+运动控制器”的模式。这样的运动控制器具有信息处理能力强,开放程度高,运动轨迹控制准确,通用性好的特点。但是这种方式存在以下缺点:运动控制卡需要插入计算机主板的PCI或者ISA插槽,因此每个具体应用都必须配置一台PC机作为上位机。这无疑对设备的体积、成本和运行环境都有一定的限制,难以独立运行和小型化。5 S' ~* b) V$ i! a# I- I5 y
针对这些问题,设计了一种基于ARM+DSP的嵌入式运动控制器。该控制器将嵌入式CPU与专用运动控制芯片相结合,将运动控制功能以功能模块的方式嵌入到ARM主控板的架构,把不需要的设备裁减掉,既兼顾功能又节省成本。该控制器是一种可以脱离上位机单独运行的一种独立型运动控制器,具有良好的应用前景。 ' e. G! }* i3 M- C+ s. i
, F8 k; [, s$ Y+ A$ u
1 嵌入式运动控制器的硬件平台设计
$ B% |' g$ p5 c& {/ s 嵌入式运动控制器的硬件主要包括两个部分:ARM主控板和DSP运动控制板。这两块控制板通过通用I/O口以总线的方式连接在一起。在设计时,可以分别对ARM主控板和DSP运动控制板进行设计,最后再调试。这种将ARM主控板和DSP运动控制板分开设计和调试的硬件方案,将设计难点分散,使设计和调试更简单。+ ?9 z3 S) u, {
1.1 ARM主控板部分$ i# [9 j) v/ c9 R C
本系统采用的ARM芯片为Samsung公司推出的16/32位RISC处理器S3C2440A,主频为400 MHz,最高频率可达533 MHz。ARM主控板以嵌入式处理器S3C2440A为核心,外扩存储器和通用设备接口。ARM主控板的硬件结构框图如图1所示。 5 T& e1 V9 ]9 u7 m4 h
http://www.icembed.com/UploadFiles/2009101910427734.jpg
7 [# t+ F, I/ @! s$ g( s: t 通过通用I/O接口与DSP运动控制板通信,实现ARM主控板与运动控制板之间数据的实时双向传送;外部NAND Flash存储器(64 MB),用于存储系统参数及运动指令;NOR Flash存储器(2 MB),用于存放系统运行程序;SDRAM存储器(64 MB),用于存放临时数据;通过串口、以太网接口、USB接口与上位机系统通信,实现两者之间数据的传送;通过LCD接口,实现320×240分辨率液晶屏的图形与字符显示,并具有触摸屏接口,提供友好的人机交互界面;通过I/O扩展接口,提供可编程的数字I/O通道;通过JTAG接口与PC机通信,实现系统运行程序的仿真调试及下载,软件升级接口。9 o6 W- x# O% |# B) o3 G6 ~
1.2 DSP运动控制板部分/ J% e8 b9 y( _
本系统DSP运动控制芯片选用PCL6045B。PCL6045B是一种功能十分强大的DSP运动控制芯片。芯片能够控制四轴,并实现两轴到四轴直线差补、两轴圆弧差补。所有插补计算由芯片完成,上位机只需写入圆弧的参数即可,其多轴插补控制功能特别优秀。系统硬件采用主从式双CPU结构模式。主CPU为ARM处理器,负责键盘、显示、网络通信等管理工作;从CPU为PCL6045B运动控制芯片,专门负责运动控制的处理工作。PCL6045B与ARM的通信是靠读写I/O总线上的几个地址来进行指令和数据的传输。控制系统硬件结构框图如图2所示。
9 ]& X. ?$ w: m" o$ [0 e ^http://www.icembed.com/UploadFiles/2009101910428580.jpg * @3 t$ |" y2 L! J
1.3 ARM处理器与运动控制芯片的连接& o; q9 r0 U8 Y5 M7 v+ l
通过设置引脚IF0与IF1,PCL6045B芯片与不同的CPU相连,如表1所列。
R: \) f X* d' D9 [0 u9 g/ ~2 [http://www.icembed.com/UploadFiles/2009101910429621.jpg
U5 h4 b9 f3 h0 o& N 本系统设置IF1:IF0=0:1,CPU连接如图3所示。 ( o0 S4 Y2 N& m9 R- G! g
http://www.icembed.com/UploadFiles/2009101910430360.jpg . w3 n; f, u+ a+ T
2 嵌入式运动控制器的软件设计
# w. c. i* [, B% t9 |& } 本系统可根据被控对象的特征设计不同的模块化用户软件,来满足不同的运动控制任务。模块化软件恰好是Linux操作系统的优点。Linux还可以根据用户的需求实现内核的裁减和定制,源码开放,网络支持功能强大,价格上也更具有竞争优势等。所以该控制器选用Linux作为片上系统(SoC)。但是,Linux并不是一个实时操作系统,因此,通过实时内核补丁RTAI(Real Time Application In-terface),在硬件平台的基础上增加一个实时内核,将Linux内核当作它的优先级最低的任务执行,从而保证运动控制系统的实时性。系统的控制软件分为两个区域:非实时域和实时域。非实时域是建立在普通Linux内核基础上的,其主要包括系统初始化和通信模块。
8 l% s% u% A7 W- e
8 }9 A; b1 f4 S4 k6 i8 Y2 P8 h ①系统初始化:进行微处理器的硬件初始化,包括输入/输出接口的配置、具体总线通信方式的配置以及伺服系统相关的接口参数配置。. Y* O5 [+ S! H9 ? W% i( q
②通信模块:负责运动控制卡和上位机之间的坐标值、速度值、数控系统的I/O接口状态、报警状态以及数据链表的传输。
$ R' b- }8 v0 |5 a 实时域建立在RTAI实时内核的基础上。其实时任务通过实时进程的方式来完成,一种为周期性(peri_odic)实时进程,另一种为一次性(one shot)实时进程。实时域主要包括如下4个周期性实时线程:3 X8 z2 V: A0 j& I$ O8 D7 _$ R
①状态检测线程(rt_monitor_thread)。本任务对设备运行状态进行检测,负责从I/O端口读入各个连接的I/O设备值,然后将状态写入状态检测缓冲区中,对设备急停、伺服报警、限位信号进行判断,并进行相应的处理。; A6 P2 m) {. [7 }
②插补线程(rt_interpolation_thread)。从译码缓冲区中顺序取得插补数据,然后根据是直线或者圆弧进行插补,插补得到下个周期应该到达的理论坐标值。$ B& O2 i2 P% f* e, a
③位置控制线程(rt_position_thread)。读取计数器中编码器的数值,得到实际的位置,并与插补器中的理论位置坐标作比较。根据差值调节PID参数,并将具体脉冲输出数写入对应的PWM口的脉冲数寄存器中。! b. ]' q' q3 w8 C8 A' P' W( P3 S
④功能控制线程(rt_function_thread)。功能控制任务利用RTAI实时管道来传递命令和状态信息的功能。通过管道的命令设置实现Linux操作系统对实时部分RTAI的访问,从而实现运动控制器的运行、暂停、给定速度等状态设置。
5 Z6 \/ ~8 ]3 N4 U8 D% B% t2 i2.1 软件平台的建立8 q' h J& z: @2 v! [: U2 h9 W
软件平台是系统应用程序开发的基础。本系统软件平台主要包括:ARM-Linux的移植、串行接口驱动开发、USB接口驱动开发、LCD接口驱动开发、触摸屏接口驱动开发、以太网接口驱动开发、文件系统的移植等。这些软件的开发和移植在很多文献中有详细的说明。
, g2 O( s, B% I2 \2.2 运动控制函数库的设计) Z8 e8 P; b* i% j& m `0 \+ c
通用运动控制器的功能主要取决于运动控制函数库。要做成一个开放式的运动控制器,必须编写丰富的运动控制函数库,以满足不同的应用要求。运动控制函数库要为单轴及多轴的步进或伺服控制提供许多运动函数,如单轴驱动、两轴直线插补、3轴直线插补、圆弧插补等等。另外,为了配合运动控制系统的开发,还编写了一些辅助函数,如中断处理、编码器反馈、间隙补偿、通用开关量的输入输出等。这样,用户在开发应用程序时就不必再关心底层的东西,只需根据控制系统的要求编制人机界面,并调用运动控制函数库中的函数,就可以开发出满足要求的多轴运动控制系统。
7 @5 m, B1 {) U6 y$ _2 K7 _3 w. K9 _2.3 对Ljnux进行实时化改造" u2 z7 f/ m% l6 x3 P% c
由于Linux不是一个实时操作系统,所以,利用实时内核补丁RTAI(Real Time Application Interface)。RTAI的安装和使用详见参考文献[7]。该控制器所使用的Linux开发环境为ELDK(Embedded Linux DevelopedKit)3.0。Linux内核为Linuxp pc_2_4_devel,而RTAI的版本为24.1.12。由Linux中的init_module()和cleanup_modtde()两个函数加载和卸载实时任务模块,通过这两个函数进行实时线程及其处理函数的创建和回收。其关键程序如下:
|