请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册
查看: 4438|回复: 0

控制对象离散化--时滞系统PID仿真

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-3-5 15:19:19 | 显示全部楼层 |阅读模式
  1. %专家PID控制--无时滞
  2. clc% 清屏
  3. clear all;%删除workplace变量
  4. close all;%关掉显示图形窗口

  5. ts=0.001; % 采样时间
  6. sys=tf(5.235e005,[1,87.35,1.047e004,0])  % 传递函数
  7. dsys=c2d(sys,ts,'z'); % 连续模型离散化
  8. [num,den]=tfdata(dsys,'v');% 获得分子分母

  9. u_1=0;u_2=0;u_3=0;
  10. y_1=0;y_2=0;y_3=0;

  11. x=[0,0,0]';
  12. x2_1=0;
  13. % 比例积分微分参数
  14. kp=0.6;
  15. ki=0.03;     
  16. kd=0.01;

  17. error_1=0;
  18. for k=1:1:500
  19. time(k)=k*ts;
  20.    
  21. r(k)=1.0;                    % Tracing Step Signal
  22. % 第k次控制器输出
  23. u(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller

  24. % 控制误差输出的绝对值,避免超调
  25. if abs(x(1))>0.8     
  26.    u(k)=0.45;
  27. elseif abs(x(1))>0.40        
  28.    u(k)=0.40;
  29. elseif abs(x(1))>0.20   
  30.    u(k)=0.12;
  31. elseif abs(x(1))>0.01
  32.    u(k)=0.10;   
  33. end   

  34. % 规则2:误差为某一常数,未发生变化
  35. if x(1)*x(2)>0|(x(2)==0)   
  36.    if abs(x(1))>=0.05
  37.       u(k)=u_1+2*kp*x(1);
  38.    else
  39.       u(k)=u_1+0.4*kp*x(1);
  40.    end
  41. end

  42. % 规则3:误差的绝对值朝减小的方向变化
  43. if (x(1)*x(2)<0&x(2)*x2_1>0)|(x(1)==0)
  44.     u(k)=u(k);
  45. end

  46. %误差处于极值状态
  47. if x(1)*x(2)<0&x(2)*x2_1<0
  48.    if abs(x(1))>=0.05
  49.       u(k)=u_1+2*kp*error_1;
  50.    else
  51.       u(k)=u_1+0.6*kp*error_1;
  52.    end
  53. end
  54. % 误差的绝对值很小
  55. if abs(x(1))<=0.001   % PI控制
  56.    u(k)=0.5*x(1)+0.010*x(3);
  57. end

  58. % 控制输出
  59. if u(k)>=10
  60.    u(k)=10;
  61. end
  62. if u(k)<=-10
  63.    u(k)=-10;
  64. end

  65. %线性模型  Z变换
  66. y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(1)*u(k)+num(2)*u_1+num(3)*u_2+num(4)*u_3;
  67. error(k)=r(k)-y(k);

  68. %Return of parameters
  69. u_3=u_2;u_2=u_1;u_1=u(k);
  70. y_3=y_2;y_2=y_1;y_1=y(k);
  71.    
  72. x(1)=error(k);                % P比例项
  73. x2_1=x(2);
  74. x(2)= error(k)-error_1;       % D微分项
  75. x(3)=x(3)+error(k)*ts;        % I积分项

  76. error_1=error(k);
  77. end
  78. figure(1);
  79. plot(time,r,'b',time,y,'r');
  80. xlabel('time(s)');ylabel('r,y');
  81. grid on
  82. title('PID控制阶跃响应曲线')
  83. figure(2);
  84. plot(time,r-y,'r');
  85. xlabel('time(s)');ylabel('error');
  86. grid on
  87. title('误差响应曲线')
复制代码
输出为:
           523500
  -------------------------
  s^3 + 87.35 s^2 + 10470 s
延迟环节:
  1. ts=0.001; % 采样时间
  2. sys=tf(5.235e005,[1,87.35,1.047e004,0],'ioDelay',10)  % 传递函数
  3. dsys=c2d(sys,ts,'z');        % 连续模型离散化
  4. [num,den]=tfdata(dsys,'v');  % 获得分子分母
复制代码


输出为:
  1.                         523500
  2.   exp(-10*s) * -------------------------
  3.                s^3 + 87.35 s^2 + 10470 s

  4. Continuous-time transfer function.
复制代码






算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-24 08:33 , Processed in 0.222622 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表