详细资料见Q群:531905626
对该项目感兴趣的同志,想要一起深入开发拓展可以联系本人邮箱:2560198277@qq.com。限于本人精力,在PCB设计、3D建模、嵌入式开发方面都有较大的需求。
书籍总目录:http://t.csdnimg.cn/YDe8m
5.9.9 串级PID控制器
(1)串级PID控制器原理
我们已知单一的角速度PID控制系统,其原理如图5.9.8所示。其可以简化为图5.9.19:
图5.9.19
其中飞行硬件系统FLY(s)相当于电机功率转化模块 F m F_m Fm、电机系统M(s)、四旋转子系统G(s)的组合。而PID(s)为PID控制器,其输入是一个误差e,输出是控制量u。
离散化的PID控制器我们已经在前面求解得到,即式(5.9.21),于是这里可以简记PID控制器PID(s)为:
u [ k + 1 ] = P I D ( e [ k + 1 ] ) , k = 0 , 1 , . . . . . . ( 5.9.37 ) u_{[k+1]} = \mathrm{PID}(e_{[k+1]}),k = 0,1,...... \qquad (5.9.37) u[k+1]=PID(e[k+1]),k=0,1,......(5.9.37)
左侧为输出,右侧为输入。
而串级PID的原理如图5.9.20所示:
图5.9.20
如图5.9.20的串级PID控制系统可以同时控制四旋转子的角度与角速度,是一个多输入单输出系统。输入角度期望 A x d A_{xd} Axd、角速度期望 W x d W_{xd} Wxd,输出是对x轴力矩的控制量 U W U_W UW。
串级PID相当于两个普通PID控制器进行串联,如图5.9.20,如果去掉虚线框住的部分,则其与图5.9.19等同。则称虚线框住部分的PID为角度环PID,称未框起来的PID为角速度环PID。通常又称靠近总输出端的PID为内环PID,此处即角速度不环PID;求远离总输出端的PID为外环PID,即此处的角度环PID。
明确了基本概念,再来看图5.9.20,其具体控制流程分为如下几个部分:
1)角度环
输入的期望角度
A
x
d
A_{xd}
Axd与测量角度
A
x
A_x
Ax作差,得到误差
e
A
e_A
eA。
e
A
e_A
eA输入到PID控制器PID(s),PID控制器输出控制量
u
A
u_A
uA。
2)角速度环
该部分的第一步也是求期望与测量的误差,只是此处的期望包含两部分。其一是外部给定的角速度期望
W
x
d
W_{xd}
Wxd;其二则是角度不正常的输出
u
A
u_A
uA,则求得误差
e
W
=
(
W
x
d
+
u
A
)
−
W
x
e_W = (W_{xd}+u_A)-W_x
eW=(Wxd+uA)−Wx,此处是是串级PID的核心。其后与角度环类似,将
e
W
e_W
eW输入PID控制器,得到输出
u
W
u_W
uW。
3)飞行硬件系统
最终,控制量输入飞行硬件系统FLY(s),其输出为四旋转子的角度
A
x
A_x
Ax、角速度
W
x
W_x
Wx,两个输出又用于下一次的串级PID控制。
上述串级PID可写成离散化的数学模型,即:
e
A
[
0
]
=
u
A
[
0
]
=
e
W
[
0
]
=
u
W
[
0
]
=
0
(
5.9.38.
a
)
e
A
[
k
+
1
]
=
A
x
d
−
A
x
[
k
+
1
]
(
5.9.38.
b
)
u
A
[
k
+
1
]
=
P
I
D
(
e
A
[
k
+
1
]
)
(
5.9.38.
c
)
e
W
[
k
+
1
]
=
(
W
x
d
+
u
A
[
k
+
1
]
)
−
W
x
[
k
+
1
]
(
5.9.38.
d
)
u
W
[
k
+
1
]
=
P
I
D
(
e
W
[
k
+
1
]
)
(
5.9.38.
e
)
\begin{aligned} &e_{A[0]} = u_{A[0]} = e_{W[0]} = u_{W[0]} = 0 &(5.9.38.a) \\ &e_{A[k+1]} = A_{xd} - A_{x[k+1]} & (5.9.38.b) \\ &u_{A[k+1]} = \mathrm{PID}(e_{A[k+1]}) & (5.9.38.c) \\ &e_{W[k+1]} = (W_{xd}+u_{A[k+1]}) - W_{x[k+1]} &(5.9.38.d) \\ &u_{W[k+1]} = \mathrm{PID}(e_{W[k+1]}) &(5.9.38.e) \end{aligned}
eA[0]=uA[0]=eW[0]=uW[0]=0eA[k+1]=Axd−Ax[k+1]uA[k+1]=PID(eA[k+1])eW[k+1]=(Wxd+uA[k+1])−Wx[k+1]uW[k+1]=PID(eW[k+1])(5.9.38.a)(5.9.38.b)(5.9.38.c)(5.9.38.d)(5.9.38.e)
(2)内环与外环
图5.9.20中,为什么角速度环作为内环呢?换一下位置可以吗?
答案是可以,不过控制器的性能可能会极大的下降。一般来说,串级PID内外环的设置关系或都说多个PID串联时其前后的位置关系,遵循以下原则:
1)运行频率越高的PID控制器,越靠近总输出端。
2)期望值微分阶次越高的PID越靠近总输出端。例程此处,角度是角度的零阶微分,而角速度是角度的一阶微分,所以设置角速度环为内环。
3)期望优先级越大的、期望变化越频繁的PID,越远离输出端。如四旋转子系统,我们更想要控制的是系统的角度,而在控制过程中角速度的变化并不特别关心,一般会将角速度的期望固定设置为零。故设置角度环PID为外环。之后可能会依次扩展控制器系统的维度,对不超过期望的优先级将设置为:
位置 > 位速 > 角度 > 角速
(3)Matlab读写Excel文件数据
为了便于设置与保存系统参数,这里引入Matlab读写Excel数据的功能,该功能主要由xlsread、xlswrite两个函数来实现,程序中这两个函数只能读写数值,操作不了文本。
-
xlsread 函数
- 功能:读取电子表格文件
- 语法:num = xlsread(filename)
其中“filename”为当前目录下Excel文件的文件名,应使用单引号’'框起来,该函数会读取“filename”文件中数据并以矩阵形式保存在“num”变量中。不过实测只能读取数值数据。
此外,默认情况下该函数是只读取Excel文件中的Sheet1。
-
xlswrite 函数
- 功能:写入电子表格文件
- 语法:xlswrite(filename,A,xlRange)
将矩阵“A”中的数据写入到Excel文件filename的xlRange区域,例如要写入到文件的C2到E7这个方形区域,则设置xlRange为’C2:E7’,注意加上单引号。
之后的例程会使用xlsread 函数来读取系统参数、期望数据,而xlswrite函数主要会用于PID参数优化例程,将优化的PID参数保存在Excel文件中。
(4)软件设计
本小节例程位于“2、飞控例程\Matlab\(2)飞行控制——四旋转子\A4_串级PID控制”中。
例程功能为:读取Excel文件中的参数到程序,使用串级PID同时对四旋转子系统的角度、角速度进行控制。
例程中的文件如图5.9.21所示,主要修改了“A2_init.m”、“C_Cascade_PID.m”等文件。
图5.9.21
1)A2_init.m 文件
%% 初始化各参数
data_i = xlsread('输入_系统参数.xlsx'); %只读取数值数据
Ts = data_i(2, 4); %采样时间
t = data_i(3, 4);
t = 0:Ts:t;
Num = length(t); %离散数
M_Motor; %初始化 电机系统 动态模型
M_Four_turn_rotor; %初始化 四旋转子 转速系统 动态模型
C_Cascade_PID; %初始化 串级PID控制器
- 行3
与之前不同的是此处添加了读取Excel文件的代码,通过“xlsread”函数,读取’输入_系统参数.xlsx’文件中的数据到变量“data_i”。'输入_系统参数.xlsx’文件位于例程文件夹下,主要保存有要用到的各类参数,如图5.9.22所示:
图5.9.22
- 行5~6
将第2行第4列的数据赋值给“Ts变量”,将第3行第4列的数据赋值给“t”变量。两个数据在Excel中的位置如图5.9.22所示。其它文件中对参数的初始化与之类似。
2)C_Cascade_PID.m 文件
%% 四旋翼 串级PID 控制器
% 输入:
% s_A.y 角度系统的输出
%
% 输出
% s_mot.u_all 四个电机的功率
%%
if init == 0 %未初始化
% 以下各变量是行数为 2 的矩阵,分别与y轴角度(Ay)、角速度(Wy)相关
s_pid.d = data_i(26:27, 4); %串级PID期望,y轴角度、角速度,单位:deg、deg/s
s_pid.d = s_pid.d *pi/180; %转化单位为弧度
s_pid.K_pid = data_i(14:15, 4:6); %PID参数
s_pid.e_last = zeros(2, 1);
s_pid.Ei = zeros(2, 1);
s_pid.y = zeros(2, 1);
% PID输出转电机功率 矩阵
s_pid.Out_M = [ -1 -1 1 1;
-1 1 -1 1;
1 -1 -1 1;
1 1 1 1;]; % PID输出转电机功率 矩阵
else %进行控制
% 角度环
s_pid.e(1) = s_pid.d(1) - s_A.y(1, 1); %角度 期望与测量误差
[s_pid.y(1), s_pid.Ei(1)] = C_PID(Ts, s_pid.K_pid(1, :), s_pid.e(1), s_pid.e_last(1), s_pid.Ei(1));
s_pid.e_last(1) = s_pid.e(1); %保存本次误差
% 角速度环
s_pid.e(2) = ( s_pid.d(2) + s_pid.y(1) ) - s_A.y(2, 1); %角速度 期望与测量误差
% s_pid.e(2) = ( s_pid.d(2) ) - s_A.y(2, 1);
[s_pid.y(2), s_pid.Ei(2)] = C_PID(Ts, s_pid.K_pid(2, :), s_pid.e(2), s_pid.e_last(2), s_pid.Ei(2));
s_pid.e_last(2) = s_pid.e(2); %保存本次误差
% PID输出转化为各电机功率
s_pid.PID_out = [s_pid.y(2) 0 0 500]'; %x、y、z三轴角速度环输出、z轴速度环输出
s_mot.u_all = s_pid.Out_M*s_pid.PID_out; %PID输出 转 电机控制功率
% 电机功率限幅
s_mot.u_all = min(s_mot.u_all, s_mot.u_max);
s_mot.u_all = max(s_mot.u_all, 0);
end
- 行11~18
将读取到的Excel数据,赋值给s_pid变量下对应的子元素变量。 - 行28~36
为串级PID实际运行的部分。其中行2829与式(5.9.28.b)、(5.9.28.c)对应;行3335与式(5.9.38.d)~(5.9.38.e)对应。 - 行40
将角速度环PID的输出作为串级PID的总输出控制量。
例程其它部分基本与之前例程相同。
(5)运行与调试
本小节例程可以通过“输入_系统参数.xlsx”文件,直接修改系统的参数。除硬件参数外有这样几个比较重要的仿真参数:
-
1)串级PID参数,位于行14~15,其中行14为角度环PID,行15为角速度环PID,如图5.9.23:
图 5.9.23
-
2)串级PID期望,位于行26~27,分别为角度、角速度期望,如图5.9.24:
图 5.9.24
双击进入“A1_main.mlx”文件,点击上方“实时编辑器”中的“运行”按钮即可运行例程。运行结果如图5.9.23所示,可以发现经过串级PID控制,在1.5秒后四旋转子的角度与角速度都已经接近期望。
(a)
(b)
图 5.9.23