理论部分参考:https://blog.csdn.net/foxclever/article/details/80633275

这里附上写的matlab程序:

clear all;
close all;%获取控制对象离散化模型
ts = 20;  %采样时间
sys = tf([1],[60,1],'inputdelay',80);
dsys = c2d(sys,ts,'zoh');
[num,den]=tfdata(dsys,'v');%获取滤波器离散化模型(这里的滤波器模型是微分模型*积分模型的模型)
sys1=tf([14/0.36,1],[14/0.36*0.5,1]); %滤波器模型
dsys1 = c2d(sys1,ts,'tucsin');%模型离散化
[num1,den1]=tfdata(dsys1,'v');d_filter_out_1=0;d_filter_input_1=0;%滤波器上一时刻输入%设置pid参数
k_p=0.36;
k_i=0.0021;
k_d=14;
gama=0.5;
td=k_d/k_p;c1=gama*td/(gama*td+ts);
c2=(td+ts)/(gama*td+ts);
c3=td/(gama*td+ts);%设置输入信号形式
%y_d = ones(1,100);   %输入信号为阶跃信号
%y_d = [ones(1,250) zeros(1,250)]; 输入信号为阶跃信号for k=1:1:400%输入信号为正弦信号y_d(k) = 1.0*sign(sin(0.00025*2*pi*k*ts))+0.05*sin(0.03*pi*k*ts); endy = zeros(1,400);%初始化输出信号
y_feed=zeros(1,400);%反馈回来的信号,y_feed=y
d_filter_out=zeros(1,400);%经过滤波器后的输出
erro = zeros(1,400);%信号差值
erro_1 = 0;
erro_total = 0;%信号差值累计值
y_1=0;%上一时刻的输出
y_2=0;%上一上一时刻的输出
y_3=0;%上一上一上一时刻的输出pi_out=0;  %pid控制器的输出,注意不是系统输出
pi_out_1=0;%上一时刻pid控制器的输出,注意不是系统输出
pi_out_2=0;%上一上一时刻pid控制器的输出,注意不是系统输出
pi_out_3=0;%上一上一上一时刻pid控制器的输出,注意不是系统输出
pi_out_4=0;%上一上一上一时刻pid控制器的输出,注意不是系统输出
pi_out_5=0;%上一上一上一时刻pid控制器的输出,注意不是系统输出% m用来选择是否用不完全篇pid
% m=1:用微分先行pid
% m=2:普通pid
M=input('input the m:');if  M==1for k=1:1:400time(k)=k*ts;  %存储时间,用于后面画图y(k) = -den(2)*y_1+num(2)*pi_out_5 ;%控制对象y_feed(k)=y(k);erro(k) =y_d(k) -  y_feed(k) ;erro_total = erro_total +erro(k) ;d_filter_input= y_feed(k);d_filter_out=c2* d_filter_input-c3*d_filter_input_1;pi_out = k_p*erro(k) +k_i*erro_total*ts+d_filter_out;if  pi_out>=110pi_out=110;endif  pi_out<=-110pi_out=-110;end%更新系统输出状态y_1=y(k);%更新pid输出状态pi_out_5=pi_out_4; pi_out_4=pi_out_3;pi_out_3=pi_out_2;pi_out_2=pi_out_1;pi_out_1=pi_out;%更新滤波器的状态%d_filter_out_1=d_filter_out;d_filter_input_1= d_filter_input;end%画图plot(time,y_d,'r',time,y_feed,'k:','linewidth',2);xlabel('time');ylabel('y and y_d');legend('yd','y');
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if  M==2for k=1:1:400time(k)=k*ts;  %存储时间,用于后面画图y(k) = -den(2)*y_1+num(2)*pi_out_5 ;%控制对象y_feed(k)=y(k);erro(k) =y_d(k) -  y_feed(k) ;erro_total = erro_total +erro(k) ;pi_out = k_p*erro(k) +k_i*erro_total*ts+k_d*(erro(k)-erro_1)/ts;if  pi_out>=110pi_out=110;endif  pi_out<=-110pi_out=-110;end%更新系统输出状态y_1=y(k);erro_1= erro(k);%更新pid输出状态pi_out_5=pi_out_4; pi_out_4=pi_out_3;pi_out_3=pi_out_2;pi_out_2=pi_out_1;pi_out_1=pi_out;end%画图plot(time,y_d,'r',time,y_feed,'k:','linewidth',2);xlabel('time');ylabel('y and y_d');legend('yd','y');
end

结果:


但是目前仍存在疑问:
根据推导的微分的模型:d_filter_out=c1*d_filter_out_1+c2* d_filter_input-c3*d_filter_input_1;%
应该要在后面对d_filter_out_1进行迭代替换,但是如果替换了会出现明显得震荡,但如果将它永远设为0就不会出现。在查阅很多别人的代码时也发现别人也没有对他进行迭代替换??

微分先行PID控制器的实现相关推荐

  1. PID控制器开发笔记之七:微分先行PID控制器的实现

    前面已经实现了各种的PID算法,然而在某些给定值频繁且大幅变化的场合,微分项常常会引起系统的振荡.为了适应这种给定值频繁变化的场合,人们设计了微分先行算法. 1.微分先行算法的思想 微分先行PID控制 ...

  2. 微分先行PID控制算法用C语言实现!

    1.微分先行PID控制算法框图 2.微分先行PID控制算法公式 3.微分先行PID控制公式用C语言实现 微分先行的PID算法实现,包括位置型和增量型两种实现方式. (1)位置型 void PIDReg ...

  3. 微分先行PID控制算法

    微分先行PID控制算法 微分先行PID控制算法: 注:本文内容摘自<先进PID控制MATLAB仿真(第4版)>刘金琨 编著,研读此书受益匪浅,感谢作者! 微分先行PID控制算法: 微分先行 ...

  4. 用matlab微分先行设计,基于MATLAB的微分先行PID控制的设计与仿真

    第 34卷 第 1期 2014 年 1月 高 师 理 科 学 刊 Journal of Science of Teachers College and University Vo1.34 No.1 J ...

  5. 用matlab微分先行设计,微分先行控制系统.doc

    微分先行控制系统微分先行控制系统 过程控制工程课程设计报告 设计题目:微分先行控制系统 目录 一.微分先行系统控制仿真简介------------2 二.微分先行控制仿真实例------------- ...

  6. matlab数字pid控制仿真程序,基于MATLAB的数字PID控制器设计及仿真分析

    基于MATLAB的数字PID控制器设计及仿真分析 基于基于MATLABMATLAB的数字的数字PIDPID控制器设计及仿真分析控制器设计及仿真分析 摘摘 要要 PID控制作为历史最为悠久,生命力最强的 ...

  7. 匿名飞控TI版_PID部分,串级PID,微分先行,前馈控制

    文章目录 PID介绍 有趣的故事 控制模型 位置式PID和增量式PID 位置式PID 增量式PID 串级PID 前馈控制 微分先行 匿名代码分析 PID介绍 PID介绍 有趣的故事 PID的故事 \s ...

  8. PID控制器(比例-积分-微分控制器)

    PID控制器(比例-积分-微分控制器)- I 形象解释PID算法 小明接到这样一个任务: 有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置, ...

  9. PID控制器(比例-积分-微分控制器)- I

    原文链接:https://www.cnblogs.com/shangdawei/p/4825259.html 形象解释PID算法 小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变 ...

最新文章

  1. MySQL Xtrabackup备份和恢复
  2. 如何创建复杂的机器学习项目?
  3. 怎么用python画简单的图-python中简单易学的绘图:用turtle画太极图
  4. PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
  5. 机器人庄园作文_十年后的家乡作文精选8篇
  6. spring boot 三种入参
  7. ILP32和LP64数据模型
  8. Lua 中写 C 扩展库时用到的一些技巧
  9. 跟据URL来实现WebService
  10. 6-2 视频分解图片
  11. 球球大作战代点链接源码c语言,最新球球大作战代点源码无加密开源-球球大作战一天刷100个棒棒糖和刷龙蛋200个源码下载免费版-西西软件下载...
  12. eclipse使用教程(图文)
  13. matlab算sma,SMA_移动平均及双均线模型
  14. VGG合成文字数据生成方法
  15. 扫雷可以用计算机,接龙扫雷Windows经典游戏原来还有这些用处啊
  16. h5如何实现贪吃蛇小游戏
  17. Python|城市公交线路名称获取
  18. 【Linux】gcc/g++的使用详解静动态库
  19. 电子病历质控系列-医疗质量工作任务003
  20. 阿里云服务器搭建JAVA环境详解(jdk+mysql+tomcat)

热门文章

  1. 文件搜索引擎FileSearch
  2. title啥意思?网址title题目书写
  3. 处理python问题之append
  4. 学会这个神器和技巧,低代码开发高端可视化大屏
  5. 使用unity制作简单的VR时打包APK出现的几个问题
  6. 如何选择服务器租用、服务器托管、云主机?
  7. 理想职业计算机程序英语作文,我理想的职业英语作文
  8. WinCE6.0HIVE注册表
  9. ICAN业务流程外包是在CRMservices的专业领导机构
  10. 2015年3月10日