PID控制系统仿真

PID控制系统仿真

什么是PID

在这里插入图片描述
PID 算法可以用于温度控制、水位控制、飞行姿态控制等领域。
后面我们通过PID 控制电机进行说明。

PID控制仿真示例

对以下对象进行PID控制,PID控制参数为 k p = 8 , k i = 0.10 , k d = 10 k_p=8, k_i=0.10, k_d=10 kp=8,ki=0.10,kd=10
G ( s ) = 400 s 2 + 50 s G(s) = \frac{400}{s^2+50s} G(s)=s2+50s400
解:(1) 采用MATLAB程序编程实现PID控制

% 增量式PID控制器
clc, clear, close all
ts = 0.001;  % 采样时间
sys = tf(400, [1,50,0]);                 % 传递函数
dsys = c2d(sys, ts, 'z');               % 连续模型离散化
[num, den] = tfdata(dsys, 'v');         % 获得分子分母
% PID控制量
u_1 = 0.0; u_2 = 0.0; u_3 = 0.0;
y_1 = 0;   y_2 = 0;   y_3 = 0;

x = [0, 0, 0]';
% 误差
error_1 = 0;
error_2 = 0;
for k = 1:1:1000
    time(k) = k*ts;

    yd(k) = 1.0;
    % PID参数
    kp = 8;                             % 比例参数
    ki = 0.10;                          % 积分参数
    kd = 10;                            % 微分参数

    du(k) = kp*x(1) + kd*x(2) + ki*x(3);
    u(k) = u_1 + du(k);

    if u(k) >= 10
        u(k) = 10;
    end
    if u(k) <= -10
        u(k) = -10;
    end
    y(k) = -den(2)*y_1 - den(3)*y_2 + num(2)*u_1 + num(3)*u_2;

    error = yd(k) - y(k);
    u_3 = u_2; u_2 = u_1; u_1 = u(k);
    y_3 = y_2; y_2 = y_1; y_1 = y(k);

    x(1) = error - error_1;             % 计算 P
    x(2) = error - 2*error_1 + error_2; % 计算 D
    x(3) = error;                       % 计算 I

    error_2 = error_1;
    error_1 = error;
end

figure(1);
plot(time, yd, 'r', time, y, 'b', 'LineWidth', 2);
xlabel('时间/s'); ylabel('yd,y'); grid on
title('增量式PID追踪响应曲线')
legend('理想位置信号','位置追踪');

figure(2);
plot(time, yd-y, 'r', 'LineWidth',2);
xlabel('时间/s'); ylabel('误差'); grid on
title('增量式PID跟踪误差')

增量式PID阶跃结果如图所示。

(2) 采用MATLAB/Simulink中PID控制器进行模型控制 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0837e0a3b6644003ba7a1c6f18e8da52.png) * *使用到的模块:* Step、Add、PID Controller、Transfer Fcn、Scope Step模块阶跃时间: 0 对其仿真,输出图形如图所示(停止时间0.2s) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3ef0f37c117b47a0ae0f44d01a5729ec.png)

(3) 自行搭建PID控制器
在这里插入图片描述

  • 使用到的模块: Step、Add、Gain、Integrator、Derivative、Mux、Transfer Fcn、Scope
    相应的控制输出结果如图所示(停止时间10s)
    在这里插入图片描述
    被控对象为如下所示的三阶传递函数,输入一正弦函数 y d ( k ) = 0.05 sin ⁡ ( 2 π t ) y_d(k)=0.05\sin(2\pi t) yd(k)=0.05sin(2πt),试采用PID控制方法在Simulink中设计控制器,其中PID参数为 k d = 0.5 , k i = 0.02 , k d = 0.5 k_d=0.5, k_i=0.02, k_d=0.5 kd=0.5,ki=0.02,kd=0.5
    G ( s ) = 523500 s 3 + 87.35 s 2 + 10470 s G(s) = \frac{523500}{s^3+87.35s^2+10470s} G(s)=s3+87.35s2+10470s523500
    解: 采用Simulink模块与Interpreted MATLAB Fcn函数相结合的形式,利用ode45的方法求解。搭建PID控制仿真模型如图所示。
    在这里插入图片描述
    模块参数设置如下:

其中控制器程序如下:

function [u]=Pidsimfcontrol(u1,u2)
persistent errori error_1
t=u1;
if t==0
    errori=0;
    error_1=0;
end

kp=2.5;
ki=0.02;
kd=0.5;

error=u2;
errord=error-error_1;
errori=errori+error;

u=kp*error+kd*errord+ki*errori;
error_1=error;

示波器输出结果如图所示(停止时间1s)
在这里插入图片描述
仿真数据自动保存到工作区中,运行画图程序

close all;

t = out.t;
y = out.y;

figure(1);
plot(t, y(:,1), 'r', t, y(:,2), 'k', 'LineWidth', 2);
xlabel('时间(s)'); ylabel('yd,y');
legend('实际信号', '仿真结果');

figure(2);
plot(t, y(:,1)-y(:,2), 'r', 'LineWidth', 2);
xlabel('时间(s)'); ylabel('误差');
title('误差')

画图程序输出图形如图所示

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值