嵌入式实时半实物仿真平台Sukung¶
前言¶
Sukung是由华侨大学先进控制实验室研发的一类嵌入式实时半实物仿真平台。它由聂卓赟副教授指导,李兆洋(研究生)主导研发,程前(研究生)完善维护,可用于自动化、控制科学与工程及相关专业学科的理论实践教学、专业实验教学、课程设计、毕设科创等教学实践环节,也可用于科学研究、机器人原型系统设计、工业系统算法测试等应用场景。
Sukung课题组选用MATLAB/Simulink作为仿真平台、STM32作为嵌入式目标机,研制了simulink和目标机之间各类资源调用的实时接口。Sukung拥有丰富的外设资源,包括:常用通信接口(USART,I2C,SPI,CAN),常用IO/计数模块(DAC,ADC,ADC_Ex,GPIO,TIM,PWM,计数器)和专用外设接口(MPU6050,电子罗盘GY271,超声波传感器,显示屏TFT-LCD)等,能够帮助用户快速地开展“实时数据采集与传输”、“快速控制原型”、“硬件在环”和“在线监督优化”等实验。
![]()
软件获取与咨询¶
当前软件版本:Sukung V1.0,有线下载,有线数据传输。1.4 快速开始 Sukung。
软件下载:github
淘宝网址: 淘宝网址
定制与合作请联系: yezhuyun@sukung.cn;
技术问题可入群交流:
Sukung半实物仿真技术交流,QQ群:661419695;
欢迎关注微信公众号【Sukung】,相关信息将通过公众号进行推送。
1.什么是Sukung¶
1.1 特色¶
Sukung研发的初衷,是希望能够将目标机的C/C++编程映射为MATLAB/Simulink的图形化编程,统一的图形化编程语言能够转化为规范的C/C++代码,避免科研人员重复性、不规范编程所引起的各种问题,让本科生、研究生或研发人员更加专注于控制算法设计、系统功能开发。
1.1.1 嵌入式¶
嵌入式半实物仿真平台是一种典型的“主从双机”方案,便携、易扩展、低成本、实时性高、多应用场景,符合快速控制原型的半实物仿真思想,可节省产品研发时间和部署成本。Sukung选择了意法半导体公司的STM32系列微处理器作为目标机的处理器核心。
1.1.2 易用性¶
即插即用,支持一键代码生成、编译、下载。在Simulink外部模式下,进行实时控制与数据监控,具有实时数据回传、记录和观测,以及实时参数修改和下发功能,包含有线/无线两种模式。
1.1.3 通用性¶
在丰富的外设接口/通信接口下,Sukung适用于各类自动控制实验对象,例如,倒立摆、直流电机/舵机/步进电机、平衡车、飞行器、板球系统、杆球系统、磁悬浮系统等。
1.1.4 实时性¶
通过底层代码优化、通信-控制优化、外部模式优化、资源调度优化、代码部署优化等方案,确保了控制系统的实时性。
1.1.5 拓展性¶
嵌入式微处理器的外设接口非常丰富且可扩展。很多基于UART/USART、CAN、LIN、I2C、SPI及SDIO等通用协议的廉价传感器模块,均可直接应用在嵌入式微处理器方案中,扩展快速且便捷。同时,开发了Simulink下各类外设接口和通信接口。
1.2 技术架构¶
Sukung系统的技术架构如下图所示。

1.2.1 面向STM32的定制驱动¶
定制驱动层是资源实时调度方案中为提高环境模型执行实时性而提出的解决方案。定制驱动层不仅在寄存器层面优化了片内外设的调用逻辑,提高了片内外设的调用协同性和效率,同时还对HAL和LL开源驱动库保持了高度的兼容性,以便能够快速部署现有代码。
1.2.2 Simulink模块定制¶
1.2.3 代码生成部署¶
代码生成部署技术是将宿主机中Simulink可视化系统模型转换为目标机可运行代码的关键技术,该技术涉及代码生成、优化、编译、连接、下载等多个过程。
1.2.4 外部模式及改进¶
目标机与宿主机之间的相互通讯依赖于外部模式。外部模式作为宿主机和目标机之间的通信信道,通过调用双方的传输层接口实现物理对接。外部模式作为通讯部分的载体主要用于完成目标机状态控制、信号触发判断、信号数据记录及信号数据回传等任务。这些任务在嵌入式目标机的运行过程中占据了很大的比重,耗时较长且内存占用大,极易造成通讯的非实时,导致控制与通讯任务相互耦合。在Sukung研发中着重对外部模式的实时性进行了改进。
1.2.5 基于ISP的程序下载¶
提供一种基于ISP的一键式程序下载,简便易用。分为串口下载与无线下载两种模式。在 5.1点亮一个LED灯:Simulink环境配置与编译下载 中介绍使用方式。
1.2.6 嵌入式目标机¶
目标机是运行嵌入式软件的硬件平台,Sukung系统选用的目标机为STM32F103ZET6(基础型,144引脚,512K闪存,QFP封装),性能稳定,功能丰富。定制驱动主要面向该类目标机进行研发。
1.2.7 定制实时通信模块¶
宿主机通过目标机及时获取传感器数据或者目标机系统模型中信号采样点的数据,同时宿主机也可以及时向目标机下发控制命令。目前主要分为有线和无线两种通信方式。有线传输采用串口通信,通过宿主机的外部模式实现与目标机的实时通信;无线传输则采用WiFi通信,通过TCP/IP协议,实现宿主机和目标机之间的通信。
1.3 效果展示¶
1.4 快速开始¶
首先,到 6.1 软件下载 获取软件,并根据 2.1硬件平台 和 2.2软件平台 进行 2.3 软件安装与注册 和 2.5 Sukung的工程配置。用户可以根据给出的 5. 案例 进行系统搭建;主要的定制资源使用方法可在 4. Sukung定制驱动模块库介绍 中进行查询。同时,在调试中发现的各类问题将在 6.2 常见问题 进行了汇总和更新,鼓励用户反馈问题,共同完善Sukung实验平台,并在 6.6 贡献与致谢 中鸣谢。
1.5 注册与费用¶
目前提供的Sukung仿真系统为软件版,即有线下载和有线数据传输方式,如下图所示。推广期间,可申请免费试用3周。Sukung软件安装采用机器码注册+在线激活方式使用。相关资费信息见 淘宝网址 。
用户注册使用方法如下图所示:
1.打开MATLAB获取机器码,可参考 5.1点亮一个LED灯:Simulink环境配置与编译下载 ;
2.通过淘宝提交机器码与注册信息;
3.使用过程需要打开MATLAB与服务器进行联网验证(自动进行) ;
4.验证成功可正常使用。
![]()
![]()
2.平台配置¶
2.1硬件平台¶
2.1.1 计算机¶
装有操作系统的计算机,在本实验平台中作为宿主机。主要承担两个方面的作用:提供软件运行环境,负责对象建模、算法设计、控制系统仿真、代码生成部署等功能;作为宿主机,负责实验系统的数据监控、记录、参数调节、实时通信等任务。
为保证所有软件能够顺畅运行,计算机需要满足如下基本配置要求:
系统:Windows 7/64位或Windows 10/64 位;
处理器:英特尔 I3/I5/I7, AMD CPU;
内存:推荐8G 及以上内存;
硬盘:推荐固态硬盘;
接口:至少有一个 USB Type A 接口(有线程序下载和数据传输);
显示器;
网络连接:用于注册有效验证;
无线网卡:用于无线程序下载和数据传输(无线版Sukung);
注解
为了获取更高的开发效率,计算机的性能应适当高配,基本要求是能正常运行Matlab2018b。
2.1.2 嵌入式目标机:STM32F103ZET6¶
嵌入式目标机是MATLAB/Simulink生成代码运行的载体。目标机的性能和外设接口能力,赋予了Sukung实验系统的拓展空间。Sukung的目标机选用STM32F103ZET6型单片机。下图给出了这类常用单片机的硬件资源,详见 博客 。
![]()
2.1.3 定制无线通信模块¶
将设计一款专用的无线通信模块,实现Sukung的无线程序下载与无线数据传输。
2.2软件平台¶
2.2.1 MATLAB /Simulink¶
MATLAB/Simulink是Mathworks 公司的一类可视化仿真软件,可方便的通过模块化编程搭建动态系统,用于系统建模、控制、优化等仿真功能,被广泛应用于自动化及相关专业本科与研究生的教学和科研。Sukung软件包支持MATLAB R2018b 版(推荐使用),主要依赖的 MATLAB 工具箱包括:
MATLAB/Simulink
MATLAB Coder
Simulink Coder
Embedded Coder
警告
Sukung系统不提供 MATLAB及相关工具箱的安装包与安装流程,请用户自行购买。
2.2.2 Keil V5及以上版本¶
Keil公司推出Keil MDK v5使用uVision5 IDE集成开发环境,是针对ARM微控制器的一款集成开发工具。选用了最新发行的Arm Compiler V6编译器(下文将简称为AC6),版本号为AC6.12。该编译器可以大幅提升系统模型的编译速度。
警告
Sukung系统不提供 Keil 及相关工具箱的安装包与安装流程,请读者自行购买。
2.3 软件安装与注册¶
此节将向用户介绍如何安装、配置以及注册Sukung,以使得用户可以正常使用Sukung完成各项工作。安装视频见B站: Sukung安装教程
步骤1:软件安装¶
安装MATLAB/Simulink(推荐2018b或以上版本)。安装路径示例:
C:\SoftwareProgram\MATLAB
;
安装Keil V5 (mdk 5.2.3)。安装路径示例:
C:\SoftwareProgram\Keil
;
安装Sukung软件:双击运行
Sukung.exe
,安装路径示例:C:\SoftwareProgram\Sukung
。
警告
上述软件的安装路径中不可包含空格、.
等MATLAB所认为的文件或文件名的非法命名方式。例:C:\Software Program\Sukung
。具体参照博客。
步骤2:环境变量及路径配置(环境变量)¶
上述软件安装完成之后,进行MATLAB和Sukung根目录的环境变量配置,以及对应库文件、可执行文件、编译器和下载程序的路径配置。
新建 系统变量
MATLAB_ROOT
:根据先前MATLAB的安装路径,设定该变量值为C:\SoftwareProgram\MATLAB
;
新建 系统变量
SUKUNG_ROOT
:根据先前Sukung的安装路径,设定该变量值为C:\SoftwareProgram\Sukung
;
编辑
Path
环境变量,新建 以下四个变量值,即定位到MATLAB、Keil和Sukung软件安装路径的下述文件夹,完成对可执行文件、编译器、库文件和下载程序的路径配置:
C:\SoftwareProgram\MATLAB\bin\win64
C:\SoftwareProgram\Keil\ARM\ARMCLANG\bin
C:\SoftwareProgram\Sukung\lib
C:\SoftwareProgram\Sukung\script\download
完成上述过程后,环境变量界面应当如下所示:
除了对环境变量配置,还需设置MATLAB对Sukung的文件路径包含。在MATLAB主界面,打开
设置路径
子界面,点击添加并包含子文件夹
,包含Sukung软件的安装路径,即此次示例中的C:\\SoftwareProgram\Sukung
,具体见下图。
步骤3:MATLAB MEX编译器安装¶
2.4 安装完成效果¶
2.5 Sukung的工程配置¶
在本节,将会帮助大家了解如何对一个Simulink工程进行Sukung环境配置,主要分为以下几个步骤。
步骤1:系统目标文件(TLC)选择与一键式参数配置¶
新建Simulink工程
LED.slx
;
点击齿轮样式的
Model Configuration Parameters
,进入工程的参数配置界面。点击Code Generation
这一菜单。
点击
Browse..
,等待数秒,在弹出的System Target File Browser
窗口中,找到Sukung.tlc
的Embedded Target
类型,选择,确认。如下图所示。执行完上述步骤,即会出现下图所示的现象:
展开
Code Generation
菜单栏,点击Sukung Options
,再点击Sukung recommended parameters
,即完成Sukung参数一键式配置。
警告
若 Language
栏未出现 C++
,则可使用我们提供的空模板文件,无需此步骤的环境配置,直接进行模型搭建即可使用。
步骤2:实时传输层配置¶
若上述步骤配置得当,则
Code Generation
下的Interface
子菜单栏,会出现下图所示的External model configuration
界面。此配置是对PC与目标机之间的传输介质以及相关参数的设置,本版本默认只提供
serial
有线的实时传输方式(目标机在Sukung环境中运行时的数据传输方式)。MEX-file arguments
的参数具体意义如下:
0
:日志输出等级,用户不需修改;
5
:对应目标机设备连接的COM5端口,用户使用时,需先将目标机与PC通过USB线连接,再查看PC上目标机的对应端口,对应作修改,查看方式见博客;
1200000
:串口传输的波特率,最高可填2000000,若传输数据(示波器数量、Toworkspace模块)过多,则需降低波特率,以保证数据及时处理;相应的数据较少,可适当增加波特率;
10
:等待时间,单位(s),PC发出EXT_CONNECT
指令,等待目标机响应,超过等待时间则报错,需检查通讯是否正确与正常,再次连接。
步骤3:步长(Sample Time)和Solver配置¶
完成上述Sukung相关配置后,还需对Simulink的相关工程参数进行配置。由于步长与ode的选择会影响传输的数据量和目标机的运行效率,所以我们在此说明。
经参数一键配置,Solver默认采用
ode1
,步长默认0.01
,针对Sukung的使用,有如下建议:
Solver
:搭建的Simulink算法复杂度过高,则建议ode,甚至采用discrete
方式(需采用离散形式搭建算法);若算法复杂度较低,建议使用ode3
或者auto
,以确保算法经代码生成的精确性;
步长(Sample Time)
:推荐使用0.005,较低的步长设置对目标机的程序运算能力,以及传输实时性有较高要求,所以需综合考虑进行设置,以确保目标机正常运行。
步骤4:数据接收与存储配置¶
在实时半实物仿真过程中,数据接收与存储是不可或缺的。Sukung通过对Simulink的外部模式数据结构及传输层接口优化,实现了几乎无存储限制的
Scope
、Toworkspace
等Sinks
类模块的数据接收与存储功能。在使用此功能前,我们需对此功能进行配置。回到
LED.slx
的Simulink主界面,我们点击Code
菜单栏,打开External Mode Control Panel
,会出现下图窗口:
信号使能设置:点击
Signal & Triggering…
,则出现下图所示窗口。我们可以在此窗口使能各个Scope
模块的数据接收功能。并设置信号使能设置
参数,对要存储的参数进行分段存储,如果存储的数据超过信号使能设置
,则自动将下一部分数据存储到下一个文件中。一般推荐将信号使能设置
设置尽量大,以方便对数据进行处理。
数据存储设置:点击
Data Archiving…
,则出现如下图所示窗口。通过此窗口设置,可以将工程获取的数据以Data.mat
存储到C:\Project
路径下,在此必须勾选Enable archiving
。每次运行都会生成Data.mat
,并且尾缀序号。至此,通过上述步骤的设置,我们可以正式开始一个工程 5.1点亮一个LED灯:Simulink环境配置与编译下载。
3. 平台使用¶
3.1使用模式¶
3.1.1 实时数据采集与传输¶
3.1.2 快速控制原型(Rapid Control Prototyping,RCP)¶
3.1.3 硬件在环(Hardware in the loop,HIL)¶
3.1.4 中继与监督优化模式¶
3.2 Sukung模块设置¶
3.3抗扰控制器¶
3.3.1 线性自抗扰控制¶
线性自抗扰控制(Active disturbance rejection control, ADRC),是一类经典的主动抗扰控制方法[1]。在串联积分标准型与总扰动的系统描述下,控制器的设计简化为扩张状态观测器的带宽设计和反馈控制器带宽设计,以及增益参数设计。详细资料及介绍见B站和自抗扰控制QQ群(128464029(入门),914841616(学术)。
![]()
针对典型二阶对象,自抗扰控制器表示为:
\[{u{\rm{ = }}\frac{{Kr + Fz}}{{{b_0}}}}\]其中
\[\begin{split}\left\{ \begin{array}{l} K{\rm{ = }}F_2^{} = \left[ {\omega _c^2} \right]\\ F{\rm{ = }} - \left[ {F_2^*,F_1^*,F_0^*} \right] = - \left[ {\omega _c^2,2{\omega _c},1} \right] \end{array} \right.\end{split}\]\[\begin{split}ESO:\left\{ \begin{array}{l} \dot z = \left[ {\begin{array}{*{20}{c}} 0&1&0\\ 0&0&1\\ 0&0&0 \end{array}} \right]z + \left[ {\begin{array}{*{20}{c}} 0\\ {{b_0}}\\ 0 \end{array}} \right]u + \left[ {\begin{array}{*{20}{c}} {3{\omega _o}}\\ {3\omega _o^2}\\ {\omega _o^3} \end{array}} \right](y - {y_z}),\\ {y_z} = \left[ {\begin{array}{*{20}{c}} 1&0&0 \end{array}} \right]z, \end{array} \right.\end{split}\]以LADRC为基准控制器,文献[2]设计了K和F的“定量自适应”调节,能在有限ESO带宽下提升抗扰性能。
[1] Gao Z. Scaling and Parameterization Based Controller Tuning[C]// American Control Conference. IEEE, 2003:4989-4996.
[2] Nie Zhuoyun, Zhang Bing, Wang Qing-Guo, Liu Rui-Juan, Luo Ji-Liang. Adaptive active disturbance rejection control guaranteeing uniformly ultimate boundedness and simplicity. International Journal of Robust and Nonlinear Control, 2020, 30(17): 7278-7294.
3.3.2 抗扰PID控制器¶
得益于ADRC中的带宽化调节方法,DR-PID参数调节非常简单,且物理含义明确。其基本公式为
\[C_{PID}^{DR}(s) = {K_P}\left( {1 + \frac{{{\omega _c}}}{{\alpha + 1}}\frac{{\rm{1}}}{s}{\rm{ + }}\frac{\alpha }{{(\alpha + 1){\omega _c}}}s} \right)\]其中
\(\omega _c\) 为期望闭环带宽,决定闭环响应速度。由被控对象快买特性决定。期望闭环模型为 \(\frac{{{\omega _c}}}{{s + {\omega _c}}}\) 。
\(K_P\) 为控制器增益,相同条件下,逐步增大 \(K_P\) 可改善系统的抗扰性能和跟踪性能。
\(\alpha\) 代表相位超前补偿。\(\alpha = 0\) 即为PI控制器,\(\alpha = 1\) 即等效经典的ZN-PID。一般来看,\(\alpha\) 可在1附近进行微调。
几点说明:
调参顺序为,先设定 \(\omega _c\) 即闭环目标,然后调节 \(K_P\) 和 \(\alpha\) ,即实现目标的手段。
如果系统存在超调,可在输入端加入滤波器 \({F_r}(s)\) 。
DR-PID适用于机电系统、一阶时滞系统、积分型(液位)系统、最小/非最小相位系统等各类常见工业对象。PID控制器的抗扰原理及相关技术资料详见博客。
在DR-PID下,各个参数物理含义与控制性能建立起了直接关联,有望在DR-PID下建立“白箱”自适应调节与在线优化,同时实现与上层MPC的高效对接,为工业系统APC提供一种实现途径。
4. Sukung定制驱动模块库介绍¶
在安装完成Sukung后,用户会在Simulink Library Browse中看到Sukung定制驱动模块库,如下图所式。这些定制驱动模块包括
AD
(模数转换模块)、DA
(数模转换模块)、Counter
(编码器模块)、Display
(液晶屏模块)、I2C
(I2C通讯模块)、IO
(输入输出模块)、PWM
(PWM模块)、Sensor
(传感器模块)等。通过定制驱动模块库,用户可以使用目标机的外设资源,快速搭建基于Sukung目标环境的系统模型,有效降低半实物仿真平台Sukung的使用门槛。接下来将分别对Sukung各模块进行介绍,让用户了解如何使用Sukung模块。我们也基于上述模块,制作了各种控制案例,详情参见 5. 案例
![]()
4.1 通讯模块¶
STM32单片机(目标机)常用通讯协议包括:USART/UART、I2C、SPI和CAN等,我们也定制了对应的驱动模块,使得用户可以通过模块使用目标机上的上述通讯接口,实现与其它设备进行通讯,或者接收传感器数据等功能,具有简便、通用的优点。
4.1.1 USART¶
此模块包括两个子模块:
USART_Read
模块和USART_Write
模块。此节介绍两模块的参数配置要点,使得用户能够利用此模块实现目标机与外部设备之间的串口通讯。
USART_Read模块
通过
USART_Read
模块,目标机可以通过配置的串口读取外部设备的数据信息,实现串口读功能。为了实现功能,用户需要做如下参数的设置:
USART/UART Index
:选择所要使用的串口号,范围1~5,4~5对应的是UART4
和UART5
;
Baudrate
:串口波特率,单位(bps),最高可设置为2000000,推荐1200000或以下;
Buffer Length
:接收缓冲区长度,这个值必须是32的倍数,推荐1440;
Buffer Count
:接受缓冲区个数,必须大于等于2,推荐为4;
Is Need Pin Remap
:引脚重映射使能,填写0 或者1;
Pin Remap Index
:重映射索引,参考下述所示的串口引脚映射图填写;
Sample Time
:采样时间,推荐与系统步长一致。![]()
USART_Write模块
通过
USART_Write
模块,目标机可以通过配置的串口向外部设备发送数据信息,实现串口写功能。为了实现功能,用户需要做如下参数的设置:
USART/UART Index
:选择所要使用的串口号,范围1~5,4~5 对应的是UART4
和UART5
;
Baudrate
:串口波特率,单位(bps),最高可设置为2000000,推荐1200000或以下;
Is Need Pin Remap
:引脚重映射使能,填写0 或者1;
Pin Remap Index
:重映射索引,参考下述所示的串口引脚映射图填写;
Sample Time
:采样时间,推荐与系统步长一致。为了充分利用目标机的外设I/O 资源,我们对USART的引脚做了部分的重映射。在使用过程可以通过设置对应模块参数,使用对应引脚。具体见下图。
![]()
注解
USART在STM32单片机上的工作原理,推荐参考博客。
注解
Simulink接收和发送数据都是以16进制格式,所以外部设备的数据接收和发送都需要进行16 进制的转化。
4.1.2 I2C¶
此模块包括三个子模块:
I2C_WriteBytes
模块、I2C_WriteBytes_Loop
模块和I2C_ReadByte
模块。此节介绍三个模块的参数配置要点,使得用户能够利用此模块实现目标机与外部从机进行I2C通讯。
I2C_WriteBytes模块
通过
I2C_WriteBytes
模块,用户可以将要发送的Command Data
单次发送到从机,一般用于对从机的初始化或者模式配置。
I2C Index
:选择目标机I2C外设,可填1和2,分别表示I2C1
和I2C2
;
I2C Mode
:设置I2C
模式,标准/快速模式;
I2C Fast Mode Duty Cycle
:快速模型下的预分频设置;
I2C SCL Rise Time
:SCL上升时间设置(纳秒),推荐1000;
Is Enable Clock Stretching
:选择是否使用I2C时钟延展,推荐使用;
Is Need I2C1 Pin Remap
:选择是否对I2C1引脚重映射,引脚见下图;
Slave Address
:从机地址,十进制表示;
Command Length
:单次要发送的命令长度,根据CommandData
的长度决定;
Command Data
:单次要发送的数据,十进制表示,要与CommandLength
匹配;
Sample Time
:采样时间,推荐与系统一致。![]()
I2C_WriteBytes_Loop模块
通过
I2C_WriteBytes_Loop
模块,用户可以将WriteData
循环发送到从机,一般用于读从机数据前的寄存器设置。
I2CIndex
:选择目标机I2C外设,可填1和2,分别表示I2C1
和I2C2
;
I2C Mode
:设置I2C
模式,标准/快速模式;
I2C Fast Mode Duty Cycle
:快速模型下的预分频设置;
I2C SCL Rise Time
:SCL上升时间设置(纳秒),推荐1000;
Is Enable Clock Stretching
:选择是否使用I2C时钟延展,推荐使用;
Is Need I2C1 Pin Remap
:选择是否对I2C1引脚重映射,引脚见下图;
Slave Address
:从机地址,十进制表示;
Write Buffer Size
:单次要发送的命令长度,根据Write Data
的长度决定;
Write Data
:单次要发送的数据,十进制表示,要与Write Buffer Size
匹配;
Sample Time
:采样时间,推荐与系统一致。![]()
I2C_ReadBytes模块
通过
I2C_ReadByte
模块,用户可以读取从机的数据,并经输出端输出,内部已进行数据拼接处理。
I2C Index
:选择目标机I2C外设,可填1和2,分别表示I2C1
和I2C2
;
I2C Mode
:设置I2C
模式,标准/快速模式;
I2C Fast Mode Duty Cycle
:快速模型下的预分频设置;
I2C SCL Rise Time
:SCL 上升时间设置(纳秒),推荐1000;
Is Enable Clock Stretching
:选择是否使用I2C时钟延展,推荐使用;
Is Need I2C1 Pin Remap
:选择是否对I2C1
引脚重映射,引脚见下图;
Slave Read Address
:自从机读取数据的地址,十进制表示;
Read Buffer Size
:要读取的数据长度;
Sample Time
:采样时间,推荐与系统一致。Out[i] = (int16)(((uint32)P_y[i] << 8) | (uint32)P_y[i+1]);![]()
我们通过上述模块组合,实现了GY271传感器数据的读取,见案例。I2C引脚图见下方。
![]()
注解
STM32单片机(目标机)上的I2C协议,原理介绍以及使用,推荐博客。
4.1.3 SPI¶
此模块包括两个子模块:
SPI_Write
模块和SPI_Read
模块。此节介绍两模块的参数配置要点,使得用户能够利用此模块实现目标机与外部设备之间的SPI通讯。
SPI_Write模块
通过
SPI_Write
模块,用户可以将要发送的Write_Data
发送到从机,实现通信数据传输。
SPI Index
:选择目标机SPI外设,可填1、2和3,分别表示SPI1
、SPI2
和SPI3
;
Write_Buffer_Size
:单次要发送数据长度,根据Write_Data
的长度决定;
Write_Data
:单次要发送的数据,十进制表示,要与Write_BufferSize
匹配;
Sample_Time
:采样时间,推荐与系统步长一致。![]()
SPI_Read模块
通过
SPI_Read
模块,用户可以读取从机的数据,并经输出端输出,实现数据的读取。
SPI Index
:选择目标机SPI外设,可填1、2和3,分别表示SPI1
、SPI2
和SPI3
;
Baudrate_Prescaler
:波特率预分频系数;
Read_Buffer_Size
:要读取的数据长度;
Sample_Time
:采样时间,推荐与系统步长一致。![]()
注解
用户可根据设备条件自行选择,由于SPI1 和SPI3 引脚存在复用情况,可能会造成引脚冲突,为此,为了保证功能的正常实现,建议用SPI2。
注解
STM32单片机(目标机)上的SPI协议,原理介绍以及使用推荐参考SPI 协议。
4.2 IO/计数模块¶
除了上节介绍的通讯模块,我们还定制了STM32单片机(目标机)的通用输入输出模块、DAC模块、ADC模块、PWM模块和计数器模块等,保证用户使用上述模块完成基于目标机的各类运动控制任务。
4.2.2 ADC_Channel¶
ADC,全称Analog-to-Digital Converter,模/数转换模块,可以实现连续模拟信号到离散数字信号的转换。用户可以采集指定IO引脚上的模拟电压(0-3.3v),以数字量的形式输出(0-4095)。
该模块调用的是STM32F103ZET6 的外设资源ADC1;
可以多个ADC 同时使用,采集不同信号源;
12位逐次逼近型的模拟数字转换器;
ADC工作在连续模式,可多次采样取平均;
INx:设置ADC 采样通道,可选择外设ADC1 的全部通道;
ADC_SAMPLETIME_xCYCLES_5(1-239):为设置ADC 采样周期,x 最小可设置为1,即1.5 个采样周期;最大设置为239,即239.5 个采样周期——采样周期越短,ADC 采集数据越快,最快约为1.17 微秒;
Average_xNum:可选在一个控制周期内的采样次数,并取采样均值输出。0为单次采样并输出,建议均值滤波个数<=8;
Sample Time:设置为与系统控制周期一致。
![]()
![]()
4.2.3 ADC_Ex¶
4.2.4 GPIO¶
此模块包括两个子模块:GPIO_Write模块和GPIO_Read模块,过此模块实现对引脚电平和数据的读和写。GPIO 最简单的功能是输出高低电平,同时GPIO还可以被设置为输入功能,用于读取按键等输入信号。为了实现不同工作条件要求,GPIO 共有8 种工作模式
输入浮空——既不上拉也不下拉,可以做KEY 识别
输入上拉——IO 内部上拉电阻输入
输入下拉——IO 内部下拉电阻输入
模拟输入——应用ADC 模拟输入,或者低功耗下省电
开漏输出——需要外接上拉电阻才能输出高电平
推挽输出——输入值是未知的
推挽复用——片内外设功能(I2C 的SCL,SDA)
开漏复用——片内外设功能(TX1,MOSI,MISO.SCK.SS)
(1) GPIO_Read模块¶
GPIO_Read模式下输入输出功能选择
GPIO_Read 功能选择界面,从上到下分别对应默认输入,输入上拉,输入下拉,输入浮空。其中IT 能够出发中断,EVT 只能设置中断标志位,不产生中断。当选择了IT_RISING(FALLING)时,需要在GPIO_Pull中选择对应的PLULLUP(PULLDOWN),使用INPUT 或者RISING_FALING时使用NOPULL

4.2.5 TIMER¶
定时器主要有计数和定时功能,定时器在STM32上的原理以及使用,推荐博客
TIM Index
:设置选用对应的TIM,可选序号见TIM引脚映射图;
Timing
:定时器定时时间设置,单位为ms;
PinRemap
:引脚重映射索引,参考引脚映射图;
Sample Time
:采样时间,推荐与系统步长一致。![]()
其中,4 个通用定时器的复用功能重映射情况如表格所示:
![]()
4.2.6 PWM¶
PWM
模块包括三个子模块:PWM Generators
模块、BTS7960
模块和TB6612FNG
,都可以产生设定频率和占空比的PWM信号,模块的输入信号为占空比。三个子模块适用于不同的电机驱动模块,用户可根据自己的硬件情况进行选择。
PWM Generators 模块
PWM Generators
模块采用L298N
的电机驱动逻辑,通过双路PWM控制电机的正反转,因此单个模块可以控制两个电机。模块的输入端
L
和R
分别控制两个电机,TIM
的PWM通道ccr1
和ccr2
根据输入端L
的正负值,来决定导通通道,值的大小决定PWM的占空比,从而控制电机的正反转以及转速,R
端也是如此。具体的分析可以参考驱动代码,和L298N的相关资料。uint32 ccr1, ccr2, ccr3, ccr4; if(speedLeft >= 0) { ccr1 = (uint16)speedLeft; cr2 = 0; } else { ccr1 = 0; ccr2 = (uint16)(-speedLeft); } if(speedRight >= 0) { ccr3 = (uint16)speedRight; ccr4 = 0; } else { ccr3 = 0; ccr4 = (uint16)(-speedRight); } TIM_PWM_SetPWM(TIMx, TIM_PWM_CHANNEL_MASK, ccr1, ccr2, ccr3, ccr4);而要实现功能,则需要对以下参数进行配置。
PWM Generator Index
:设置选用对应的TIM,可选序号见TIM引脚映射图;
PWM Frequency
:PWM 信号频率,可根据所使用的电机驱动进行设置;
PWM Pin Remap
:引脚重映射索引,参考TIM引脚映射图;
Sample Time
:采样时间,推荐与系统步长一致。![]()
![]()
BTS7960模块
BTS7960
模块专门为BTS7960驱动所定制。相对于L298N驱动增加了PWM使能引脚设置,通过对使能引脚的高低电平控制,改变驱动通道的通断,即控制电机启停。而通过TIM
的PWM两通道的占空比差值设计,实现电机速度的改变。具体可参考下文所示驱动代码,以及BTS7960的相关资料。if(speed_left == 0) GPIO_WritePin(GPIOxLeft,GPIO_Pin_Left,RESET); else GPIO_WritePin(GPIOxLeft,GPIO_Pin_Left,SET); if(speed_left > 0) ccr1 = limit, ccr2 = limit - speed_left; else ccr2 = limit, ccr1 = limit + speed_left; if(enableSecond == 1) { if(speed_right == 0) GPIO_WritePin(GPIOxRight,GPIO_Pin_Right,RESET); else GPIO_WritePin(GPIOxRight,GPIO_Pin_Right,SET); if(speed_right > 0) ccr3 = limit, ccr4 = limit - speed_right; else ccr4 = limit, ccr3 = limit + speed_right; }为了使用
BTS7960
模块,用户需要对模块进行正确配置,接下来介绍此模块的参数配置:
BTS7960 Tim Index
:设置选用对应的TIM,可选序号见TIM引脚映射图;
BTS7960 Frequency
:PWM 信号频率,可根据需要选取;
Tim Pin Remap
:TIM引脚重映射索引;
Enable Second Channel
:使能驱动的第二个通道,即是否使用R
输入,若不使用则填入0
,则不对R
使能引脚进行初始化以及使用,节约引脚资源;
BTS7960 Left Enable Port
:驱动模块L
端的使能端口设置;
BTS7960 Left Enable Pin
:驱动模块L
端的使能引脚设置;
BTS7960 Right Enable Port
:驱动模块R
端的使能端口设置;
BTS7960 Right Enable Pin
:驱动模块R
端的使能引脚设置;
Sample Time
:采样时间,推荐与系统步长一致。![]()
TB6612FNG模块
TB6612FNG
模块是专门为TB6612FNG驱动所定制。此驱动相较于上述两种驱动,其可以驱动四个电机。对于TIM的四路PWM通道(ccr1,ccr2,ccr3,ccr4)对应四个电机,单个通道的占空比由模块输入量的绝对值决定,而电机的正反转由模块配置的两个引脚的高低电平变化决定。具体分析可参考TB6612FNG的相关资料。接下来对模块参数的配置进行介绍:
TB6612FNG Tim Index
:设置选用对应的TIM,可选序号见TIM引脚映射图;
TB6612FNG Frequency
:PWM 信号频率,可根据需要选取;
Tim Pin Remap
:TIM引脚重映射索引;
TB6612FNG Number
:使能驱动的通道数量,若填入2
,则只使用ccr1
和ccr2
,不对剩下的通道所需的正反转使能引脚(Second A1N1和A1N2,B1N1和B1N2)进行初始化和使用,节省引脚资源。(剩下的参数不再介绍,同上)![]()
注解
关于利用STM32产生PWM信号,推荐参考博客。
注解
PWM
模块只使用了TIM1 和TIM8 的4 个通道,对于其它的3 个PWM 互补通道,暂未使用,后续版本补充。
4.3 定制板载模块¶
为了便于用户可以基于Sukung开发丰富的系统模型,我们定制了较为丰富的板载模块,包括:Sensor
(传感器)模块和 Display
(显示屏)模块。用户可以通过简单的参数配置,获取丰富有效的数据。
4.3.1 Sensor¶
Sensor
模块现包含三种子模块: MPU6050
模块、 GY271
模块和 Ultrasonic
(超声波)模块。通过这三种传感器模块,用户可以获取被控对象的姿态、温度和距离数据,从而实现更复杂的控制系统设计。
(1) MPU6050模块¶
通过此MPU6050模块可以获得被控对象的3 轴加速度计输出、3轴陀螺仪输出和温度输出。
MPU6050 是一种6轴空间运动传感器芯片,集成了3轴MEMS陀螺仪和3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用I2C接口与目标机通讯,其它原理介绍参考博客。通过相关姿态解算与融合可以得到被控对象的姿态信息。关于姿态解算与融合,推荐参考全权编写的《多旋翼飞行器设计与控制》。
为了使用此模块,用户需要对其进行参数配置。而考虑资源使用问题,设计使能数据获取通道:
Is Use Accel XY
:使能加速度计X轴和Y轴的数据通道;
Is Use Accel Z
:使能加速度计Z轴的数据通道;
Is Use Gryo XY
:使能陀螺仪X轴和Y轴的数据通道;
Is Use Gryo Z
:使能陀螺仪Z轴的数据通道;
Is Use Temp
:使能温度测量通道;
Sample Time
:采样时间.![]()
如上图的MPU6050模块,对应加速度计和、陀螺仪和温度传感器的输出。在定制模块时,已对MPU6050的属性进行了设置。
MPU6050(I2C_TypeDef* I2Cx = I2C1, uint8 ownAddress = 0xD0, /*使用I2C1*/ MPU6050_GyroScaleTypeDef gyroScale = MPU6050_GYRO_SCALE_250DPS, /*陀螺仪的满量程范围为±250DPS*/ MPU6050_AcceScaleTypeDef acceScale = MPU6050_ACCE_SCALE_2G); /*加速度传感器的满量程范围为±2G*/进行相关初始化,相关参数信息查看I2C
I2C_InitInfoTypeDef initInfo; /*采用I2C1与目标机通信,并对I2C初始化*/ initInfo.Mode = I2C_MODE_STANDARD_MODE; initInfo.FastModeDutyCycle = I2C_FAST_MODE_DUTY_CYCLE_2_1; initInfo.SCLRiseTime = 1000; initInfo.isEnableClockStretching = true; initInfo.isNeedI2C1PinRemap = true; I2C_Init(I2Cx, &initInfo);
(2) GY271模块¶
此模块为电子罗盘模块,可以获得被控对象的偏航角数据。关于GY271在STM32的使用,推荐博客。
此模块固定了传感器以及I2C协议的配置,只提供对采样时间的配置,如若想自行设定相关配置,推荐使用通用模块I2C自行构建。
![]()
我们已对模块进行了相关配置,以期获得良好的传感效果。我们设置GY271采用I2C1与目标机通信,并对I2C进行相关初始化,相关参数信息查看I2C.
I2C_InitInfoTypeDef initInfo; initInfo.Mode = I2C_MODE_STANDARD_MODE; initInfo.FastModeDutyCycle = I2C_FAST_MODE_DUTY_CYCLE_2_1; initInfo.SCLRiseTime = 1000; initInfo.isEnableClockStretching = true; initInfo.isNeedI2C1PinRemap = true; I2C_Init(I2C1, &initInfo);GY271初始化设置:
I2C_WriteRegisterByte(I2C1, 0x3C, 0x00, 0x70);/*8 位的采样平均,15Hz的标准数据输出频率*/ I2C_WriteRegisterByte(I2C1, 0x3C, 0x02, 0x00);/*连续测量模式*/数据获取:
I2C_WriteByte(I2C1, 0x3C, 0x03); /*数据获取*/ I2C_ReadBytes(I2C1, 0x3D, GY271_BUF, 6);数据处理与融合:
GY271_Read_Multiple(GY271_BUF); gy271.MagX=GY271_BUF[0] << 8 | GY271_BUF[1]; /*Combine MSB and LSB of X Data output register*/ gy271.MagZ=GY271_BUF[2] << 8 | GY271_BUF[3]; /*Combine MSB and LSB of Z Data output register*/ gy271.MagY=GY271_BUF[4] << 8 | GY271_BUF[5]; /*Combine MSB and LSB of Y Data output register*/ if(gy271.MagX>32767) { gy271.MagX-= 65536; } if(gy271.MagY>32767) { gy271.MagY-= 65536; } if(gy271.MagZ>32767) { gy271.MagZ-= 65536; } GY271_Angle= atan2((double)gy271.MagY,(double)gy271.MagX)*(180/3.14159265);/*计算角度*/对读取的数据进行拼接,并利用X 轴和Y 轴数据融合获取Yaw数据,单位弧度。
(3) 超声波传感器¶
通过此模块可实现一个或多个HC-SR04 芯片的超声波同时分组测距功能。
对 HC-SR04芯片的测距原理的基本介绍;
HC-SR04 模块为超声波测距模块。具有Vcc、Gnd、Trig 和Echo 四个引脚。Trig 是输出,Echo 是输入,Vcc 为5V 电压输入端,Gnd 为接地端。
该模块的工作原理为,先向TRIG脚输入至少10us的触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则ECHO输出高电平回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。即:
distancesPtr[i]=(endTimes[i]-startTime)*34/2相关参数的配置说明:
Group Count
:对应组使用的超声波芯片数;
Group Trig Port
:对应组Trig 脚使用的引脚名称;
Group Echo Port
和Group Echo Pin
:对应组Echo脚使用的引脚名称,([4,4],[3,5]
) 对应PD3、PD5;
Group Timeout
:可测得的最长距离对应的所需仿真时间 (单位毫秒) ;
ample Time
:采样时间,注意应略大于Group Timeout
以免导致数据遗失(单位秒) 。

注解
Group Echo Port 和Group Echo Pin 的列数应与Group Count 的数值保持一致。
注解
我们在SWR案例中使用了 MPU6050
模块,用户可做参考。
4.3.2 Display模块¶
Display
模块现包含一个模块:TFT-LCD
模块。通过显示模块,可用于数据实时显示,用户可以直观地查看相关数据。基于ST7735S 驱动的液晶屏显示模块,具体原理和数据手册参考ST7735S 数据手册。
- 为了使用此模块,用户需要对其进行参数配置。
Time
:模块采样时间。![]()
对应STM32板,具体的引脚配置及基本功能:
![]()
为了直观展示具体,做了相应的显示测试:

注解
考虑到LCD 的刷新频率,此模块的采样时间需要独立设置,建议采样时间不低于0.02s。
4.4 Controller 模块¶
为了便于用户进行控制算法搭建,封装了几款抗扰控制器,包括,
1-Order LADRC
模块、2-Order LADRC
模块、Tracking Differentiator (TD)
模块、Adaptive ADRC
模块以及DR-PID
模块。接下来对模块的使用做具体介绍。
4.4.1 一阶、二阶LADRC模块¶
以二阶LADRC为例,介绍此模块使用方式:
2-Order LADRC
模块是针对典型二阶对象所设计的线性自抗扰控制器(1-order LADRC
模块类似,在此不再赘述),请参考 3.3.1 线性自抗扰控制 。详细内容请自行查看相关ADRC资料,推荐B站和自抗扰控制QQ群(128464029(入门),模块通过参考输入
r
和 被控对象输出yp
产生控制量u
以及扩张观测器的观测状态xo1
、xo2
和xo3
。使用模块(控制方法)需要对模块参数进行配置:
ESO Bandwidth wo
:扩张状态观测器的带宽参数 \({{\omega _0}}\) ,其决定了ESO的跟踪速度,此值越大,ESO估计扰动越快,但过大可能导致噪声难以忍受或ESO振荡;
Conreoller Bandwidth wc
:控制器带宽 \({{\omega _c}}\) ,其决定了控制器的响应速度,一定范围内越大控制效果越好,但过大可能使系统不稳定,需要根据瞬态响应进行调节;
Control Variable b0
:控制量增益 \({b_0}\) ,其代表了对象的特性,可以由阶跃响应中的初始加速度导出。
4.4.2 二阶Adaptive ADRC模块¶
2-Order Adaptive ADRC
模块是在二阶线性自抗扰控制器基础上增加“定量自适应”调节机制,有兴趣可以查看 文献 。在此对其使用进行说明方法根据参考模型 \(\frac{{\omega _c^2}}{{{{\left( {s + {\omega _c}} \right)}^2}}}\) 与ESO的观测状态( \({x_{o1}}\) 、\({x_{o2}}\))之间的跟踪误差 \({e_r} = {P_1}{e_{r1}} + {P_2}{e_{r2}}\),经鲁棒自适应律对
2-Order LADRC
模块的控制器参数进行自适应调节保证被控对象状态能够跟踪参考模型。
Controller Bandwith wc
:控制器带宽 \({{\omega _c}}\) ,调参方式与LADRC一致;
ESO Bandwidth wo
:扩张状态观测器的带宽参数 \({{\omega _0}}\) ,调参方式与LADRC一致;
Control Variable b0
:控制量增益 \({b_0}\) ,调参方式与LADRC一致;
Adaptive Scheme Bandwidth wa
:自适应带宽 \({\omega _A}\) ,其决定自适应的速率,一般大于 \({\omega _o}\) ;
Quantitative Gain q
:定量自适应调节参数 \(q\) ,当设置 \(q=0\) ,其退化为LADRC,在LADRC的基础上逐步定量增大 \(q\) ,以引入自适应机制,提高动态性能;
Tracking Error Gain P1
:跟踪误差加权系数 \({P_1}\) ,跟踪误差 \({e_r}\) 中 \({e_{r1}}\) 的比重;一般推荐设置为10;
Tracking Error Differential Gain P2
:跟踪误差微分加权系数 \({P_2}\) ,跟踪误差 \({e_r}\) 中 \({e_{r2}}\) 的比重;一般推荐设置为1。
4.4.3 DR-PID 模块¶
根据 3.3.2 抗扰PID控制器 ,封装了
DR-PID
模块,对应的参数配置可参考此章节,在此不再赘述。
5. 案例¶
5.1点亮一个LED灯:Simulink环境配置与编译下载¶
在此节中,将会给大家介绍如何通过Sukung环境点亮目标机上的一个LED灯,使得可以在Simulink上对目标机的LED灯进行实时控制,以此来了解Sukung的模块参数配置、编译、下载、控制和数据接收存储等过程。
步骤1:实验目标¶
通过Sukung环境,实现在Simulink上对目标机上的LED灯(PB5引脚)进行实时控制。
步骤2:硬件准备与连接¶
步骤3:工程配置¶
建立好硬件连接后,我们按照 2.5 Sukung的工程配置 的相关步骤建立了
LED.slx
工程。
此案例中目标机与PC的连接端口为
COM4
,如下图所示。则按照 步骤2:实时传输层配置 ,进行设置,即MEX-file arguments
为0,4,1200000,10
;
由于程序并不复杂,则按照步骤 步骤3:步长(Sample Time)和Solver配置 ,我们配置步长为
0.005
,Solver为ode1
;
由于此案例无需进行数据查看和存储,因此,对
External Mode Control Pane
不做配置。
警告
单个Simulink工程,存放于单个文件夹内,防止运行时出现不可预料的错误。例,新建LED.slx则将其存放在led文件夹内,若新建motor.slx则不能再放于led文件夹内。
步骤5:程序编译和下载¶
完成上述步骤后,点击
Build
,程序自行编译,用户可以点击出现的View diagnostics
,查看输出信息,如上图所示。在程序下载时,还需要用户依据如下输出信息,在MATLAB命令行窗口输入目标机进入下载模式时,对应串口信号DTR/RTS的电平模式,即如输出信息显示,此次案例使用mode2
则命令行窗口输入2
。并且,还要输入串口对应序号,即COM4
对应的序号0
,完成下载。… ### Created ### Successful completion of build procedure for model: LED ### Creating HTML report file LED_codegen_rpt.html ### Downloading LED: "%MATLAB_ROOT%\bin\win64\gmake" -f LED.mk GENERATE_ASAP2=0 DOWNLOADAPPLICATION=1 OPTS="-DEXT_MODE -DON_TARGET_WAIT_FOR_START=0" download Downloading to Sukung-MiniBox ... There are four available mode. Please make choice according to your hardware. The mode0: no use DTR/RTS. The mode1: DTR高电平复位, RTS低电平进bootloader. The mode2: DTR低电平复位, RTS高电平进bootloader The mode3: RTS高电平复位, DTR低电平进bootloader Please write the DTR/RTS mode required: 2 The available serial port: 0:COM4 Please write the serial number required:
完成下载时,
View diagnostic
会出现如下输出,说明下载完成。### Created ### Successful completion of build procedure for model: LED ### Creating HTML report file LED_codegen_rpt.html ### Downloading LED: "%MATLAB_ROOT%\bin\win64\gmake" -f LED.mk GENERATE_ASAP2=0 DOWNLOADAPPLICATION=1 OPTS="-DEXT_MODE -DON_TARGET_WAIT_FOR_START=0" download Downloading to Sukung-MiniBox ... There are four available mode. Please make choice according to your hardware. The mode0: no use DTR/RTS. The mode1: DTR高电平复位, RTS低电平进bootloader. The mode2: DTR低电平复位, RTS高电平进bootloader The mode3: RTS高电平复位, DTR低电平进bootloader Please write the DTR/RTS mode required: 2 The available serial port: 0:COM4 Please write the serial number required: Serial port COM4 has been selected connecting device... Device connected successfully! The supported commands of STM32: 00 01 02 11 21 31 43 63 73 82 92 The bootloader vesion of STM32: vesion2.2 STM32 device ID: Version 0414 The data starting from the specified address(UID): 0x36FFD4055257383116850643 Flash Size of STM32: 32KB Erasing Flash memory pages... Erase Flash Memory successfully! Menory address 0x08000000 writing 256 bytes Menory address 0x08000100 writing 256 bytes ... ... ... Menory address 0x08012400 writing 256 bytes Menory address 0x08012500 writing 216 bytes write successfully ### Downloaded Build process completed successfully具体的下载过程,可见下图。
注解
若由于输入指令出错或者未实现有效通讯等情况,导致下载失败,即出现 Connecting device
。则在命令行窗口执行两次 Ctrl + C
,退出下载程序。再次执行 Build
操作,也可能出现 ||和&&运算符的操作数必须能够转换为逻辑标量值
,或者出现 Detected recursive call to slbuild,...
, 再次执行 Build
操作即可。
步骤6:工程连接与运行¶
警告
在断开连接后,如想再与目标机连接,在程序结构或者位置未发生改变的情况下,可直接连接运行,否则会弹出程序与 map
不匹配的错误信息,需重新下载程序。
警告
在运行时,可对程序内的常量直接修改,实现在线调参,或者断开连接后,对赋值变量在MATLAB的命令行窗口进行参数调整。涉及到m函数、传递函数等影响生成代码的模块,不可直接修改,若修改,则需重新下载程序。
5.2直流电机系统辨识实验:数据采集与保存¶
实验目标:掌握直流电机调速系统原理,能够搭建调速系统;掌握编码器原理;掌握最小二乘法,应用于直流电机模型辨识。
硬件参数¶
系统相关信号设定¶
设输入信号u为PWM波占空比,u∈[-1,1],当u<0时表示电机反转;电机输出y为转速,单位:转每秒(r/s),计算公式如下:
\[y = \frac{{num}}{{{\rm{500*}}30*4*T}}(r/s)\]其中:num表示当前周期脉冲数;500是编码器线数;30为电机减速比;4为采用编码器四倍频计数模式;T为采样周期(控制步长)。
步骤1:硬件连接¶
步骤3:直流电机及编码器测试¶
步骤4:离线辨识数据采集¶
离线辨识需要用到电机输入占空比u以及输出转速y的运行数据。
注解
Simulink运行数据两种保存方式见 5.4Sukung数据存储及绘图组件的使用 。
需要说明的是,Scope以及To Workspace模块的置入增加了单片机实时通信负担。为了保证控制步长准确和控制实时性,不推荐大量使用Scope及To Workspace模块。
步骤5:离线辨识算法设计¶
设电机模型为:
\[\frac{y}{u} = \frac{K}{{{s^2} + as + b}}\]离散化为:
\[y(k) = - \underbrace {(aT - 2)}_{{\theta _1}}y(k - 1) - \underbrace {(1 - aT + b{T^2})}_{{\theta _2}}y(k - 2) + \underbrace {K{T^2}}_{{\theta _3}}u(k - 2)\]其中,T为采样周期(控制步长),取0.002s。K、a、b为未知参数。构建数据向量 \(\varphi (k)\) 和参数向量 \(\theta (k)\) :
\[\begin{split}\left\{ \begin{array}{l} {\bf{\varphi }}(k) = {[ - y(k - 1), - y(k - 2),u(k - 2)]^T}\\ {\bf{\theta }} = {[{\theta _1},{\theta _2},{\theta _3}]^T} \end{array} \right.\end{split}\]构造输出向量Y和矩阵 \(\Phi\) :
\[\begin{split}{\bf{Y}} = \left[ {\begin{array}{*{20}{c}} {y(1)}\\ {y(2)}\\ \vdots \\ {y(L)} \end{array}} \right],{\bf{\Phi }}{\rm{ = }}\left[ {\begin{array}{*{20}{c}} {{{\bf{\varphi }}^T}(1)}\\ {{{\bf{\varphi }}^T}(2)}\\ \vdots \\ {{{\bf{\varphi }}^T}(L)} \end{array}} \right]\end{split}\]由批处理最小二乘法计算参数向量公式如下:
\[\mathord{\buildrel{\lower3pt\hbox{$\scriptscriptstyle\frown$}} \over \theta } = {\left( {{{\bf{\Phi }}^T}{\bf{\Phi }}} \right)^{ - 1}}{{\bf{\Phi }}^T}{\bf{Y}}\]根据系统辨识原理可知,模型参数辨识的精度依赖于输入信号。合理选用辨识输入信号,是保证获得理想辨识结果的关键之一。为简化描述,本次实验中仅采用了常值输入。建议使用者采用更合理的输入信号方案,推荐M序列。离线辨识结果如下图所示:
步骤6:离线辨识模型在线验证¶
步骤7:在线辨识算法设计¶
在具体应用批处理最小二乘法时,条件比较苛刻,往往需要庞大的数据量才能得出理想的辨识结果,且不能用于参数在线实时估计。在自适应控制系统中,常常要求对象参数能够在线实时估计。因此递推最小二乘法被广泛应用。其基本思想是:新的估计值 \({\bf{\hat \theta }}(k)\) =旧的估计值 \({\bf{\hat \theta }}(k - 1)\) +修正项。基本步骤如下:
已知: \({n_a}\) , \({n_b}\) , \(d\)
Step1:设置初值 \({\bf{\hat \theta }}(0)\) 和 \({\bf{P}}(0)\) ,输入原始数据;
Step2:采样当前输出 \(y(k)\) 和输入 \(u(k)\) ;
Step3:利用下式计算 \({\bf{K}}(k)\) 、 \({\bf{\hat \theta }}(k)\) 和 \({\bf{P}}(k)\) ;
Step4: \(k \to k + 1\) ,返回Step2,继续循环。
\[\begin{split}\left\{ \begin{array}{l} {\bf{K}}(k) = [{\bf{P}}(k - 1){\bf{\varphi }}(k)]/[1 + {{\bf{\varphi }}^T}(k){\bf{P}}(k - 1){\bf{\varphi }}(k)]\\ {\bf{\hat \theta }}(k) = {\bf{\hat \theta }}(k - 1) + {\bf{K}}(k)[y(k) - {{\bf{\varphi }}^T}(k){\bf{\hat \theta }}(k - 1)]\\ {\bf{P}}(k) = [{\bf{I}} - {\bf{K}}(k){{\bf{\varphi }}^T}(k)]{\bf{P}}(k - 1) \end{array} \right.\end{split}\]初值为:
\[\begin{split}\left\{ \begin{array}{l} {\bf{P}}(0) = \alpha {\bf{I}}\\ {\bf{\hat \theta }}(0) = {\bf{\varepsilon }} \end{array} \right.\end{split}\]其中, \(\alpha \) , \({\bf{\varepsilon }}\) 为零向量或充分小的正的实向量。
步骤8:在线辨识¶
步骤9:在线辨识模型验证¶
步骤10:离线-在线辨识的连续模型对比¶
小结¶
本实验搭建了直流电机调速系统,并通过Sukung实现了Simulink下的数据采集和系统测试;
采集了直流电机输入输出数据,采用最小二乘批处理算法,在MATLAB环境中实现了直流电机的离线参数辨识;
设计了递推最小二乘算法,并通过Sukung下载到目标机,实现了直流电机在线参数辨识;
离线辨识与在线辨识结果符合预期;
实验中,可进一步探讨M序列输入信号下的辨识效果,并研究各类系统辨识算法。
5.3直流电机抗扰PID调速控制实验¶
实验目标:掌握直流电机调速系统原理,能够搭建调速系统;掌握抗扰PID基本原理,并应用于直流电机调速控制实验中。
系统框图¶
实验系统主要包括宿主机与目标机的程序下载、实时数据通信两个部分,如下图所示。
在上一小节 5.2直流电机系统辨识实验:数据采集与保存 的基础上,进行本节实验。其中,硬件参数、系统相关信号设定、硬件连接以及驱动板、编码器测试与上节相同,此处不再赘述。
步骤1:算法设计¶
直流电机速度控制系统结构如下,其中,速度控制采用抗扰PID(DR-PID)控制器,可选前置滤波器以克服超调。
PID控制器的抗扰原理以及 章节 3.3.2 抗扰PID控制器 。
DR-PID公式如下:
\[C_{PID}^{DR}(s) = {K_P}\left( {1 + \frac{{{\omega _c}}}{{\alpha + 1}}\frac{{\rm{1}}}{s}{\rm{ + }}\frac{\alpha }{{(\alpha + 1){\omega _c}}}s} \right)\]式中, \({\omega _c}\) 为期望带宽,决定闭环响应速度,期望闭环为 \({\omega _c}/(s + {\omega _c})\) ; \({K_P}\) 为控制器增益,相同条件下,逐步增大 \({K_P}\) 可改善系统性能; \(\alpha \)alpha = 0` 为PI控制器, \(\alpha = 1\) 为ZN-PID。
调参思路:
1)先设定 \({\omega _c}\) (目标),然后调节 \({K_P}\) 和 \(\alpha\) (手段);
2)如果系统存在超调,可在输入端加入滤波器(任意形式)。
上述公式适用于:机电系统、一阶时滞系统、积分型(液位)系统、最小/非最小相位系统等各类常见工业对象。
相对于常规PID调参方法,抗扰PID有以下特点:
1)主动抗扰:具有主动抗扰能力;
2)机理明确:三个参数 \({\omega _c}\) , \({K_P}\) 和 \(\alpha\) 具有明确物理含义,且参数与控制性能建立了直接关联,调参机理明确、调参思路清晰;
3)通用性强:适用于不同类型对象,调参方法具有一致性;
4)等价性:可与各类经典PID调参方法建立等价性。例如, \(\alpha = 1\) 即为ZN-PID。
步骤2:仿真¶
通过上节系统辨识实验,获得的电机模型为:
\[G(s) = \frac{{75910}}{{{s^2} + 858.4s + 9780}}\]式中系统极点:s1=-11.5(主导), s2=-846.8。
在Simulink中搭建仿真程序如下图所示:
方案1:PID控制
方案2:PI控制
速度环 |
方案1 PID |
方案2 PI |
---|---|---|
跟踪 |
超调小, |
超调小, |
相对慢 |
快 |
|
抗扰 |
慢 |
快 |
wo(抗扰原理) |
大 |
小 |
控制量 |
微分影响 |
无微分影响 |
存在问题 |
噪声敏感,带宽受限 |
|
结论 |
代价大 |
代价小 |
步骤3:实验测试¶
在Simulink搭建实验模型及各模块参数设置如下图所示,其中在第5秒时刻添加0.1的恒值扰动,控制系统运行时间为10s,控制步长为0.001s(区别于上一节的0.002s,这里没有很大的运算量,因而控制周期可设为最小允许值0.001s)。
点击编译,一键部署生成的代码,复位STM32开发板,点击连接、运行,打开示波器查看实时控制曲线,如下图所示(这里展示的是未封装的slx模型)。每次运行完保存数据,以备后续分析。
方案1:PID控制
方案2:PI控制
方案3:带前置滤波器PID/PI控制
取 \({\omega _c} = 20\) , \({K_P} = 0.3\) , \(\alpha = 0.1\) 。绘图如下:
小结¶
本实验搭建了直流电机调速系统,并通过Sukung实现了Simulink下的仿真与实验的相互验证,并使用抗扰PID控制器,达到了良好的控制效果。此外,用户还可以尝试在线修改期望速度以及控制器参数。
5.4Sukung数据存储及绘图组件的使用¶
实验目标:分别使用“To Workspace”和“Scope”存储实验数据,并使用“Sukung绘图组件.app“在MATLAB环境下绘图。
在前面两个小节的基础上,进行本节实验。其中,硬件参数、系统相关信号设定、硬件连接、软件设计完全相同。
步骤1:外部模式配置及“To Workspace”和“Scope”参数配置¶
步骤2:Sukung绘图组app安装¶
步骤3:使用Sukung绘图组件绘制曲线¶
小结¶
本次实验主要介绍了实验数据的存储方式,需要注意的是,实际实验中要注意数据传输的数量不应过多,以避免系统阻塞、崩溃。对于同一个信号“To Workspace”和“Scope”不要同时使用,任选其一即可。同时介绍了使用Sukung_plot_component App绘制数据图像的基本流程,用户根据需要,选择使用。
6. 其他¶
6.1 软件下载¶
当前软件版本:Sukung V1.0,有线下载,有线数据传输。
Sukung软件下载:github
mingW-W64下载:github
淘宝网址: 淘宝网址
案例库计划:
本说明书以直流电机为对象,抛砖引玉地给出了基于Sukung的系统辩识与调速控制的简单案例,后续还需进一步补充和完善。完整的Sukung实验/实践案例,能帮助初学者快速开展理论实践,在实验过程中学习并掌握必须的理论知识。Sukung将服务于自动化及相关专业、学科的教学实践,搭建起理论与实践的桥梁。为鼓励Sukung用户分享实验成果和案例,拟实施以下案例分享激励计划:
提供高质量的典型应用案例(文案、视频),审核发布后,可申请Sukung试用两周;
提供高质量视频,审核发布后,可申请Sukung试用一周。
说明: 1)同一项工作不累加; 2)所采用案例,Sukung团队有权用于宣传推广。
6.2 性能测试¶
6.2.1 测试目的¶
本小节对Sukung的整体性能进行测试,以帮助用户明确如何正常使用Sukung开展工作。测试过程设计了两类实验:
实验 1) 采用Sukung平台,同时进行3个直流电机的调速控制(3个PID控制器+3个一阶低通滤波器等),以测试“数据传输性能”;
实验 2) 采用Sukung平台,在实验 1)基础上,增加了1个MPU6050模块和1个ADC模块,以测试“CPU处理性能”。
6.2 常见问题¶
6.2.1 安装¶
Sukung的安装以及环境配置,参照<安装流程>。在安装与配置说明中,已经提到相关错误以及其对应的解决方法。大多是由于环境变量配置出错,以及keil的编译器版本引起的问题,因此用户安装时,需谨慎注意。
6.2.2 下载与连接¶
此Sukung版本使用的是基于ISP的软件下载方式,相关注意事项,已在 5.1点亮一个LED灯:Simulink环境配置与编译下载 中给出。在此做出对与目标机连接时相关问题的补充,并给出相关分析。
问题2: 点击
Connect To Target
实现连接目标机操作时,立即弹出如下图错误信息:Error occurred while executing External Mode MEX-file `ext_sukung_serial_comm`…
。![]()
解决方法:
若立即弹出,则说明PC未与目标机建立连接,串口通讯或
interface
设置出现问题,检查相关COM与硬件连接
若稍等片刻(10s)才弹出此错误信息,则说明目标机未及时响应,则可能目标机未处于初始化运行状态,可以复位目标机,重新连接。或者,Simulink程序中使用了I2C或SPI等在初始化操作时,需要和外部设备进行交互的通讯方式,外部设备供电或者连接线问题导致目标机初始化失败,无法进入等待PC连接的阶段。
若由于在运行时,直接由目标机关闭与PC的连接(手动复位、供电失效等),但PC的外部模式依然处于运行当中,导致再次连接时调用串口应用时出错,也会弹出上述信息。此时需重启MATLAB。
问题3: 点击
Connect To Target
实现连接目标机操作时,弹出以下错误信息:Checksum test (TARGET_DATA_MAP) failed
。![]()
解决方法:
此问题是由于工程中的Simulink程序与生成代码不匹配,很可能无意间做出修改,遂,删除已存在的
RTW
文件,重新编译下载程序至目标机。
若上述步骤未解决,请检查文件中是否有其它
RTW
文件存在,以及现MATLAB目录是否定位到此工程文件下。
6.2.3 运行¶
在实时半实物仿真中,PC与目标机需要建立牢固的实时传输通道,因此硬件连接上的不牢固、以及超大量数据的实时传输都会造成运行出错。
问题4 :在运行时,通讯接线不牢固、或者手动操作失误,导致目标机主动断开,而非在Simulink端手动点击断开,使得Simulink无法操作。
解决方法: 重启MATLAB,并固定通讯接线。
问题5: 在运行时,大量数据要进行收发,导致通讯堵塞,会弹出如下错误信息:
![]()
![]()
![]()
解决方法: 重启MATLAB,减少一次性传输的数据量,或者降低
Interface
设置中串口的波特率。问题6: 在运行时,MATLAB报出
出现未知错误
,并直接退出。解决方法: 一方面是程序复杂度过高,目标机处理能力有限,出现此次错误的同时,目标机可能会发散也可能依然正常运行。因此,需要用户优化程序,减少不必要的模块,另一方面降低ODE,最好使用
discrete
Solver。
6.2.4模块使用¶
在模块使用当中,由于硬件或者引脚冲突,导致部分模块在处于某种模式时无法使用,在此对部分模块说明。
Pulse_Counters模块与PWM模块 :具体使用参照定制模块等相关章节。由于两模块使用的都是STM32单片机(目标机)的TIM资源,因而在进行运动控制使用多个电机时,容易出现引脚冲突问题,在此给出使用有效结果以及多电机策略。
![]()
单独针对PWM模块进行测试,结果如下,可以实现8电机的控制,但无法使用编码器。
![]()
我们再对Pulse_Counters模块进行测试,结果如下,在同时使用PWM Generators 模块和Pulse_Counters模块时,可以最多使用4电机和3编码器,但如果使用TB6612FNG模块和Pulse_Counters模块,则可以使用4电机和4编码器,即TB6612FNG模块使用一个TIM去控制4电机,而另外四个TIM被PWM Generators 模块去使用驱动4个编码器。
![]()
6.4 技术支持¶
定制与合作请联系: yezhuyun@sukung.cn;
技术问题可入群交流:
Sukung半实物仿真技术交流,QQ群:661419695;
控制器模块相关论文:
[1] Gao Z. Scaling and Parameterization Based Controller Tuning[C]// American Control Conference. IEEE, 2003:4989-4996.
[2] Nie Zhuoyun, Zhang Bing, Wang Qing-Guo, Liu Rui-Juan, Luo Ji-Liang. Adaptive active disturbance rejection control guaranteeing uniformly ultimate boundedness and simplicity. International Journal of Robust and Nonlinear Control, 2020, 30(17): 7278-7294.
[3] Nie Zhuoyun, Zhu Chao, Wang Qingguo, Gao Zhiqiang, Shao Hui, Luo Jiliang. Design, analysis and application of a new disturbance rejection PID for uncertain systems. ISA Transactions, 2020, 101: 281-294.
[4] 李高铭,聂卓赟,李兆洋,郑义民,罗继亮. 非平衡负载下轮式移动机器人的抗扰PID控制. 控制理论与应用. 2021.
6.5 研发计划¶
在现有Sukung系统基础上,后续的研究计划包括:
定制无线通信模块,实现程序无线一键下载和无线数据传输;
定制专用实验系统,例如:Sukung+机械臂,Sukung+移动机器人,Sukung+四旋翼飞行器等;
面向本科、研究生实验教学的课程建设;
研制面向高性能嵌入式目标机的Sukung平台;
面向互联网的程序一键下载技术,打造Sukung云端实验室;
6.6 贡献与致谢¶
感谢华侨大学信息科学与工程学院的支持。
感谢华侨大学先进控制实验室研究小组成员,包括:李兆洋、程前、何旺祥、聂方明、朱恩泽、李赫然,周长新、吴雨泽等研究生同学参与研发、测试和维护工作。