PID控制的MATLAB仿真(1)

PID控制的MATLAB仿真(1)PID控制应用广泛,说起来PID特别的简单,在比例负反馈的基础上加入微分项实现快速调节,加入积分项实现无静差。MATLAB强大的功能让学习变得非常简单。在学习智能控制这门课的时候,老师推荐了刘金琨老师的先进PID控制一书,边看边学边调程序。下文程序选自此书。首先从模拟PID开始,被控系统一般是下图这种结构:其中PID控制器:一种用模拟PID控制的磁悬浮:电路图左侧是霍尔传

大家好,又见面了,我是你们的朋友全栈君。

1. 简介

PID控制应用广泛,说起来PID特别的简单,在比例负反馈的基础上加入微分项实现快速调节,加入积分项实现无静差。MATLAB强大的功能让学习变得非常简单。在学习智能控制这门课的时候,老师推荐了刘金琨老师的先进PID控制一书,边看边学边调程序。下文程序选自此书。

2. 模拟PID

首先从模拟PID开始,被控系统一般是下图这种结构:
这里写图片描述

其中PID控制器:
这里写图片描述

一种用模拟PID控制的磁悬浮:
这里写图片描述
这里写图片描述
电路图
这里写图片描述
左侧是霍尔传感器获得磁体的位置,中间是控制器,右侧是驱动部分。U2D是比例放大器,后面的网络引入了微分。

对系统的仿真,可以使用SIMULINK,还可以通过S函数实现:

%S-function for continuous state equation
function [sys,x0,str,ts]=s_function(t,x,u,flag)
switch flag,
%Initialization
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
%Outputs
  case 3,
    sys=mdlOutputs(t,x,u);
%Unhandled flags
  case { 
   2, 4, 9 }
    sys = [];
%Unexpected flags
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end
%mdlInitializeSizes
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 3;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 0;
sys=simsizes(sizes);
x0=[];
str=[];
ts=[];
function sys=mdlOutputs(t,x,u)
error=u(1);
derror=u(2);
errori=u(3);

kp=60;
ki=1;
kd=3;
ut=kp*error+kd*derror+ki*errori;
sys(1)=ut;

3. 离散系统PID

有了方便的计算机,很多时候数字控制器变得特别方便。
对一个系统

1/(1+s)

%Discrete PID control for continuous plant
clear all;
close all;

ts=0.001;  %Sampling time
xk=zeros(2,1);
e_1=0;
u_1=0;

for k=1:1:2000
time(k) = k*ts;

yd(k)=0.50*sin(1*2*pi*k*ts);

para=u_1;
tSpan=[0 ts];
[tt,xx]=ode45('chap1_6plant',tSpan,xk,[],para);
xk = xx(length(xx),:);
y(k)=xk(1); 

e(k)=yd(k)-y(k);
de(k)=(e(k)-e_1)/ts; 

u(k)=20.0*e(k)+0.50*de(k);
%Control limit
if u(k)>10.0
   u(k)=10.0;
end
if u(k)<-10.0
   u(k)=-10.0;
end

u_1=u(k);
e_1=e(k);

D=1;
if D==1  %Dynamic Simulation Display
    plot(time,yd,'b',time,y,'r');
    pause(0.00000000000000000);
end
end
figure(1);
plot(time,yd,'r',time,y,'k:','linewidth',2);
xlabel('time(s)');ylabel('yd,y');
legend('Ideal position signal','Position tracking');
figure(2);
plot(time,yd-y,'r','linewidth',2);
xlabel('time(s)'),ylabel('error');
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142051.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • matlab读取mnist数据集(c语言从文件中读取数据)

    mnistdatabase(手写字符识别)的数据集下载地:http://yann.lecun.com/exdb/mnist/。准备数据MNIST是在机器学习领域中的一个经典问题。该问题解决的是把28×28像素的灰度手写数字图片识别为相应的数字,其中数字的范围从0到9.共有四个文件需要下载:train-images-idx3-ubyte.gz,训练集,共60,000幅(28*28)的图像数据…

    2022年4月17日
    52
  • 动态规划 之背包问题(九讲)[通俗易懂]

    动态规划 之背包问题(九讲)[通俗易懂]背包九讲参考:"AcWing题库"参考书目:"背包九讲"1、01背包问题题目描述:有N件物品和一个容量是V的背包。每件物品只能使用一次。第i

    2022年7月4日
    26
  • js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)

    js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)单选框radio&lt;divclass="radio-inline"&gt;&lt;inputtype="radio"name="killOrder"value="1"/&gt;&lt;labelfor="killOrder1"&gt;是&lt;/label&gt;&lt;/div&gt;&

    2022年5月30日
    228
  • vc6.0控件工具栏_mfc控件隐藏

    vc6.0控件工具栏_mfc控件隐藏DevExpressVCLControls是Devexpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序DevExpressVCLv21.1.6最新版下载具体更新内容如下:此列表包括v21.1.6中已解决的所有问题。所有VCL产品T1035535–如果VCL设计器的DPI值不同于96,DevExpress在RADStud…

    2022年9月24日
    4
  • spring boot 系列之一:spring boot 入门

    最近在学习springboot,感觉确实很好用,开发环境搭建和部署确实省去了很多不必须要的重复劳动。接下来就让我们一起来复习下。一、什么是springboot?springboot是干嘛

    2022年2月16日
    37
  • QUOTENAME (Transact-SQL)「建议收藏」

    QUOTENAME (Transact-SQL)「建议收藏」这个函数会返回一个添加了分隔符的Unicode字符串,这个函数会使得输入的字符串变为一个合法的MicrosoftSQLServer的分隔了的标示符. 格式:QUOTENAME(‘character_string'[,’quote_character’]) 参数:’character_string’这是一个Unicode字符数据组成的字符串.charact…

    2022年7月25日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号