声明
这篇文章目前仅对电机调速有效,暂时不知道对调整姿态这样的pid是否可以有同样的效果。如果是SISO,我的感觉是可以的,可以尝试方波信号而不是简单的阶跃。
采集数据
给电机提供一个单位阶跃输入(固定一个模拟量或是pwm占空比,本文用的是arduino的analogWrite(100)),单片机定时采集电机转速(单位时间编码器脉冲)并通过串口输出,PC端用串口通讯工具采集。
导入数据
截取恰当的部分,导入数据到MATLAB,作为输出向量(output)
再定义输入向量:
input = 100 * ones(63,1);
系统辨识
安装System Identification工具箱,Import data一栏选择Time domain data,自行填好相关参数,然后点击import
operation一栏选择Transfer Function Models,poles、zero的个数随缘选择,基本上都差不多,然后点击estimate,就会出预测的结果
系统辨识完毕后双击右边的“tf1”可以得到结果如图
为了验证系统辨识是否准确,可以给估计出来的传递函数一个阶跃输入,看输出是否和采集到的差不多。值得注意的是,MATLAB中离散系统传递函数的通式是如下所示的,和上图结果的格式略有差别,需要自行变换。
执行下面代码,得到下图结果,发现参数比较合理。
num = [0.07286, 0, 0];
den = [1, -1.277, 0.0065, 0.3002];
f = tf(num, den, 0.05);
plot(t, output/100)
hold on
step(f)
整定pid参数
接下来利用PID Tuner工具箱整定参数。执行以下代码,自行选择CONTROLLER,我选择了PID,然后拖动滑块得到较为理想的(没有完美的)响应曲线形状,这个就是你需要的PID参数:
pidTuner(f)
写在后面
有人会问采集的是转速、或者说一个和转速正相关的量,调节的是输出的模拟量大小,是不是有问题、不能直接相减?
不是的,控制系统需要大概经过:1、输入量,2、控制器,3、执行器,4、被控对象,5、输出量这些部分。我采集的数据,即阶跃信号下的输出,是3-5的过程,输入和输出不是同一个单位,不能直接相减。而当我经过PID控制器(增加2控制器这个环节),我设定的值,也就是我的输入,发生了量纲、数值上的转换,再成为执行器的输出,这时候的输入量和输出量已经是同一个量纲了,可以直接相减。