电赛训练了大半个暑假,人渐渐开始进入到了疲倦期。既然这样那就好好休息下自己也好吧。

休息也不能光休息,乘机把平常写过的一些东西好好整理也好。

从第一次训练开始我们就接触到了一个新的名词——PID控制理论。接触这个理论时间还是挺早的。大二某天晚上与学长“促膝交谈”时他就有跟我提起过这个算法。当初他给我说的一个应用的场合就是在智能小车两个轮子速度的控制上,通过pid使得两个轮子的速度尽可能接近相等。那个时候就感觉很纠结,速度控制直接左边慢一点就给左边加速,反之给右边加速。但真正当第一个题目(恒温水壶)做出来的时候就发现,如果用传统的方法去做控制(即温度高则不加温,温度低则加温),控制的提升速度与控制值的超调范围无法达到两者兼顾的效果(这也是为什么最后我们做出来的结果都不怎么好的原因之一,因为我网上百度的pid算法是个伪的。)。理论上(PID到现在为止没有调试成功过),通过PID算法能够使被控制量兼顾效率与精度这两个我们所关注的量。

PID理论说白了就是三个量。Kp,Ki,Kd。

先说下Kp,K是常量的意思,p代表的比例(proportion),Kp可以说是PID算法中必不可少的一个量。没有它控制就不可能实现。它的作用是根据当前量与设定量的差值按照一定比例放大后得到控制量。比如一个温控系统,很自然的我们能够想到当温度越接近我们设定值时我们就越要放慢速度加热,kp就是起一个这样的作用。比如kp我设为10,我设定恒温的温度为60度,当前温度为49度,那么我输出的控制量(使用占空比对热得快实现控温)为10*(60-49)=110;如果当前温度为20度我输出为10*(60-20)=400,但由于400太大了,比最大控制值0xff(255)还大,我就直接255了。如果当前温度为61度我输出为10*(60-61)=-10<0我输出就为0。即不加热让其自然冷却。讲了这么多归纳一个公式就是UKp=Kp*(Uset-Unow),其中UKp是通过Kp这个参数计算所输出的控制量,Uset为设定温度,Unow为当前温度。

接下来就是Ki这个量,i代表的是integration,积分。空洞的说没意思,直接举栗子,依旧是温控系统,当我温度上升到59度时(设定温度是60度)这个时候我通过上面Kp得到的控制量是10,但此时环境温度很低。你10的控制量所提供的能量刚刚好能够抵消掉散失到空气中的热量,此时温度就恒定在59度了,当然这是与60度我们设定的值有了差距。这个时候KI就要开始起作用了,KI基本公式是从0到当前时刻(Uset-Unow)的积分值乘以Ki,但在单片机(计算机中也是)中只有数字量,于是分就变成了相乘,公式就成了UKi=UKi+KI*(Uset-Unow)*dt,dt是系统的采样周期,即Unow隔dt采样一次。这个值比较小,大多都不为整数,而众所周知的51单片机中浮点数运算较慢,于是我一般会将公式改为UKi=UKi+KI*(Uset-Unow)/F,F为频率,一般为比一大的整数,即F=1/dt。回到刚才的问题,积分的作用就非常明显了。系统恒定在59度这KI*(60-59)/F随着时间不断在积分在增加,当控制量超过一定值时系统温度就会开始上升了,由于在接近我们设定的点之前(Uset-Unow)较大,而这一部分的值依旧被积分到了Uk之中,所以Ki的作用会导致最终的控制量有一定的超调,也就是说Ki设置好之后可以稍微减少Kp的值。

最后就是Kd,d代表对时间微分(differential),即速度,是对未来趋势的一种预测,比如还是恒温系统,我停止加热之后温度并不会立即停止上升(热得快有余温还有就是水受热不均所致),此时通过微分量预测上升的速度对输出的控制量进行适当缩小,可以尽量避免“冲过头”这种事情发生。公式UKd=UKd+Kd*((Uset-Unow)now-(Uset-Unow)before)/dt。(Uset-Unow)now是现在的(Uset-Unow)值,(Uset-Unow)before是在前一刻(Uset-Unow)的值。把dt依旧转化成F即UKd=UKd+Kd*((Uset-Unow)now-(Uset-Unow)before)*F,UKd即为微分所对应的控制量。

好啦。。三个量都讲完了,最终的输出控制量Uk就是这三个量之和,即UK=UKp+UKi+UKd。但在51单片机中,浮点数运算会较慢,于是除了0以外我们最小只能设定PID的三个参数为1,大多数时候这个1都还是很大的一个值。所以在得到最终的输出值时我们一般都会对这个值做移位处理(右移)即移动n位相当于除以2的n次方。调整这个n可以使得输出在一个合适的值之内。

对PID三个常量的分析基本上说完了。。先吃饭去鸟。。吃完饭回来开始写第二篇——PID这3个常量调整的方法。

推介阅读英文版的维基百科关于PID的页面。那里面三个图把这三个变量起的作用描述的很清楚了。。

http://en.wikipedia.org/wiki/PID_controller

杂谈PID控制算法——第一篇:三个量的更多相关文章

  1. 杂谈PID控制算法——第二篇:调·三个量

    上面一篇文章讲了一下PID算法中的三个常量大致的在PID算法中起的一个作用,但在实际的使用中,究竟应该如何调节(或者用更加专业的话说是整定)PID控制算法的三个.首先可以将KP,KI,KD三个常量全部 ...

  2. 杂谈PID控制算法——最终篇:C语言实现51单片机中的PID算法

    真遗憾,第二篇章没能够发表到首页上去.趁热打铁.把最终篇——代码篇给发上来. 代码的设计思想请移步前两篇文章 //pid.h #ifndef __PID__ #define __PID__ /*PID ...

  3. 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:

    小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...

  4. PID控制算法的C语言实现

    参考: PID控制器开发笔 浅谈位置式PID 专家PID控制在快速系统中的仿真及应用(这篇了论文介绍的积分分离PID.专家PID(脚本实现和simulink实现)很详细) PID控制算法的C语言实现一 ...

  5. [转]PID控制算法原理

    PID控制算法是工业界使用极其广泛的一个负反馈算法,相信这个算法在做系统软件时也有用武之处,这里摘录了知乎上的一篇文章,后面学习更多后自己总结一篇 以下为原文: PID控制应该算是应用非常广泛的控制算 ...

  6. 分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)——第一篇

    分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)--第一篇 简介 首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由 ...

  7. PID控制算法的简单分析和仿真!

    PID算法简单剖析如下: 1.首先我们来看一下PID系统的基本组成模块: 如图所示,图中相关参数的表示如下: r(t):系统实际上需要的输出值,这是一个标准值,在我们设定了之后让这个系统去逼近的一个值 ...

  8. PID控制算法的C语言实现十一  模糊算法简介

    在PID控制算法的C语言实现九中,文章已经对模糊PID的实质做了一个简要说明.本来打算等到完成毕业设计,工作稳定了再着力完成剩下的部分.鉴于网友的要求和信任,抽出时间来,对模糊PID做一个较为详细的论 ...

  9. [转帖]虚拟内存探究 -- 第一篇:C strings & /proc

    虚拟内存探究 -- 第一篇:C strings & /proc http://blog.coderhuo.tech/2017/10/12/Virtual_Memory_C_strings_pr ...

随机推荐

  1. The base command for the Docker CLI.

    Description The base command for the Docker CLI. Child commands Command Description docker attach At ...

  2. MSTest DeploymentItemAttribute

    该attribute可以把指定的文件拷贝到每次运行的Out目录下,比如有一个config文件,那么用下面的命令, [TestClass] [DeploymentItem("Default.c ...

  3. jQuery知识点:attr与prop的区别

    做项目时遇到个莫名的问题,全选的时候仅第一次有效,再次点击全选按钮是无效了,查了查原因,看到篇很不错的文章,问题出在jquery中的attr属性上,这里做下笔记. 原文链接:http://www.cn ...

  4. 动态规划:树形DP

    典型例题有三道: 没有上司的舞会 选课 景点中心 我们可以把动态规划的状态和转移描述成DAG 对于有根树来说,如果我们规定边的方向由父节点指向叶子节点 或者是由叶子节点指向父节点(奇葩) 那么它也是一 ...

  5. CDQ 学习笔记

    CDQ分治 CDQ(陈丹琦)分治是一种特殊的分治方法. 它只能处理非强制在线的问题. CDQ分治在维护一些动态的凸包.半平面交问题也有一定应用,然而本渣渣并不会. CDQ分治基于时间分治,整体二分基于 ...

  6. 【C++】多重继承

    1. 多重继承时的二义性 当使用多重继承时,如果多个父类都定义了相同名字的变量,则会出现二义性.解决方法:使用 :: 声明作用域 #include <iostream> using nam ...

  7. selenium TestNG 依赖和忽略测试

    依赖:通过使用Test 注释的dependsOnMethods={"verifyLogin"}子句,verifyAccountInfo 测试指定了它依赖verifyLogin()方 ...

  8. MATLAB多项式及多项式拟合

    多项式均表示为数组形式,数组元素为多项式降幂系数 1.      polyval函数 求多项式在某一点或某几个点的值. p = [1,1,1];%x^2+x+1 x = [-1,0,1];y = po ...

  9. 准备开发开放API接口

    准备开发APP开放接口,允许JQUERY直接调用http://blog.csdn.net/wuxiangege/article/details/52238968 SIGN的设计与实现http://bl ...

  10. 安装smartmontool报错:libc6-dev : 破坏:

    https://blog.csdn.net/weixin_38705903/article/details/81947717