增量式PID的matlab实现
首先,增量式PID的实现公式:

式中 Δe(k)=e(k)-e(k-1)
进一步可以改写成
式中 、
、
为了便于理解,也可写成:

式中e(k)为第k次采样时的设定值与实际值的差,e(k-1)为上一次采样时的设定值与实际值的差值,e(k-2)一样类推。
所以增量式PID 输出的是控制量的增量,无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
而且,由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,
因此对系统影响较大。
下面是用Matlab 对增量式PID的仿真。
%执行机构需要的是控制量的增量,例如驱动不仅电机的时候,采用增量式PID控制,
%增量式PID控制算法中不需要累加,控制增量u(k)仅与最近k次的采样有关,所以误动作影响小。
%设一被控对象G(s)=/(.125s^+7s),
%用增量式PID控制算法编写仿真程序
%(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-,],
% 仿真曲线包括系统输出及误差曲线,并加上注释、图例)。 clc;
clear ;
ts=0.001; %采样时间
%sys=tf(,[0.125,, ]); %tf是传递函数,用来实现G(s); 在自动控制领域经常用到,
sys=tf(,[,,]);
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=[,,]';
error_1=;
error_2=;
for k=::
time(k)=k*ts; %采样次数 S=; %选择需要跟踪的函数
if S==
% kp=;ki=0.1;kd=; %初始化PID
kp=;ki=0.1;kd=;
rin(k)=; %Step Signal ,阶跃信号
end
if S==
kp=;ki=0.1;kd=;
rin(k)=0.5*sin(*pi*k*ts); %Sine Signal 正弦信号
end
if S== %三角波信号
kp=;ki=0.1;kd=;
if mod(time(k),)<
rin(k)=mod(time(k),);
else
rin(k)=-mod(time(k),);
end
rin(k)=rin(k)-0.5;
end
if S== %锯齿波信号
kp=;ki=0.05;kd=; %测试得合适参数,如果输出过冲,可将kd调小。
rin(k)=mod(time(k),);
end du(k)=kp*x()+kd*x()+ki*x(); %PID Controller 控制系数
u(k)=u_1+du(k); if u(k)>= %Restricting the output of controller,输出限幅
u(k)=;
end
if u(k)<=-
u(k)=-;
end %Linear model
yout(k)=-den()*y_1-den()*y_2+num()*u_1+num()*u_2; %实际输出
error(k)=rin(k)-yout(k); %Return of parameters 误差
u_2=u_1; %保存上上次输入 为下次计算
u_1=u(k); %保存上一次控制系数 为下次计算
y_2=y_1; %保存上上次次输出 为下次计算
y_1=yout(k); %保存上一次输出 为下次计算 x()=error(k)-error_1; %Calculating P
x()=error(k)-*error_1+error_2; %Calculating D
x()=error(k); %Calculating I error_2=error_1;
error_1=error(k);
end figure();
plot(time,rin,'b',time,yout,'r'); %输入 和实际控制输出
xlabel('time(s)'),ylabel('rin,yout');
% figure();
% plot(time,error,'r') %输入与输出误差输出曲线
% xlabel('time(s)');ylabel('error');
对锯齿信号的追踪图形:

增量式PID的matlab实现的更多相关文章
- 增量式PID计算公式4个疑问与理解
一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...
- 增量式PID简单翻板角度控制
1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...
- 位置式PID与增量式PID算法
位置式PID与增量式PID算法 PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 ...
- 增量式PID的stm32实现(转)
源:增量式PID的stm32实现,整定过程 首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异. 资料上比较多的是: 还有一种是: ...
- 位置式PID与增量式PID
//位置式PID float Kp; float Ki; float Kd; float eSum,e0,e1; float pid_control(float now,float target) { ...
- 【转】位置式、增量式PID算法C语言实现
位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...
- 增量式pid和位置式PID参数整定过程对比
//增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx-& ...
- C 语言实现增量式PID
一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码. 我的理解就是pid其实就是对你设置的预定参数进行跟踪.在控制 ...
- 外置式与增量式PID模板程序(51单片机c语言)
外置式PID模板 #define MuBiaoCS 0 //目标常数 #define CHang_aCS 0 //比例常数 #define CHang_bCS 0 //积分常数 #define CHa ...
随机推荐
- ggplot2——简介
ggplot2是R语言最为强大的作图软件包,强于其自成一派的数据可视化理念.当熟悉了ggplot2的基本套路后,数据可视化工作将变得非常轻松而有条理. 本文主要对ggplot2的可视化理念及开发套路做 ...
- 关于Unity中物理引擎的使用
物理引擎控制刚体,刚体上面贴上图片,所以看起来就是游戏运行起来的状态 物理世界计算刚体的运行状态,通过贴图显现出运算结果. 一.物理引擎 1:Unity 2D物理引擎基于Box2D封装而成;2: 物理 ...
- imx6 读取CPU温度
imx6 读取CPU温度 cat /sys/class/thermal/thermal_zone0/temp Tony Liu 2017-2-11, Shenzhen
- e641. 使一个组件成为拖放目标
public class DropTargetComponent extends JComponent implements DropTargetListener { public DropTarge ...
- Climbing Stairs爬楼梯——动态规划
题目描写叙述: 初阶:有n层的台阶,一開始你站在第0层,每次能够爬两层或者一层. 请问爬到第n层有多少种不同的方法? 进阶:假设每次能够爬两层.和倒退一层,同一个位置不能反复走,请问爬到第n层有多少种 ...
- Python的可变对象与不可变对象。
参考:http://thomaschen2011.iteye.com/blog/1441254 Python基础:Python可变对象和不可变对象 http://blog.jobbo ...
- Perl Spreadsheet::WriteExcel 模块自动生成excel 文件
Spreadsheet::WriteExcel 是一个跨平台的生成excel文件的模块, 可以方便的设置单元格内容, 样式, sheet 的名称: 但是默认情况下中文会乱码, 需要用Encode模块进 ...
- ZABBIX API简介及使用
API简介 Zabbix API开始扮演着越来越重要的角色,尤其是在集成第三方软件和自动化日常任务时.很难想象管理数千台服务器而没有自动化是多么的困难.Zabbix API为批量操作.第三方软件集成以 ...
- 微信绑定用户服务端代码-根据code获取openId然后绑定用户
目录结构: isa.qa.core.weixin.message.resp包和isa.qa.core.weixin.util包中为微信绑定的工具类,就不一一贴出代码,详见附件,下载地址: http:/ ...
- 关于使用_bstr_t的一个坑
编程中需要将_variant_t转换为char*,常用的方法是:(const char*)_bstr_t(c_variant_t); 使用_bstr_t的构造函数: _bstr_t(const _v ...