最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助。作者Brett Beauregard的原文网址:http://brettbeauregard.com/blog/2011/04/improving-the-beginner’s-pid-onoff/

1、问题所在

有一个 PID 控制器虽然是很好的,但你并不是什么时候都需要它。

假设在程序中的某个时刻,您希望将输出强制为某个值 (例如 0),您当然可以在调用例程中执行此操作:

void loop()
{Compute();Output=0;
} 

这样,无论 PID 输出是什么,您只需覆盖其值。然而,这在实践中是一个可怕的想法。PID 会变得非常混乱:“我一直发送输出,但是什么都没有发生!到底发生了什么事? !我再发送一下。”因此,当您停止覆盖输出并切换回 PID 时,您可能会立即得到一个巨大的输出值改变。

2、解决方案

解决这个问题的办法是有办法关闭和打开 PID。这些状态的常用术语是 "手动" (我将手动调整输出值) 和 "自动" (PID 将自动调整输出)。让我们看看这是如何在代码中完成的。

3、代码

/*working variables*/
unsigned long lastTime;
double Input,Output,Setpoint;
double ITerm,lastInput;
double kp,ki,kd;
int SampleTime = 1000; //1 sec
double outMin,outMax;
bool inAuto = false;
#define MANUAL 0
#define AUTOMATIC 1
void Compute()
{if(!inAuto) return;unsigned long now = millis();int timeChange = (now - lastTime);if(timeChange>=SampleTime){/*Compute all the working error variables*/double error = Setpoint - Input;ITerm+= (ki * error);if(ITerm> outMax) ITerm= outMax;else if(ITerm< outMin) ITerm= outMin;double dInput = (Input - lastInput);/*Compute PID Output*/Output = kp * error + ITerm- kd * dInput;if(Output > outMax) Output = outMax;else if(Output < outMin) Output = outMin;/*Remember some variables for next time*/lastInput = Input;lastTime = now;}
}
void SetTunings(double Kp,double Ki,double Kd)
{double SampleTimeInSec = ((double)SampleTime)/1000;kp = Kp;ki = Ki * SampleTimeInSec;kd = Kd / SampleTimeInSec;
}
void SetSampleTime(int NewSampleTime)
{if (NewSampleTime > 0){double ratio  = (double)NewSampleTime/ (double)SampleTime;ki *= ratio;kd /= ratio;SampleTime = (unsigned long)NewSampleTime;}
}
void SetOutputLimits(double Min,double Max)
{if(Min > Max) return;outMin = Min;outMax = Max;if(Output > outMax) Output = outMax;else if(Output < outMin) Output = outMin;if(ITerm> outMax) ITerm= outMax;else if(ITerm< outMin) ITerm= outMin;
}
void SetMode(int Mode)
{inAuto = (Mode == AUTOMATIC);
}

一个相当简单的解决方案。如果您不在自动模式下,请立即离开计算函数,而不调整 "输出" 或任何内部变量。

4、最终结果

的确,您可以通过不象例程那样调用计算来实现类似的效果,但此解决方案保持PID所包含的工作原理,这是我们所需要的。通过保持事物的内部过程,我们可以跟踪处于哪种模式中,更重要的是,当我们改变模式时,它让我们知道有哪些工作需要进行。这就引出了下一期.....。

欢迎关注:

改进初学者的PID-手自动切换相关推荐

  1. PID控制器改进笔记之二:改进PID控制器之手自动切换

    前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...

  2. jquery,js实现手机端全屏轮播图手动滑动+自动切换(autoplay)

    jquery,js实现手机端全屏轮播图 使用了swiper插件,可手动滑动切换也可自动切换 效果图 css代码 只是作为参考,可以根据你自己的需求去改,这里我用的是上下两张背景图,图自行修改 html ...

  3. thinkcmf5.1项目实现pc端和wap手机端自动切换

    用thinkcmf5.1写项目的时候如何实现PC端和手机端自动切换? 1.首先找到data/config/template.php文件 复制    'cmf_admin_default_theme'  ...

  4. 改进初学者的PID-介绍

    最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...

  5. Win10《芒果TV》更新v3.8.70周年版:升级高级配色、自动切换夜间模式

    官宣!光阴似箭,已过三年时光,我们一起从最初的青涩变成更加成熟起来,同呼吸共命运,匠心依旧,感恩有你,Win10版<芒果TV>全平台同步更新周年版v3.8.70,升级高级配色,新增自动切换 ...

  6. Redis主从配置及通过Keepalived实现Redis自动切换高可用

    Redis主从配置及通过Keepalived实现Redis自动切换高可用 [日期:2014-07-23] 来源:Linux社区  作者:fuquanjun [字体:大 中 小] 一:环境介绍: Mas ...

  7. 结合keepalived实现redis群集高可用故障自动切换

    系统架构图: 我们所要实现的目的很简单, 104,107 为keepalive和redis主从架构,其余服务器比如105.106均为redis从库并且挂在vip 192.168.56.180下面. 主 ...

  8. DL之NN:NN算法(本地数据集50000张训练集图片)进阶优化之三种参数改进,进一步提高手写数字图片识别的准确率

    DL之NN:NN算法(本地数据集50000张训练集图片)进阶优化之三种参数改进,进一步提高手写数字图片识别的准确率 导读 上一篇文章,比较了三种算法实现对手写数字识别,其中,SVM和神经网络算法表现非 ...

  9. hadoopHA自动切换不成功的坑

    在hadoop安装配置过程中,有很多同学按照网上教程配置完成,并启动HA即两台NameNode后,看到其中一台服务器是active,另一台则是standby模式,而且文件也可以正常写入到hdfs中,但 ...

  10. 切换账号_微软 Edge 更新:自动切换工作 / 生活账号,移动端上线集锦功能

    IT之家7月22日消息 微软合作伙伴大会 Microsoft Inspire 2020 今日正式开启,微软在此次大会上向用户展示了其 Microsoft Edge 浏览器的一些新功能.其中包括自动切换 ...

最新文章

  1. CNN模型之MobileNet
  2. Yann LeCun:未来几十年AI研究的最大挑战是「预测世界模型」
  3. 自动化测试报告(ReportNG)手把手教你
  4. 【ArcGIS遇上Python】从入门到精通系列之第二章:ArcGIS Python基本语法基础速递
  5. 如何Super Vectorizer从Mac 上的图像中删除多余的颜色区域?
  6. linux手机用什么购物支付,商城系统的微信支付应该如何配置?
  7. 20个MySQL运维案例,请查收!
  8. 【BZOJ1912】【codevs1613】巡逻
  9. Golang--defer的mi魂汤
  10. 1047 糖果 01背包扩展
  11. Java 序列化漏洞多到修不完
  12. 有才!学生发文言文请假条,老师连称赞
  13. 移动宽带连不上微软服务器,移动宽带有些网站打不开怎么解决?
  14. 台式计算机怎么开声音,台式机如何设置声音
  15. 阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践
  16. 计算机考研和软件的区别吗,考研考计算机与考软件有什么区别
  17. 智能车心得分享(五)-- 电磁排布
  18. x在计算机中是哪个按键,电脑键盘x号怎么打出来
  19. PostgreSQL,MongoDB,Neo4j,OrientDB和ArangoDB比较
  20. raspberrypi三天玩能人脸识别

热门文章

  1. Transformer and set Trasformer
  2. day21 面向对象之继承和组合
  3. python经典一百道习题(转自奶酪博客)
  4. 玩转python(2)多线程的历史2
  5. MapReduce过程详解及其性能优化
  6. 我该如何维护一个烂项目?
  7. JSTL标签库中fmt标签,日期,数字的格式化
  8. [转载]ubuntu 12.10 软件源更新列表
  9. ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载)
  10. TCP的拥塞控制机制