伺服系统软件设计软件设计是多电机高精度位置伺服系统的一大难点,它的好坏将直接影响系统的整体性能。由于四个电机的作用不同,而且对系统的动态性能、稳态性能及可靠性都有苛刻的要求,因此,一般的前后台系统很难满足系统性能指标的要求。为了使控制系统逻辑简单且易于实现,以及使系统的实时性、可靠性得到较好的保证,采用在F2812上移植uC/OS-是一种不错的方法。
uC/OS-在F2812上的移植uC/OS-是一种源码公开、可裁减的实时多任务操作系统,它的大部分程序是采用ANSIC语言编写的,可读性强,可移植性好,而且其可靠性符合航空电子设备软件D0-178B的标准。目前uC/OS-在网络设备、自动提款机、机器人等领域都得到了广泛的应用,并且都取得了极大的成功。
编写控制软件之前,首先要将uC/OS-移植到F2812上。相对于其它嵌入式操作系统,uC/OS-的移植工作比较简单,它只需修改跟CPU有关的三个文件OS_CPU.H、OS_CPU_A.ASM以及OS_CPU.C.OS_CPU.H文件主要包含与处理器有关的常量、宏及结构体的定义;OS_CPU.C中包含10个函数,但只有堆栈初始化任务OSTaskStkInit在移植过程中是必须考虑的,它的移植相当简单,只要按所用的C编译器对堆栈的处理顺序进行初始化就行了;对OS_CPU_A.ASM文件中包含的四个函数OSStartHighRdy、OSCtxSw、OSIntCtxSw以及OSTickISR的修改是移植的主要工作,由于牵扯到F2812及其C编译器的工作原理,叙述起来比较麻烦,且不是本文的重点,略去不谈。
uC/OS-的时钟节拍中断可以看作是系统心脏的脉动,它跟踪所有任务的定时器,并提供等待超时的依据。时钟节拍越快,系统开销越大,本系统采用CPUTimer0作为时钟节拍源,定时周期为50ms;时钟节拍应该在多任务启动之后开启。
代码移植结束以后,接下来的任务是测试uC/OS-移植成功与否,可以尝试着建立一两个有代表性的简单任务,如果达到相应的控制目的,说明一个实时多任务操作系统的平台已经搭建起来了,接着就可以添加用户自己的任务了。
任务的划分及创建以uC/OS-为平台搭建实时多任务系统程序,首先要根据设计目的将系统的功能进行合理地分解。uC/OS-是基于优先级调度的实时多任务操作系统,因此,在任务建立之前应根据各部分的重要性将每个任务分配一个唯一的优先级,否则系统将无法正常工作。伺服系统主要完成以下任务:故障检测及报警,位置环、速度环、电流环调节,上下位机通信等。由于本系统有四个电机,按重要性依次分为电机1、电机2、电机3、电机4.因此按优先级从高到低分成以下几个任务:故障检测及报警任务、电机14的位置环调节任务、电机14的速度环调节任务、电机14的电流环调节任务,上下位机通信任务。软件系统任务调度过程如所示。
系统的软件结构故障检测及报警故障检测及报警任务由于对实时性要求苛刻,故直接采用中断来处理。故障信号主要来自上位机的安控指令以及过流信号。当上位机的安控指令有效时,NMI将产生不可屏蔽中断,使四个电机转到预定的四个角度,进行自毁操作。笔者对四个过流信号在GAL里进行了与操作,与操作的结果作为中断XINT1的输入,而四个过流信号分别连到四个IO口上,这样,当某个电机出现过流时,就会发生中断,在中断服务子程序中查询相应的IO口,从而判定哪个电机出现了过流,并作出相应的处理,同时发送相应的出错信号量给通信任务,以便上位机及时了解控制系统的情况。
位置环的主要任务是将给定位置与反馈位置之差,按一定的控制算法,得出相应的速度参考值。位置任务的示意性代码如下:voidPstnTask(voidpdata){pdata=pdata;//防止编译出错,以后的示意性代码中省略for(;;){OSSemPend(PstnLoopRate,0,err);//等待三次位速度环调节完成while(ADCFlag);//等待ADC资源的释放ADCFlag=1;//占有ADC资源启动AD转换;等待转换结束;ADCFlag=0;//释放ADC资源对转换结果进行软件滤波;采用模糊PID算法实现位置环控制;}由以上的示意性代码可以看出,当三次速度环调节没有完成或者ADC资源被其他任务占据,则位置环任务将被挂起,uC/OS-开始进行任务调度,此时处于就绪态的具有最高优先级的任务将投入运行。因此,为保证高优级的任务尽可能快地得到执行,每个任务占用ADC的资源的时间不能过长,一旦转换结束,应马上释放该资源;这也是在基于uC/OS-编程中必须遵循的思想。
上下位机通信任务任务主要完成F2812向主控计算机传送反馈位置、出错报告等信息,以便上位机及时了解下位机的工作状态并完成相应的控制功能。串口通信是一个耗时的任务,如果不采用实时多任务调度机制,将对系统的实时性构成严重的威胁,以9600bps的波特率来计算,完成一个字节的传送就将耗掉近1ms的时间,要传送一批数据所需的时间就非常可观了。采用uC/OS-按优先级进行任务的自动调度,它就可以在高优先级任务执行的空隙里完成传送任务,这样既满足了实时性,又大大提高了CPU的使用效率。在多任务运行之前,首先要建立任务,任务的建立非常简单,在此不再赘述。
实验结果及结论实验中上位机提供8的阶跃信号,其中一个电机的位置跟随情况如所示,该图是将反馈的位置数据通过串口传到上位机,在Matlab中画图得到的。位置响应实验曲线可以看出,当uC/OS-成功移植到F2812以后,编写起程序就非常简单。只要把要完成的功能分成若干个任务,每个任务单独编程就可以了,而无需考虑整个程序的结构。
实践证明,基于uC/OS-的编程方式非常适用于比较复杂的多电机位置伺服系统,它大大增强了系统的实时性和可靠性,并且极大地提高了系统的可扩展性,将来如果要扩展系统功能,只需单独添加相应的任务就行了,而无需对整个程序的结构进行修改。