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

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

从第一次训练开始我们就接触到了一个新的名词——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. 新手如何更换自己喜欢的背景以及此背景的css码

    以下内容为转载(对于css码可以自己写当然也可以去网上搜现成的): 更换背景教学:https://jingyan.baidu.com/album/fc07f9897c730412ffe519c0.ht ...

  2. java实现ssm框架的crud

    上一篇博客写了通过表名获取数据库表结构的demo,现在我以此为基础实现了一个简单的通过数据库表结构生成对应的实体,通过读取mapper接口文件.mapping映射文件. service映射文件模板,替 ...

  3. jquery.cookie.js 的使用指南

    转自:http://www.cnblogs.com/yjzhu/p/4359420.html 介绍: jquery.cookie.js 是一款轻量级的 cookie 插件,可以读取,写入和删除 coo ...

  4. Spring - IoC(1): Spring 容器

    BeanFactory & ApplicationContext org.springframework.beans.factory.BeanFactory 是最基本的 Spring 容器接口 ...

  5. 【BZOJ】1592: [Usaco2008 Feb]Making the Grade 路面修整

    [算法]动态规划DP [题解] 题目要求不严格递增或不严格递减. 首先修改后的数字一定是原来出现过的数字,这样就可以离散化. f[i][j]表示前i个,第i个修改为第j个数字的最小代价,a表示排序后数 ...

  6. swift mac 使用git, 并使用osc, 打开当前目录命令在终端输入 open . windows 下为start .

    使用git.osc而不用github, 因为在osc里面可以设置私有项目,而不需要公开. ssh-keygen -t rsa -C "email@email.com" mac下生成 ...

  7. 之江学院第0届校赛 qwb与支教 (容斥公式)

    description qwb同时也是是之江学院的志愿者,暑期要前往周边地区支教,为了提高小学生的数学水平.她把小学生排成一排,从左至右从1开始依次往上报数. 玩完一轮后,他发现这个游戏太简单了.于是 ...

  8. Django-随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 from PIL import Image img = Image.ne ...

  9. kvm源代码分析

    vmx是x86硬件虚拟化层,从代码看,qemu用户态是一层,kernel中KVM通用代码是一层,类似kvm_x86_ops是一层,针对各个不同的硬件架构,而vcpu_vmx则是具体架构的虚拟化方案一层 ...

  10. linux下面某些常用命令的用法【转】

    转自:http://blog.csdn.net/luo3532869/article/details/7584290 ls 命令用于常看目录,用法:ls [选项][目录或文件]例:使用ls命令显示/h ...