APP下载

基于模型的设计方法在运动控制实验中的研究

2018-09-29董靖川王太勇陆钢庆李晓奇闫传滨

实验室研究与探索 2018年8期
关键词:代码生成控制板调用

董靖川, 王太勇, 陆钢庆, 李晓奇, 闫传滨

(天津大学 机械工程学院,天津 300354)

0 引 言

传统嵌入式数字控制系统软件开发需要手工编写大量代码,并且需要等到样机完成后才能进行测试,整个过程不但很容易出错,而且发现错误后需要重复代码编写、算法调试等工作,造成开发效率低下,可靠性差。为了解决传统设计方法的弊端,从20世纪90年代以后,人们尝试通过基于模型的设计方法(MBD)开发嵌入式控制系统。该方法以控制系统的数学模型为核心,借助计算机建模、仿真和自动代码生成技术实现开发流程,使工程师能够在各个阶段都能够依据系统控制模型进行设计开发,在建模、仿真过程中能够尽早发现并解决问题,避免了手工编写代码造成的效率低下和可靠性问题,使复杂控制系统快速、可靠设计成为可能。目前,基于模型的设计方法已成功应用于大型项目的开发上,如空客380客机、GM混合动力汽车、诺-马公司的联合攻击机等项目[1]。

Matlab/Simulink软件支持基于模型的设计流程,提供图形化的建模、仿真环境[2-3],以及嵌入式代码自动生成等功能,可以满足运动控制系统的开发需要。在此基础上,采用以单片机(MCU)为核心的嵌入式运动控制板作为控制器硬件平台[4],并连接直角坐标运动机构组成运动控制实验装置,可以实现运动控制算法的验证与测试。为了在该装置上实现基于模型的设计,开发了运动控制板的Simulink自动代码生成模块库[5],含有AD、DA、编码器、通用输入、通用输出等接口的驱动程序。另外还开发了运动控制板的数据采集与传输库函数,可以在实验过程中实时记录数据,并上传到计算机上进行数据分析处理。

1 实验平台介绍

运动控制实验装置由PC机、基于MCU的运动控制器和直角坐标运动机构组成,如图1所示。PC机上运行Matlab/Simulink软件,实现控制器建模、仿真、代码生成及数据处理等功能。自主设计的基于MCU的运动控制器运行由PC机设计的实时控制算法,且含有控制、编程及通信接口。直角坐标运动控制机构由相互垂直的直线运动轴组成,每个轴通过永磁同步交流伺服电机[6]拖动,经联轴器带动滚珠丝杠[7],将旋转运动转换为直线运动,最后带动工作台移动。每个轴的电机配有旋转编码及电机驱动器,由驱动器接收运动控制器发出的指令,并将编码器的脉冲反馈到运动控制器,实现闭环控制。

(a) 组成原理

(b) 实验装置照片

在自主开发的运动控制卡中,控制MCU是基于ARM Cortex-M4核心的STM32F429单片机,具有硬件浮点处理单元,支持DSP指令,最高主频可达180 MHz[8],可以满足复杂控制算法的实时计算需求。MCU内部含有2MB Flash存储器和256KB的SRAM,可存储控制程序及数据。程序下载及调试接口基于SWD协议,通过ST-Link连接PC机,下载设计的伺服控制程序,并实现在线程序调试。板上带有RS-232通信接口[9],能够连接PC机串口进行实验数据的传输。电源接口输入5 V和24 V直流电源,为控制部分电路及连接驱动器的信号回路供电。模拟量输出接口,可输出-10~10 V范围的电压信号,作为伺服驱动器的速度或转矩指令。模拟量输入接口用于连接各种模拟量信号传感器。编码器接口可连接驱动器的编码器信号输出,可对正交编码信号[10]进行双向计数,实现电机位置和速度的测量。开关量输入及输出接口可连接继电器、指示灯、行程开关等装置,也作为与驱动器通信的伺服使能输出、报警输入等信号的接口。此外,板上还设置了4个按键,用于对实验过程的控制。

2 控制模型的自动代码生成

2.1 代码自动生成的流程

控制代码的自动化生成是实现基于模型的设计方法的关键技术。在Matlab/Simulink环境下,由控制系统模型生成控制器代码的流程如图2所示[11]。用户在Simulink下建立的控制模型,经过rtw编译生成模型的rtw文件。rtw是一种结构化的文本文件,是代码生成过程中的中间产物,是后续利用目标语言编译器(Target Language Complier, TLC)进行自动代码生成的输入文件。该文件中记录了模型的模块、输入、输出、参数、状态、存储及其他重要的模型信息。然后,通过调用目标语言编译器将rtw文件编译为一系列源文件(如C语言的.C、.h文件等)。在编译过程中,目标语言编译器需要调用一些TLC文件。TLC文件使用一种脚本语言,规定了生成代码的结构及代码生成的动作等。在代码生成过程中,需要调用3类TLC文件,即系统TLC文件、模块TLC文件和其他支持代码生成的TLC函数库。在编译过程中,系统TLC文件首先被调用,该文件规定了生成代码的全局结构。然后由系统TLC 文件调用模块的TLC文件和TLC函数库,进行代码生成。在此过程中,会对模型的rtw文件中记录的信息进行读写。TLC编译过程结束后生成的源文件代码经过编译、链接后可以生成能够在目标平台硬件上运行的可执行文件。

图2 Simulink代码自动生成流程

2.2 运动控制板的Simulink模块库

为了能够使用户的控制器模型运行在基于MCU的运动控制板上,设计了与运动控制板配套的Simulink模块库,如图3所示。该模块库中的模块对应了运动控制板上的各种用于控制的输入/输出接口。其中输出模块包括模拟量输出(DAC)、伺服使能输出(SEN)、通用开关量输出(DO);输入模块包括编码器输入(ENC)、按键(KEY)、伺服报警输入(SAL)、通用开关量输入(DI)和模拟量输入(ADC)。用户可以将上述模块拖动到Simulink的模型中,建立起控制算法输入/输出信号与控制接口之间的联系。

图3 运动控制板的Simulink模块库

运动控制板Simulink模块库中的模块是基于S-function构建的[12]。S-function是Simulink的模块扩展接口,可以通过S-function实现自定义的Simulink模块。该模块可以按照Simulink的框架运行各种子方法的调用,和Simulink内建模块一起工作。 S-function分为Level 1和Level 2,可以用M代码或C语言编写。本文中,采用C语言编写Level 2的支持代码生成的S-function。以DAC模块为例,在模块库中自定义一个S-function模块,编写对应的S-function C语言文件。该文件基于Simulink自带的S-fuction模板sfuntmpl_basic.c构建。为了能够支持代码生成,除了实现常规的S-function方法外,还需要实现mdlRTW方法。mdlRTW方法的主要功能是,在代码生成时将模块的参数写入到rtw文件。DAC模块在图形用户界面(GUI)参数中定义了一个channel(“通道号”)参数,mdlRTW方法获取该参数并写入到rtw文件中,供代码生成使用:

static void mdlRTW(SimStruct *S) {

uint8_T channel = (uint8_T)(mxGetScalar(ssGetSFcnParam(S, 0)));

if (!ssWriteRTWParamSettings(S, 1, SSWRITE_VALUE_DTYPE_NUM, "channel",

&channel, DTINFO(SS_UINT8, COMPLEX_NO)))

return; }

在Matlab下使用用mex命令编译该文件后,即可在Simulink的建模和仿真中直接使用该模块。

2.3 基于TLC文件的硬件驱动编写

运动控制板的Simulink模块库中,每个模块都有对应的TLC文件,用于生成该模块的硬件驱动程序C语言代码。TLC语法是以单个“%”符号开头的关键字为命令,空格后跟参数的脚本语言,含有变量、记录、分支、循环、函数、注释等功能。模块的TLC文件支持各种子函数,用户可以根据需要选择其中部分函数并实现,也可以在TLC文件中调用Simulink的内建TLC函数,方便代码生成。以DAC模块为例,该模块TLC文件内容为:

%assign CodeFormat = "Embedded-C"

%implements F429DSM_DAC "C"

%function Outputs(block, system) Output

/* % Block: % */

%assign channel = CAST("Number", SFcnParamSettings.channel)

%assign OutVal = LibBlockInputSignal(0, "", "", 0)

F429DSM_SetDACOutputVoltage(%,

%);

%endfunction

第1行设置CodeFormat变量为“Embedded-C”,指定嵌入式的C语言格式,这种格式内存占用较少,简化了代码的接口。%implements命令一行注明S-function模块名以及生成代码的目标语言。在该文件中实现了Outputs子函数,该函数用于编写模块计算输出的代码,将其生成到model_step()函数中。channel变量是从模型的rtw文件中记录的模拟量输出通道号,OutVal变量由内建函数LibBlockInputSignal获取的模块输入端口数据,在这里是模拟量输出电压数值。生成的代码中通过调用定义的C语言函数F429DSM_SetDACOutputVoltage实现MCU片上数模转换器(DAC)数值的更改,实现模拟量电压的输出功能。

2.4 控制软件工程模板的构建

为了使Simulink生成的代码通过编译、连接成可执行文件并在运动控制板上运行,需要将自动生成的代码整合到控制器软件的开发工程中。为此,设计了一个通用控制软件工程模板,基于该模板可快速构建完整的控制器软件开发工程。

控制器软件工程模板需要完成硬件设备的初始化,还要提供底层硬件访问的接口驱动。此外,为了实现离散控制,还需要构建能够执行固定周期任务的软件框架。在构建控制软件工程中,借助了运动控制板MCU厂家意法半导体公司提供的图形化的MCU配置工具STM32CubeMx[13]。在STM32CubeMx软件中,选择运动控制板上的MCU型号,然后根据控制板的硬件电路原理对MCU的管脚分配、片上外设功能、时钟树、中断等进行配置,并设置开发工具及工程路径、堆栈大小等参数,可以自动生成的含有硬件初始化代码的完整软件工程。在此代码基础上,模板中再封装一层驱动接口函数,供Simulink 模块驱动程序调用。

为了方便实验数据的记录、传输与处理,在此控制软件工程模板中还添加了数据采集与传输功能函数库。数据采集功能可以在每个控制周期内将指定的信号数值记录到预先分配的内存中。数据传输功能支持标准的xmodem协议[14],可以将采集到的数据通过RS-232接口批量上传到PC机。

利用此工程模板构建控制软件工程的步骤如下:①复制工程模板,并打开作为新的工程。②将Simulink生成的代码复制到工程中。③调用Simulink自动生成的模型初始化函数model_initialize ()和模型周期任务函数model_step()。前者在main函数初始化阶段调用;对于后者,在工程模板中已将MCU的定时器TIM2配置为1 ms定时周期,在其中断处理函数中调用model_step()函数,即可实现周期为1 ms离散控制。④在周期中断处理函数中调用数据采集与传输函数库,记录所需实验数据。

3 基于模型的设计在实验中的应用

基于模型的设计方法使用户能够快捷、高效地进行控制系统的开发,并且降低了手工编码错误带来的风险。下面以机电传动控制课程实验教学中的双轴联动运动控制实验为例,说明基于模型的设计在实验中的应用。

3.1 控制器模型的设计

双轴联动使用直角坐标运动机构的X和Y轴的同步移动实现工作台的圆形轨迹运动,其Simulink控制模型如图4所示。模型中含有2个伺服控制通道,分别控制X、Y轴,二者结构是相同的。各轴的位置指令由正弦信号发生器模块产生,幅值和频率相同,通过设置偏移和相位关系使X和Y合成的指令轨迹为圆形。伺服控制使用电动机驱动器的转矩控制模式,发送到驱动器的模拟量电压代表转矩的大小和方向。每个伺服通道实现位置和速度的P-PI双闭环控制。

图4 轮廓控制实验的Simulink控制器模型

接口模块来自运动控制板的Simulink模块库。使用按键KEY1发送实验开始信号,经按键消抖滤波后产生驱动器的伺服使能信号,并实现编码器计数清零和轨迹指令复位。各轴编码器读数经差分、累加、比例转换等处理得到以mm和mm/s为单位表示的位置和速度反馈信号。转矩指令经过钳制处理后由模拟量输出模块发送到电动机驱动器。

3.2 基于代码自动生成的控制程序构建

模型建立后,点击工具栏中的Model Configuration Parameters图标,打开模型参数配置面板,设置代码生成相关的选项:① 在Solver面板中,将 Solver options中type设置为Fixed-step,将Fixed-step size设置为1 ms,与运动控制板的固定控制周期一致;② 在Hardware Implementation面板中,将Device vendor设置为ARM Compatible,Device type设置为ARM Cortex,与运动控制板的MCU一致;③ Code Generation面板中,将System target file设置为ert.tlc,作为系统TLC文件,Language选择C语言,选中Generate code only,点击Generate code按钮,即可启动自动代码生成流程。

复制控制软件工程模板,在MCU开发工具Keil uVision中打开工程。将Simulink自动生成的.C和.h文件加入到工程中。在main()函数入口调用模型初始化函数model_initialize ();在TIM2 的周期中断函数中首先调用模型周期任务函数model_step(),再调用数据采集接口记录X、Y轴的编码器计数,供后续数据分析使用。编译、链接后,生成可执行的控制程序。

3.3 实验验证与测试数据分析

将程序下载到运动控制板,按下按键1启动实验,可看到X、Y轴电动机同时运行,带动工作台实现圆形轨迹的运动。松开按键1后,电动机停止运行。打开PC机的超级终端程序,选择与运动控制卡相连的COM串行通信口,设置通信格式为波特率115 200、无校验、1停止位,然后选择Xmodem协议并按下控制板按键2上传采集的实验数据。在Matlab中,读取上传的实验数据文件,根据X、Y轴编码器读数可计算得到各个时刻各轴的实际位置、跟踪误差以及圆周运动的轮廓误差数据[15]。最终计算出的的双轴联动控制实验的轮廓误差曲线如图5所示。

图5 轮廓误差曲线

4 结 语

采用Matlab/Simulink软件及自主设计的运动控制板和直角坐标运动机构,构建了基于模型的设计的运动控制实验环境。开发了支持自动代码生成的运动控制板Simulink模块库,含有AD、DA、编码器、通用输入、通用输出等模块。实验应用结果表明,基于模型的设计具有建模直观、简便、灵活、可靠等优点,使运动控制理论与实验无缝连接,能够快速构建起实验控制系统,有利于激发学生的学习兴趣,培养工程实践和创新能力。

猜你喜欢

代码生成控制板调用
Lustre语言可信代码生成器研究进展
核电项目物项调用管理的应用研究
一种基于模型和模板融合的自动代码生成方法
轨道交通AFC导向标识控制板设计
LabWindows/CVI下基于ActiveX技术的Excel调用
基于系统调用的恶意软件检测技术研究
代码生成技术在软件开发中的应用
一种机载SAR中心控制板的设计
基于XML的代码自动生成工具
DX-600发射机FCOG6100控制板的原理与应用