孙哲伦,王新春
(内蒙古科技大学 信息工程学院,内蒙古 包头 014010)
由于现代工业技术的快速发展,产品的升级迭代日新月异。 近几十年来,随着对控制冗余度和安全性的要求越来越高,产品的控制编码数量也越来越多,如现代汽车、航天飞机、航天飞船等,编码数量在100万行以上。 如今,越来越多的人在购买汽车时更加关注:(1)智能网络功能,如自动驾驶、智能操作系统、感知融合和人工智能交互、大数据操作和汽车空中技术能力;(2)汽车核心系统,包括内部动力系统、电气和电子架构等。 这些都需要代码。
随着代码量的迅速扩大,传统手工开发模式的缺陷非常明显,面临着产品开发周期被迫延长、研发投入多、产品可靠性难以保证等诸多难以克服的困难,产品开发和测试已经很难适应当前社会的要求。 目前,控制器的研发速度,在航空航天、汽车等领域,正变得越来越快。 而传统的开发过程存在许多缺陷,例如:在功能需求分析阶段引入的错误通常会在最后的测试阶段发现,从而导致开发过程严重受阻甚至被推后。 作为项目开发常用到的单片机,DSP 系列芯片具有强大的数字处理运算能力,可以将复杂的信号处理算法应用至实时的信号处理中,在电力电子、电机控制等领域得到了非常广泛的应用[1]。 但是随着DSP的不断更新换代,代码越来越复杂,利用DSP 进行开发时需要对DSP 硬件性能和各种端口及外设有足够的了解,开发门槛高,这样很不利于系统的快速开发[2],因此一种更加便捷快速的代码开发方式被迫切需要。
代码生成技术是指使用特定的软件(MATLAB)或者软件中的工具箱,建立目标代码的仿真模型,并根据所需的目标配置自动生成嵌入式系统应用程序的现代化技术。 在当时提出这一概念时,它被认为是智能设计和建模领域的一项发明,受到了工业界和学术界研究人员的关注和应用。
与传统的设计方法相比,MBD 的各个过程是集成在一起的。 开发人员可以专注于算法和测试用例的建模。 利用Embedded CoderTM 可自动生成控制器代码,减少人工编程的人力、物力和时间,已成功应用于大型项目的开发。 世界上很多公司都开发了MATLAB 中 支 持 MBD 的 模 块 库[3], 如 Texas Instruments, dSPACE, Quanser, TRlab 等。 本 文 以MATLAB/Simulink 为工具,实现了基于代码自动生成技术的DSP 步进电机控制实验。
应用代码生成技术不需要逐句、逐行地编写模型仿真所需要的代码,并较容易进行相应的调试。 与传统设计方法相比,该技术明显具有开发周期短、费用低、效率高等特点[4]。
模型搭建过程:首先打开MATLAB R2021a 软件,在软件命令行中键入Simulink 并回车,建立一个Blank Model,这就完成了模型文件的建立工作。 接下来在Simulink 菜单栏下点击Library Browser 打开模型库文件,将C2803x 系列的工具模块添加到模型文件中,在模块库文件中依次将下文模块添加到模型文件中,并最终生成代码进行实物验证。
模型所需模块:
Constant 模块:生成实数常量值。
PWM 模块:产生PWM 波,并进行波形调制和计数中断。
SCI 模块:串口通信,进行信号的发送与接收,可进行中断接收发送的配置。
Stateflow 状态机:设置步进电机运行时不同的状态,并进行变换,来完成电机的运行。
Buffer 模块:数组初始化,存取数据,遵循先进先出原则。
GPIO 模块:控制DSP 硬件IO 口的工作模式及对应输出模式时对应的高低电平。
Interrupt 中断模块:设置对应的CPU 中断组和PIE 中断组。
本文采用PWM 中断,通过ePWM 模块的时基模块确定周期频率来设置中断时间,定时触发PWM 中断,执行一次中断任务,即完成一次步进电机状态的切换。
模型搭建步骤:
(1)首先打开MATLAB 中的Simulink 功能,在主页面中选择Library Browser 模块。
(2)选择Embedded Coder Support Package,打开C280x 系列模块并选择ePWM 模块添加进模型中,双击打开之后在General 的Timer period 输入1 000,并能运行ePWMA。
(3)在Scheduling 中选择C28x Hardware Interrupt模块,根据Mathwork 公司设计的模块中断向量表说明书,选择CPU 中断号为3,PIE 中断号为1,设置为EPWMA 中断触发机制,即中断触发后,模块输出使能信号,将子系统模块设置为Function-Call 模块触发后执行子系统。 配置界面如图1 所示。
图1 PWM 定时中断模型
步进电机是一种将电脉冲转换成相应角位移或线位移的电磁机械装置。 它具有快速启、停能力,在电机的负荷不超过它能提供的动态转矩时,可以通过输入脉冲来控制它在一瞬间的启动或停止[5]。 步进电机具有4 条励磁信号线,通过控制4 条信号线上的励磁脉冲产生的时刻,可以控制步进电机的转动。 步进电机的励磁方式分为全步励磁和半步励磁这两种方式。 其中,全步励磁又有一相励磁和二相励磁之分,半步励磁又称一二相励磁。 假设每旋转一圈需要200 个脉冲信号来励磁,可以计算出每个励磁信号能使步进电动机前进 1.8°。
搭建步进电机运行子系统模块,选择chart 添加状态机并打开Embedded Coder Support Package,选中C280x 系列模块并选择Digital Output 模块,双击打开后勾选出对应IO 口,需要注意的是,当引脚设置为输出时,就不能再作为数字输入口,外设功能必须禁止。另外,为了控制电机正反转需要选择Digital Input 模块,对应硬件电路上的按键,以此来控制电机正反转运行。 搭建模型的过程中主要使用的是Stateflow 功能。 Stateflow 是一种基于图的实现方法,以图模型为基础,建立分层的、并发的、多任务的、基于事件的、基于过程的、基于时间序列的、动态的、可扩展性的、可迁移的以及可重构的多任务状态。 Stateflow 建立模型主要包含6 个部分,分别是状态(对系统模式的描述,将一个操作模式表示为一种状态);迁移(每一次迁移表示一次状态的转换);事件(指触发的发生);数据对象(用来存储在图表中使用到的数值,可以通过Model Explorer 添加数据,此时使用者可以查看修改图表中的数据对象);节点(用单个迁移表达多个可能发生的迁移);消息对象(可携带数据的排队对象)。
本文最重要的就是利用Stateflow 中的状态图来配置状态机,而在状态图中,使用层次结构的目的就是要利用层次来将有关的对象进行组合,从而形成一个族群,将一些通用的迁移路径或动作合并成一个迁移动作。 如果能够恰当地使用层次,就能够极大地减少代码的体积,从而提升程序执行的效率。
Stateflow 状态机主要设计两个状态图CW 与CCW,分别代表步进电机的正转与反转,添加时需要打开Explorer Bar 中的state 模块选中框,在Name 栏输入CW,同时在CW 状态图表中添加子状态,即A、AB、B、BC、C、CD、D、DA 八种子状态,完成一次内循环,即实现步进电机的一次转动,如图2 所示。 初始为非激活状态,事件驱动使其激活,因此子状态的配置需要设置为en 使能,即让状态从非激活状态变为激活状态,激活时执行子状态中的程序内容,需要对数值对象进行赋值,右键打开Explorer,选择add,添加data,添加5 个data,分别为A、B、C、D、Direction 5个数值对象,将Scop 分别设置为Input 和Output,代表输入与输出。 A、B、C、D 设置为输出模式,对应外设的输出IO 口,将DataType 设置为boolean 格式,注意数据的匹配,将Direction 设置为Input 模式,通过IO 给定电平控制,对应DSP 编程时对IO 输入模式的配置。 步进电机正转运行时Direction=0,A、B、C、D 4个数值对象对应的值分别是1000-1100-0100-0110-0010-0011-0001-1001,反转时Direction=1,将其反序迁移即可。
图2 Stateflow 控制步进电机运行
步进电机运行的数据通过串口通信发送至上位机,上位机通过数据监控运行。 开环传输数据会导致数据的乱码及错误,所以为了数据的稳定传输,需要串口通信的协议。 协议包括帧头、帧尾以及数据长度来验证数据的准确性。 本文直接使用Embedded Coder Support Package for Texas Instruments C2000 Processors 中的C2803x 芯片的串口模块进行通信配置,为了链接板间通信,设置波特率为115 200,停止位设置为1,Tx 和Rx 分别对应DSP28035 的GPIO28和GPIO29。 数据格式如图3 所示。
图3 自定义串口通信协议模型
在工具栏点击MODLING 并选择Model Settings,在Hardware Implementat-ion 界面选择TI Piccolo F2803x 芯片板,将Code Generation system target file 设置为ert.tlc 文件,并将Target hardware resources 中的Build options 选为Build 模式,这样就可以生成项目所需的程序文件,完成Target hardware resources 的配置。 Code Generation 界面需勾选Report 选项中的3个状态框,同时为了增加代码可读性需要在code generation objectives 中添加Execution efficiency,ROM efficiency,RAM efficiency,完成配置后,在APPS 界面选择Embedded Coder,在新出现的C CODE 界面中点击Build,以上建模及目标环境配置完成后,在模型工具栏中找到编译工具点击编辑模型,即可生成.out 执行文件,之后会出现代码生成窗口,如图4 所示,生成的项目文件需要在CCS 软件中配置并编译下载。
图4 代码生成报告
硬件测试时,首先需要对步进电机的驱动电路进行介绍,步进电机的驱动电路如图5 所示。
图5 步进电机驱动电路
本文使用的步进电机采用五线四相制进行驱动,该电动机的转子是一个永久磁铁,在其定子线圈中,在其线圈中形成一个相应的向量场。 由于同极性和互斥性,这种磁场将使转子转动一定的角度,从而使成对的转子场和定子场在同一方向上。 当定子产生的向量场旋转角发生改变时,转子角会随之改变。 因此,每次电脉冲的输入,马达都会旋转一次,向前移动一次。 步进电机驱动电路通过ULN2003 芯片将输入与输出隔离开来,ULN2003 芯片具有高耐压的特性,由7 个NPN 管组成,工作电压高,工作电流大,最多可以承受50 V 的关断电压。本文中使用ULN2003 驱动芯片的主要原因是它能够为DSP28035 芯片提供大电流来驱动步进电机运行。 同时,单片机引脚输出电压为3.3 V,选用此芯片可以将驱动电压升至5 V~12 V,增加DSP28035 的驱动能力。
在线验证时,链接好串口线并将程序以Flash 方式下载到DSP28035 中,在CCS 软件中完成对项目文件的下载配置后,步进电机开始运行,同时上位机接收来自DSP28035 芯片发送的串口信号。
去除帧头0x55 、0xAA,数据长度0x04 以及帧尾的0x0D、0x0A 数据后,4 个IO 口数据与步进电机运行时所对应时序数据一致,如图6 所示。 这说明自动生成的代码完全实现了在代码模型中设计的各项功能。 通过示波器观察步进电机的运行过程,运行时单个IO 口的输出频率为121 Hz,满足设计要求,成功控制电机进行正反转操作,验证步进电机实验成功。
图6 串口接收信号
本文提出了一种基于 Simulink 的 DSP建模和基于 Simulink 的 C 语言编程的快速编程方法,简化了 DSP 的编程过程。 该程序产生的DSP 代码具有良好的控制效果且开发时间成本低,具有很大的发展潜力。 该系统避免了 DSP 程序编写和调试等烦琐的程序,降低了错误率,从而大大降低了软件开发者的工作量。 研究和运用这种开发方式,对于大多数 DSP 的应用开发者来说,有重要的实际意义和实用价值。