5.9.9 串级PID控制器

2024-08-22 08:36
文章标签 控制器 5.9 pid 串级

本文主要是介绍5.9.9 串级PID控制器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 5.9.9 串级PID控制器
        • (1)串级PID控制器原理
        • (2)内环与外环
        • (3)Matlab读写Excel文件数据
        • (4)软件设计
        • (5)运行与调试

总目录: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]=AxdAx[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/ss_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

这篇关于5.9.9 串级PID控制器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095774

相关文章

jmeter之仅一次控制器

仅一次控制器作用: 不管线程组设置多少次循环,它下面的组件都只会执行一次 Tips:很多情况下需要登录才能访问其他接口,比如:商品列表、添加商品到购物车、购物车列表等,在多场景下,登录只需要1次,我们期望的是重复执行登陆后面的接口来做压测,这就和事务相关,例如 事务1: 登录—>添加购物车 事务2: 登录—>购物车列表 事务3: 登录—>商品列表—>添加购物车 … 一、仅一次控制器案例 在

为控制器的方法添加必要参数

前言:做这个系统时,要求每次调用接口时要传操作人、操作人电脑ip、菜单id,然后计入log。本来前端读取到然后加入请求头,后端写入log即可。但是老大要求后端也要把控必传参数,避免前端忘记。所以就写了这个。IOperationFilter 这个是百度知道的。主要用于在Swagger生成的API文档中动态地添加或修改操作(即API接口)的元数据。 用处:可以自动地为 Swagger/OpenAPI

IBM Storwize V7000存储控制器故障节点报错574

背景:由于客户机房搬迁,需要下电迁移设备。该存储自2016年投入生产使用后,从未关过机,已正常运行七八年时间,期间只更换过硬盘,无其他硬件故障。 在GUI界面点击关闭系统后,大概等了40分钟,存储仍未关机,所有硬盘状态灯绿色常亮,面板无报错。到设备后面看控制器的状态,发现node2已经正常关机了,node1仍然在运行,又等了大概20分钟还没有关机,直接将电源线给拔掉了。 再次上电以后,发现

Matlab/Simulink和AMEsim联合仿真(以PSO-PID算法为例)

目录 安装软件和配置环境变量 Matlab/Simulink和AMEsim联合仿真详细流程 非常重要的一点 Simulink模型和AMEsim模型用S-Function建立连接 从AMEsim软件打开Matlab Matlab里的设置 Matlab的.m文件修改(对于PSO-PID算法) 运行程序 我印象中好像做过Matlab/Simulink和AMEsim联合仿真的分享似的

Windows11上使用WSL2,提示:系统尚未使用systemd作为初始化系统(PID 1)启动

前言 略 报错信息 System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down 解决方法 使用如下命令 # windows终端,执行如下命令wsl --update# 登录ubuntu系统,执行如下命令s

s3c2440---中断控制器

一、概述 S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设,如 DMA 控制器、 UART、IIC 等等。 在这些中断源中,UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求 ARM920T 内核的 FIQ 或 IRQ。 仲裁步骤由硬件优先级逻辑决定

带死区的PID控制算法

带死区的PID控制算法 带死区的PID控制算法: 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 带死区的PID控制算法: 在计算机控制系统中,某些系统为了避免控制作用过于频繁,消除由于频繁动作所引起的震荡,可采用带死区的PID控制算法,控制算式为: e ( k ) = { 0 ∣ e ( k ) ∣ ≤ ∣ e 0

微分先行PID控制算法

微分先行PID控制算法 微分先行PID控制算法: 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 微分先行PID控制算法: 微分先行PID控制结构,其特点是只对输出量 y ( k ) y(k) y(k)进行微分,而对给定值 y d ( k k ) y_d(kk) yd​(kk)不做微分。这样,在改变给定值时,输出不会改变

不完全微分PID控制算法

不完全微分PID控制算法 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 在PID控制中,微分信号的引入可改善系统的动态特性,但也容易引起高频干扰,在误差扰动突变时尤其显出微分项的不足。若在控制算法中加入低通滤波器,则可以使系统性能得到改善。 克服上述缺点的方法之一是在PID算法中加入一个一阶惯性环节(低通滤波器) G f

变速积分PID控制算法

变速积分PID控制算法 变速积分PID控制算法:变速积分PID的基本思想:变速积分的PID积分项表达式: 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 变速积分PID控制算法: 在普通的PID控制算法中,由于积分系数 k i k_i ki​是常数,所以在整个控制过程中,积分增量不变。而系统对积分项的要求是,系统偏差大