系统辨识
在STM32CubeMonitor使用中采集到了相应的csv数据,这里以单环角度控制PID为例说明如何做系统辨识。
首先确保我们的Matlab里面有System Identification这个APP,如果没有可在菜单中选“获取更多APP”,打开后搜索两个APP的名字安装
其次,为了反映系统的真实性能,我们获取的数据应该要在PID控制器的Ki,Kd都为0的情况下进行测试。测试内容是多个阶跃信号的输入,注意设定值不能出现让电机越过360度的操作,否则后续数据处理难度会更大。最终用到的数据是一系列对应的设定值以及真实值,并且需要确定Kp和采样频率。这里我的Kp是500,采样频率在CubeMonitor里面说是为1kHz,但是真实数据的时间戳的均值计算(见脚本输出)出来存在偏差,这里以脚本计算平均的频率为准。
要在Matlab下导入csv数据,输入以下命令
1 | data_table=csvread("test.csv",1) |
其中csvread第一个参数为文件名,第二个参数为从第几行开始读。用脚本导出的csv第一行为数据标题,故从第二行开始读。第二个命令data_table(:,4)代表提取第四列的数据到in变量,第三个命令同理。提取第几列取决于PID的设定值和真实值为第几列,一般in代表是设定值,out代表的是真实值。
完成后打开System Identification,从Import Data里面选Time domain data,在弹出来的对话框中填入刚刚导入的输入(设定值)和输出(真实值)以及采样时间(单位为秒),点Import即可导入数据
由于测试的数据中有多个阶跃响应,需要将其拆分为单个阶跃才能做系统辨识。选Prepeocess下拉列表中的select range,在图表中框选恰好完成阶跃后的区间。这个区间要求绝大部分是是阶跃后的响应数据,选中阶跃前的数据会降低拟合率,并且区间要足够长。点Insert插入这一段数据
更新:上面手动框选的办法可能导致结果误差较大,同样可以利用Python脚本可以筛出原来数据中的阶跃响应,生成的csv经过上面同样导入数据的操作后即可使用
将新生成的数据拖到working data里面,从下方的Estimate下拉列表中选Transfer Function Models
新弹出来的对话框会要求给出拟合出的传递函数的极点个数和零点个数。极点个数代表系统的阶数,目前4阶足以应对大多数系统。零点填2或1即可(拟合程度的结果说明这两个值是比较可行的,至于为什么我现在解释不了)。还有一个默认的原则是极点个数是大于零点个数的。由于输入的变量是离散量,在下面还要指定为Discrete-time。
最后点Estimate,稍等片刻即可出结果。
结果看起来还不错,有98%的拟合率。如果这个结果是80%或者更低的话要先检查输入数据的区间是否包含了过多阶跃前的数据,如果数据没有问题,先考虑增加函数的极点再考虑增加零点。最后得到的结果在右侧的模型集显示,双击可以查看其详细信息。点Export可以导出为Matlab工作区的一个变量。
有这个传递函数变量后面可以做很多事,比如说放进去PID Tuner里面模拟调参(虽然PID Tuner本身也带数据处理和传递函数拟合),或者直接在Simulink里面仿真。
PID Tuner调参
经过上面的导出操作之后在工作区里面可以看到导出的传递函数模型
接下来打开PID Tuner(如果没有的话参考上面装System Identification的办法装),选Plant里面的Import,在弹出来的对话框里选中刚才导出的传递函数,点Import即可
调参过程十分简易,在Type里面选中想要用的控制器(如PD,PID),拖动上方两个滑动条(第一个代表响应时间,它的两边的双箭头按钮可以增宽调节范围,第二个代表稳定性)调节参数,调的时候响应时间要尽量远大于采样时间,否则会出现失真。调节出的参数可以在右下角或者点开Show Parameters里面看到。Show Parameters里面还能看到这套参数下的性能。