PID算法Matlab仿真程序和C程序
基于matlab的pid控制仿真课程设计

这篇文章是关于基于Matlab的PID控制仿真课程设计的,主要内容包括PID控制的基本原理、Matlab的应用、课程设计的目的和意义、课程设计的具体步骤和具体操作步骤。
文章采用客观正式的语气,结构合理,旨在解释基于Matlab的PID控制仿真课程设计的重要性和实施方法。
1. 简介PID控制是一种常见的控制算法,由比例项(P)、积分项(I)和微分项(D)组成,可以根据被控对象的实际输出与期望输出的偏差来调整控制器的输出,从而实现对被控对象的精确控制。
Matlab是一种强大的数学建模与仿真软件,广泛应用于工程领域,尤其在控制系统设计和仿真方面具有独特优势。
2. PID控制的基本原理PID控制算法根据被控对象的实际输出与期望输出的偏差来调整控制器的输出。
具体来说,比例项根据偏差的大小直接调整输出,积分项根据偏差的积累情况调整输出,微分项根据偏差的变化速度调整输出。
三者综合起来,可以实现对被控对象的精确控制。
3. Matlab在PID控制中的应用Matlab提供了丰富的工具箱,其中包括控制系统工具箱,可以方便地进行PID控制算法的设计、仿真和调试。
利用Matlab,可以快速建立被控对象的数学模型,设计PID控制器,并进行系统的仿真和性能分析,为工程实践提供重要支持。
4. 课程设计的目的和意义基于Matlab的PID控制仿真课程设计,旨在帮助学生深入理解PID控制算法的原理和实现方法,掌握Matlab在控制系统设计中的应用技能,提高学生的工程实践能力和创新思维。
5. 课程设计的具体步骤(1)理论学习:学生首先需要学习PID控制算法的基本原理和Matlab在控制系统设计中的应用知识,包括控制系统的建模、PID控制器的设计原理、Matlab的控制系统工具箱的基本使用方法等。
(2)案例分析:学生根据教师提供的PID控制实例,在Matlab环境下进行仿真分析,了解PID控制算法的具体应用场景和性能指标。
(3)课程设计任务:学生根据所学知识,选择一个具体的控制对象,如温度控制系统、水位控制系统等,利用Matlab建立其数学模型,设计PID控制器,并进行系统的仿真和性能分析。
学生--PID控制MATLAB仿真实验

计算机控制技术实验指导书(MATLAB版)机电学院杨蜀秦编2012-11-19实验一 连续系统的模拟PID 仿真一、基本的PID 控制 在模拟控制系统中,控制器最常用的控制规律是PID 控制。
模拟PID 控制系统原理框图如图1-1所示。
图1-1 模拟PID 控制系统原理框图PID 控制规律为:⎪⎪⎭⎫⎝⎛++=⎰dt t de T dt t e T t e k t u DtI p )()(1)()(0或写成传递函数的形式⎪⎪⎭⎫ ⎝⎛++==s T s T k s E s U s G D I p 11)()()( Ex1 以二阶线性传递函数ss 251332+为被控对象,进行模拟PID 控制。
输入信号)2.0*2sin()(t t r π=,仿真时取3,1,60===d i p k k k ,采用ODE45迭代方法,仿真时间10s 。
仿真方法一:在Simulink 下进行仿真,PID 控制由Simulink Extras 节点中的PID Controller 提供。
仿真程序:ex1_1.mdl ,如图1-2所示。
图1-2 连续系统PID 的Simulink 仿真程序连续系统的模拟PID 控制正弦响应结果如图1-3所示。
图1-3 连续系统的模拟PID 控制正弦响应仿真方法二:在仿真一的基础上,将仿真结果输出到工作空间中,并利用m 文件作图。
仿真程序:ex1_2.mdl ,程序中同时采用了传递函数的另一种表达方式,即状态方程的形式,其中[]0,01,1330,25010==⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡-=D C B A ,如图1-4所示。
m 文件作图程序:ex1_2plot.mclose all ;plot(t,rin,'k',t,yout,'k'); xlabel('time(s)'); ylabel('r,y');二、线性时变系统的PID 控制 Ex2 设被控对象为Jss Ks G +=2)(,其中)2sin(300400),6sin(1020t K t J ππ+=+=,输入信号为)2sin(5.0t π。
PID控制算法及MATLAB仿真分析

题目:以PID控制进行系统仿真学院自动化学院专业班级工业自动化111班学生姓名黄熙晴目录1 引言 (1)1.1本论文研究内容 (1)2 PID控制算法 (1)2.1模拟PID控制算法 (1)2.2数字式PID控制算法 (3)2.3PID控制算法的改进 (5)2.3.1微分项的改进 (5)2.3.2积分项的改进 (9)2.4模糊PID控制算法 (11)2.4.1模糊推理的系统结构 (12)2.4.2 PID参数在线整定原则 (12)2.5PID控制器研究面临的主要问题 .................................. 错误!未定义书签。
3 MATLAB编程和仿真 (13)3.1PID控制算法分析 (13)3.2MATLAB仿真 (15)4结语 (20)参考文献...................................................................................... 错误!未定义书签。
1 引言PID控制器以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。
光学表面等离子共振生物传感技术受温度影响很大,因此设计高精度的温度控制器对于生物分析仪十分重要。
研究PID的控制算法是PID控制器整定参数优化和设定的关键技术之一。
在工业过程控制中,目前采用最多的控制方式依然是PID方式。
它具有容易实现、控制效果好、鲁棒性强等特点,同时它原理简单,参数物理意义明确,理论分析体系完整,并为工程界所熟悉,因而在工业过程控制中得到了广泛应用。
在实际的应用中,许多被控过程机理复杂,具有高度非线性、时变不确定性和纯滞后等特点,特别是在噪声、负载扰动等因素的影响下,参数复杂烦琐的整定过程一直困扰着工程技术人员。
为了减少参数整定的工作量,克服因环境变化或扰动作用造成系统性能的降低,就要提出一种PID控制参数的自动整定。
1.2本论文研究内容本文在介绍传统的PID控制算法,并对传统算法改进后,在学习的基础上提出一种模糊参数自整定方法,这种模糊控制的PID算法必须精确地确定对象模型。
PID控制和其MATLAB仿真

序号,k=1,2,……,e (k-1)和e (k)分别为第(k-
1)和第k时刻所得旳偏差信号。
1.3.1 位置式PID控制算法
• 位置式PID控制系统
1.3.1 位置式PID控制算法
根据位置式PID控制算法得 到其程序框图。
在仿真过程中,可根据实 际情况,对控制器旳输出 进行限幅:[-10,10]。
• 变速积分旳基本思想是,设法变化积分项旳累加 速度,使其与偏差大小相相应:偏差越大,积分 越慢;反之则越快,有利于提升系统品质。
• 设置系数f(e(k)),它是e(k)旳函数。当 ∣e(k)∣增大时,f减小,反之增大。变速积分 旳PID积分项体现式为:
ui (k )
ki
k
1
e(i)
f
e(k )e(k )T
i0
1.3.8 变速积分算法及仿真
• 系数f与偏差目前值∣e(k)∣旳关系能够是线性 旳或是非线性旳,例如,可设为
1
f
e(k
)
A
e(k A
)
B
0
e(k) B B e(k) A B e(k) A B
1.3.8 变速积分算法及仿真
• 变速积分PID算法为:
u(k)
k
p e(k )
ki
1.3.4 增量式PID控制算法及仿真
• 增量式PID阶跃跟踪成果
1.3.5 积分分离PID控制算法及仿真
• 在一般PID控制中,引入积分环节旳目旳主要是为了 消除静差,提升控制精度。但在过程旳开启、结束或 大幅度增减设定时,短时间内系统输出有很大旳偏差 ,会造成PID运算旳积分积累,致使控制量超出执行机 构可能允许旳最大动作范围相应旳极限控制量,引起 系统较大旳振荡,这在生产中是绝对不允许旳。
Matlab控制系统工具箱的PID控制设计指南

Matlab控制系统工具箱的PID控制设计指南导言控制系统工具箱是Matlab提供的一个用于分析和设计控制系统的工具包。
其中,PID控制是最常用且广泛应用的一种控制算法。
本文将介绍Matlab控制系统工具箱中PID控制的设计指南,帮助读者快速掌握PID控制的原理和实践技巧。
一、PID控制简介PID控制是一种基于比例、积分和微分的控制方法,适用于各种不确定性和变化的系统。
PID控制器通过实时测量系统的误差(e),并计算比例项(P)、积分项(I)和微分项(D)的乘积和,调整输出控制信号(u),进而实现对系统的稳定控制。
二、PID控制的数学模型PID控制器可以用以下的数学模型表示:u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * △e(t)/dt其中,u(t)表示控制器的输出,e(t)表示误差,Kp、Ki和Kd分别代表比例、积分和微分控制器的增益参数。
PID控制的目标是调整这些参数以使误差最小化。
三、PID控制器的参数调节PID控制器的性能和稳定性取决于增益参数的设置。
Matlab控制系统工具箱提供了多种方法来自动或手动地调节这些参数。
1. 自动调参方法Matlab提供了一些自动调参的函数,如pidtune和pidtool。
这些函数可以根据系统的频率响应和稳定性指标,自动选择合适的PID参数。
使用这些方法可以节省调试时间,但需要注意调参结果的合理性和系统实际需求的匹配性。
2. 手动调参方法手动调参是一种通过试验和调整来寻找最佳PID参数的方法。
Matlab中可以使用step函数或PID Controller Tuner App来进行手动调参。
这种方法需要对系统的特性和动态响应有一定的了解,并经过多次试验和优化来寻找最佳参数。
四、PID控制器的性能分析在设计PID控制器时,除了调节参数之外,还需要进行性能分析来评估控制质量和稳定性。
Matlab控制系统工具箱提供了一些常用的性能指标和分析工具。
控制系统pid参数整定方法的matlab仿真

控制系统PID参数整定方法的MATLAB仿真1. 引言PID控制器是一种常见的控制算法,广泛应用于自动控制系统中。
其通过调节三个参数:比例增益(Proportional gain)、积分时间常数(Integral time constant)和微分时间常数(Derivative time constant),实现对被控对象的稳态误差、响应速度和稳定性等性能指标的调节。
PID参数的合理选择对控制系统的性能至关重要。
本文将介绍PID控制器的经典整定方法,并通过MATLAB软件进行仿真,验证整定方法的有效性。
2. PID控制器的整定方法2.1 手动整定法手动整定法是根据经验和试错法来选择PID参数的方法。
具体步骤如下:1.将积分时间常数和微分时间常数设为零,仅保留比例增益,将比例增益逐渐增大直至系统产生较大的超调现象。
2.根据超调响应的情况,调整比例增益,以使系统的超调量接近所需的范围。
3.逐步增加微分时间常数,观察系统的响应速度和稳定性。
4.增加积分时间常数,以减小系统的稳态误差。
手动整定法的优点是简单易行,但需要经验和反复试验,对控制系统要求较高。
2.2 Ziegler-Nichols整定法Ziegler-Nichols整定法是一种基于试探和试错法的自整定方法,该方法通过调整系统的输入信号,观察系统的输出响应,从而确定PID参数。
具体步骤如下:1.将I和D参数设为零,仅保留P参数。
2.逐步增大P参数,直到系统的输出出现大幅度的振荡。
3.记录下此时的P参数值,记为Ku。
4.根据振荡的周期Tp,计算出系统的临界增益Kc = 0.6 * Ku。
5.根据系统的类型选择相应的整定法则:–P型系统:Kp = 0.5 * Kc,Ti = ∞,Td = 0–PI型系统:Kp = 0.45 * Kc,Ti = Tp / 1.2,Td = 0–PID型系统:Kp = 0.6 * Kc,Ti = Tp / 2,Td = Tp / 82.3 Cohen-Coon整定法Cohen-Coon整定法是基于频域曲线拟合的方法,主要应用于一阶和二阶系统的整定。
模糊pid matlab(simulink)仿真详细步骤
下面用一个简单的例子作介绍:(本例不是特别针对实现什么功能,只是为了介绍方便)第一部分创建一个模糊逻辑(.fis文件)第一步:打开模糊推理系统编辑器步骤:在Commond Window 键入fuzzy回车打开如下窗口,既模糊推理系统编辑器第二步:使用模糊推理系统编辑器本例用到两个输入,两个输出,但默认是一个输人,一个输出步骤:1、添加一个输入添加一个输出得如下图2、选择Input、output(选中为红框),在Name框里修改各输入的名称并将And method 改为prod,将Or method 改为 probor提示:在命名时’_’在显示时为下标,可从上图看出。
第三步:使用隶属函数编辑器该编辑器提供一个友好的人机图形交互环境,用来设计和修改模糊推理系中各语言变量对应的隶属度函数的相关参数,如隶属度函数的形状、范围、论域大小等,系统提供的隶属度函数有三角、梯形、高斯形、钟形等,也可用户自行定义。
步骤:1、双击任何一个输入量(In_x、In_y)或输出量打开隶属度函数编辑器。
2、在左下处Range和Display Range处添加取值范围,本例中In_x和In_y的取值范围均为[0 10], Out_x和Out_y的取值范围均为[0 1]3、默认每个输入输出参数中都只有3个隶属度函数,本例中每个输入输出参数都需要用到五个,其余几个需要自己添加:选中其中一个输入输出参数点击Edit菜单,选Add MFS…打开下列对话框将MF type设置为trimf(三角形隶属度函数曲线,当然你也需要选择其他类型) 将Number of MFs 设置为2点击OK按钮同样给其他三个加入隶属度函数4、选中任何一个隶属度函数(选中为红色),在Name 中键入名称,在Type中选择形状,在Params中键入范围,然后回车如下图:5、关闭隶属函数编辑器第四步:使用规则编辑器通过隶规则编辑器来设计和修改“IF...THEN”形式的模糊控制规则。
matlab自整定pid算法
matlab自整定pid算法
MATLAB中有多种方法可以自整定PID算法,以下是其中两
种常见的方法:
1. Ziegler-Nichols方法:
- 首先,将PID控制器的P和I增益设置为零,将D增益设置
为一个较小的非零值。
- 增加P增益,直到系统出现持续的高频振荡。
记录下此时的
P增益,记为Ku。
- 根据振荡的周期T,计算出临界增益Kc:Kc = 0.6 * Ku。
- 将PID控制器的增益重新设置为零,根据以下公式计算PID
控制器的增益:Kp = 0.6 * Kc,Ki = 1.2 / (T * Kc),Kd = 0.075 / (T * Kc)。
- 将这些增益值设置到PID控制器中,进行实际的控制。
2. AMIGO方法:
- 首先,收集系统的开环响应数据,包括输入信号和输出信号。
- 使用AMIGO工具箱读取数据并进行预处理。
- 选择合适的模型结构,例如一阶传递函数、二阶传递函数等。
- 使用AMIGO工具箱中的模型校准方法,例如最小二乘法或
极大似然法,将模型参数校准到实际数据中。
- 根据得到的模型参数,计算PID控制器的增益值。
- 将这些增益值设置到PID控制器中,进行实际的控制。
根据具体的系统和要求,可以选择适合的自整定方法,并使用MATLAB进行实现。
PID控制算法的MATLAB仿真应用
1 GC ( s) K P 1 T s Ts D I 控制器的传递函数可写为:
基于 MATLAB 的 PID 控制在计算机控制中的应用
摘 要:
PID控制器结构和算法简单,应用广泛,但参数整定比较复杂,在此我探讨 利用MATLAB实现PID参数整定及其仿真的方法,并分析比较比例、比例积分、比 例微分控制,探讨Kp,Ti,Td三个参数对PID控制规律的影响。本文介绍了PID 控制器在工业领域中的广泛应用,及PID控制器的理论基础以及其对连续系统性 能指标的改善作用。 本文简要介绍了PID控制器在工业领域中的广泛应用,及PID 控制器的理论基础以及其对连续系统性能指标的改善作用。
1.1.3 微分(D)控制
在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成 正比关系。 自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。 其原因是 由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用, 其变化总是落后于误差的变化。 解决的办法是使抑制误差的作用的变化“超前” , 即在误差接近零时,抑制误差的作用就应该是零。 微分控制能够预测误差变化的趋势,可以减小超调量,克服振荡,使系统的 稳定性提高。同时,加快系统的动态响应速度,减小调整时间,从而改善系统的 动态性能。
1.1.1 比例(P)控制
比例控制是一种最简单的控制方式, 其控制器的输出与输入误差信号成比例 关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。 比例控制作用及时,能迅速反应误差,从而减小稳态误差。但是,比例控制 不能消除稳态误差。其调节器用在控制系统中,会使系统出现余差。为了减少余 差,可适当增大 K P , K P 愈大,余差就愈小;但 K P 增大会引起系统的不稳定, 使系统的稳定性变差,容易产生振荡。
PID自动控制理论实验算法
PID算法matlab程序:clc;clear;close alltic%打开计算CPU时间的计时器desired=1;%期望值feed1=1;%可用阻尼系数B代替,feed2=1;%可以用弹簧系数K代替,B=feed1;K=feed2;Kp=2;%比例项KpKi=0.01;%积分项KiKd=0.01;%微分项Kddt=0.01;%采样时间Time=10;%总共仿真时间(s)n=round(Time/dt);%采样数量%预分配所有数据以优化仿真时间Prop(1:n+1)=0;Der(1:n+1)=0;Int(1:n+1)=0;I(1:n+1)=0;PID(1:n+1)=0;FeedBack(1:n+1)=0;Output(1:n+1)=0;Error(1:n+1)=0;state1(1:n+1)=0;STATE1(1:n+1)=0;state2(1:n+1)=0;STATE2(1:n+1)=0;for i=1:nError(i+1)=desired-FeedBack(i);%输入PID控制器的误差Prop(i+1)=Error(i+1);%比例项误差Der(i+1)=(Error(i+1)-Error(i))/dt;%微分项误差Int(i+1)=(Error(i+1)+Error(i))*dt/2;%积分项误差I(i+1)=sum(Int);%积分误差的总和PID(i+1)=Kp*Prop(i)+Ki*I(i+1)+Kd*Der(i);%%%可以使用你自己的系统替换以下五行STATE1(i+1)=sum(PID);%使用PID计算积分state2(i+1)=(STATE1(i+1)+STATE1(i))*dt/2;%经过第一个积分器后的输出STATE2(i+1)=sum(state2);%对第一个积分器的结果求和以求第二个积分器的结果Output(i+1)=(STATE2(i+1)+STATE2(i))*dt/2;%第二个积分器的输出结果FeedBack(i+1)=state2(i+1)*feed1+Output(i+1)*feed2;end01234567891000.20.40.60.811.21.4Time (sec)simulink 仿真:tsim =toc %仿真时间T =0:dt:Time;%原系统的阶跃响应num =[1];den =[111];c =step(num,den,T);%画图结果Reference =desired*ones(1,i+1);plot(T,Reference,'r',T,c,'g',T,Output,'b')xlabel('Time (sec)')legend('Desired','Original','PID-Control')仿真结果:有缘学习更多+谓ygd3076考证资料或关注桃报:奉献教育(店铺)仿真结果:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
增量式PID控制算法Matlab仿真程序设一被控对象G(s)=50/(0.125s^2+7s),用增量式PID控制算法编写仿真程序(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-5,5],仿真曲线包括系统输出及误差曲线,并加上注释、图例)。
程序如下clear all;close all;ts=0.001;sys=tf(50,[0.125,7, 0]);dsys=c2d(sys,ts,'z');[num,den]=tfdata(dsys,'v');u_1=0.0;u_2=0.0;y_1=0.0;y_2=0.0;x=[0,0,0]';error_1=0;error_2=0;for k=1:1:1000time(k)=k*ts;S=2;if S==1kp=10;ki=0.1;kd=15;rin(k)=1; % Step Signalelseif S==2kp=10;ki=0.1;kd=15; %Sin e Signalrin(k)=0.5*sin(2*pi*k*ts);enddu(k)=kp*x(1)+kd*x(2)+ki*x(3); % PID Controlleru(k)=u_1+du(k); %Restricting the output of controller if u(k)>=5u(k)=5;endif u(k)<=-5u(k)=-5;end%Linear modelyout(k)=-den(2)*y_1-den(3)*y_2+nu m(2)*u_1+num(3)*u_2;error(k)=rin(k)-yout(k);%Return of parametersu_2=u_1;u_1=u(k);y_2=y_1;y_1=yout(k);x(1)=error(k)-error_1; %C alculating Px(2)=error(k)-2*error_1+error_2;%Calculating Dx(3)=error(k); %Calculating I error_2=error_1;error_1=error(k);endfigure(1);plot(time,rin,'b',time,yout,'r'); xlabel('time(s)'),ylabel('rin,yout'); figure(2);plot(time,error,'r')xlabel('time(s)');ylabel('error');微分先行PID算法Matlab仿真程序%PID Controler with differential in advanceclear all;close all;ts=20;sys=tf([1],[60,1],'inputdelay',80); dsys=c2d(sys,ts,'zoh');[num,den]=tfdata(dsys,'v');u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;ud_1=0;y_1=0;y_2=0;y_3=0;error_1=0;error_2=0;ei=0;for k=1:1:400time(k)=k*ts;%Linear modelyout(k)=-den(2)*y_1+num(2)*u_5; kp=0.36;kd=14;ki=0.0021;rin(k)=1.0*sign(sin(0.00025*2*pi*k*ts ));error(k)=rin(k)-yout(k);ei=ei+error(k)*ts;gama=0.50;Td=kd/kp;Ti=0.5;c1=gama*Td/(gama*Td+ts);c2=(Td+ts)/(gama*Td+ts);c3=Td/(gama*Td+ts);M=1;if M==1 %PID Control with differential in advanceud(k)=c1*ud_1+c2*yout(k)-c3*y_ 1;u(k)=kp*error(k)+ud(k)+ki*ei; elseif M==2 %Simple PID Control u(k)=kp*error(k)+kd*(error(k)-er ror_1)/ts+ki*ei;endif u(k)>=110u(k)=110;endif u(k)<=-110u(k)=-110;end%Update parameters u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1; u_1=u(k);y_3=y_2;y_2=y_1;y_1=yout(k);error_2=error_1;error_1=error(k);endfigure(1);plot(time,rin,'r',time,yout,'b'); xlabel('time(s)');ylabel('rin,yout'); figure(2);plot(time,u,'r');xlabel('time(s)');ylabel('u');不完全微分PID算法Matlab仿真程序%PID Controler with Partial differentialclear all;close all;ts=20;sys=tf([1],[60,1],'inputdelay',80); dsys=c2d(sys,ts,'zoh');[num,den]=tfdata(dsys,'v');u_1=0;u_2=0;u_3=0;u_4=0;u_5=0; ud_1=0;y_1=0;y_2=0;y_3=0;error_1=0;ei=0;for k=1:1:100time(k)=k*ts;rin(k)=1.0;%Linear modelyout(k)=-den(2)*y_1+num(2)*u_5; error(k)=rin(k)-yout(k);%PID Controller with partly differentialei=ei+error(k)*ts;kc=0.30;ki=0.0055;TD=140;kd=kc*TD/ts;Tf=180;Q=tf([1],[Tf,1]); %Low Freq Signal FilterM=2;if M==1 %Using PID with Partial differential加在简单PID后的不完全微分alfa=Tf/(ts+Tf);u(k)=alfa*u_1+(1-alfa)*(kc*error( k)+kd*(error(k)-error_1)+ki*ei);u_1=u(k);elseif M==2 %Using PID with Partial differential只加在微分环节上的不完全微分alfa=Tf/(ts+Tf);ud(k)=kd*(1-alfa)*(error(k)-error _1)+alfa*ud_1;u(k)=kc*error(k)+ud(k)+ki*ei;ud_1=ud(k);elseif M==3 %Using Simple PID 简单的PID微分u(k)=kc*error(k)+kd*(error(k)-err or_1)+ki*ei;end%Restricting the output of controller if u(k)>=10u(k)=10;endif u(k)<=-10u(k)=-10;endu_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1; u_1=u(k);y_3=y_2;y_2=y_1;y_1=yout(k);error_1=error(k);endfigure(1);plot(time,rin,'b',time,yout,'r'); xlabel('time(s)');ylabel('rin,yout'); figure(2);plot(time,u,'r');xlabel('time(s)');ylabel('u');figure(3);plot(time,rin-yout,'r');xlabel('time(s)');ylabel('error'); figure(4);bode(Q,'r');dcgain(Q);C语言PID演示程序#include <string.h>#include<stdio.h>typedef struct PID{double Command; //输入指令double Proportion; //比例系数double Integral; //积分系数double Derivative; //微分系数double preErr; //前一拍误差double sumErr; //误差累积}PID;double PIDCale(PID *p,doublefeedback){double dErr,Err;Err=p->Command-feedback; //当前误差p->sumErr+=Err; //误差累加dErr=Err-p->preErr; //误差微分p->preErr=Err;return(p->Proportion*Err //比例项+p->Derivative*dErr //微分项+p->Integral*p->sumErr); //积分项}void PIDInit(PID *p){memset(p,0,sizeof(PID)); //初始化}typedef struct motor{double lastY;double preY;double lastU;double preU;}motor;void motorInit(motor *m){memset(m,0,sizeof(motor));} double motorCal(motor *m,double u){doubley=1.9753*m->lastY-0.9753*m->preY+ 0.00003284*u+0.00006568*m->lastU +0.00003284*m->preU;//二阶系统m->preY=m->lastY;m->lastY=y;m->preU=m->lastU;m->lastU=u;return y;}void main(){FILE *fp=fopen("data.txt","w+"); PID sPID;motor m_motor;int k=0;double u;double y=0;PIDInit(&sPID);sPID.Proportion=2;sPID.Derivative=1;sPID.Integral=0.00001;mand=10;motorInit(&m_motor);while(k<=1000){•fprintf(fp,"%d 设定值=%f 被控量=%f 偏差=%f 控制量=%f\n",k,mand,y,sPImand-y,u);u=PIDCale(&sPID,y);y=motorCal(&m_motor,u);k++;}printf("%f\n",y);fclose(fp);}增量式PID控制C语言代码增量式PID控制C语言代码/////////////////////////////// /////////////////////////////// //// 定义PID参数结构体/////////////////////////////// /////////////////////////////// /typedef struct PID {//结构体定义int SetPoint//设定值int Proportion; / / Proportion 比例系数int Integral;// Integral 积分系数int Derivative;// Derivative 微分系数int LastError; / / Error[-1] 前一拍误差int PreError; / / Error[-2] 前两拍误差} PID;main() {PID vPID;//定义结构变量名PIDInit ( &vPID );//Initialize StructurevPID.Proportion = 10;//Set PID CoefficientsvPID.Integral = 10;// Set PID IntegralvPID.Derivative = 10;// Set PID DerivativevPID. SetPoint =//根据实际情况设定while(1){Verror=Measure();//得到AD的输出值Error =vPID. SetPoint- Verr or; //与设定值比较,得到误差值tempi=PIDCal(&vPID, Error;laser.Value+=tempi;// Value与Num[2]为共同体,共同体名laserLASERH=laser.Num[0];LASERL=laser.Num[1];}}/////////////////////////////// /////////////////////////////// ///////////Title:PID参数初始化//Description: Proportion="0"// Integral=0// LastError=0//Input: PID的P、I控制常数和之前的误差量(PID *pp)//Return://///////////////////////////// /////////////////////////////// ////////void PIDInit (PID *pp)//PID参数初始化,都置0 {memset ( pp,0,sizeof(PID));//memset()的函数,它可以一字节一字节地把整个数组设置为一个指定的值。