没有合适的资源?快使用搜索试试~ 我知道了~
首页PID算法及原理(增量式,位置型,专家算法,模糊算法)
PID算法及原理(增量式,位置型,专家算法,模糊算法)
需积分: 46 388 下载量 100 浏览量
更新于2023-03-16
评论 52
收藏 428KB PDF 举报
PID算法及原理详解,包含增量式PID,位置型PID,梯度PID,专家PID,模糊算法等,从普通PID原型到专家PID逐步优化原理及代码,包含初级到高阶算法
资源详情
资源评论
资源推荐
PID 控制算法的 C 语言实现一 PID 算法原理
最近两天在考虑一般控制算法的 C 语言实现问题,发现网络上尚没有一套
完整的比较体系的讲解。于是总结了几天,整理一套思路分享给大家。
在工业应用中 PID 及其衍生算法是应用最广泛的算法之一,是当之无愧的
万能算法,如果能够熟练掌握 PID 算法的设计与实现过程,对于一般的研发人员
来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算
法当中,PID 控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中
的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想
想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不
是原始的,简单的也不是落后的,简单到了美的程度。先看看 PID 算法的一般形
式:
PID 的流程简单到了不能再简单的程度,通过误差信号控制被控量,而控
制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在 t 时刻):
1.输入量为 rin(t);
2.输出量为 rout(t);
3.偏差量为 err(t)=rin(t)-rout(t);
pid 的控制规律为
理解一下这个公式,主要从下面几个问题着手,为了便于理解,把控制环
境具体一下:
1.规定这个流程是用来为直流电机调速的;
2.输入量 rin(t)为电机转速预定值;
3.输出量 rout(t)为电机转速实际值;
4.执行器为直流电机;
5.传感器为光电码盘,假设码盘为 10 线;
6.直流电机采用 PWM 调速 转速用单位 转/min 表示;
不难看出以下结论:
1.输入量 rin(t)为电机转速预定值(转/min);
2. 输出量 rout(t)为电机转速实际值(转/min);
3.偏差量为预定值和实际值之差(转/min);
那么以下几个问题需要弄清楚:
1.通过 PID 环节之后的 U(t)是什么值呢?
2.控制执行器(直流电机)转动转速应该为电压值(也就是 PWM 占空比)。
3.那么 U(t)与 PWM 之间存在怎样的联系呢?
http://blog.21ic.com/user1/3407/archives/2006/33541.html(见附录 1)这
篇文章上给出了一种方法,即,每个电压对应一个转速,电压和转速之间呈现线
性关系。但是我考虑这种方法的前提是把直流电机的特性理解为线性了,而实际
情况下,直流电机的特性绝对不是线性的,或者说在局部上是趋于线性的,这就
是为什么说 PID 调速有个范围的问题。具体看一下
http://articles.e-works.net.cn/component/article90249.htm(见附录 2)
这篇文章就可以了解了。所以在正式进行调速设计之前,需要现有开环系统,测
试电机和转速之间的特性曲线(或者查阅电机的资料说明),然后再进行闭环参
数整定。这篇先写到这,下一篇说明连续系统的离散化问题。并根据离散化后的
特点讲述位置型 PID 和增量型 PID 的用法和 C 语言实现过程。
PID 控制算法的 C 语言实现二 PID 算法的离散化
上一节中,我论述了 PID 算法的基本形式,并对其控制过程的实现有了一
个简要的说明,通过上一节的总结,基本已经可以明白 PID 控制的过程。这一节
中先继续上一节内容补充说明一下。
1.说明一下反馈控制的原理,通过上一节的框图不难看出,PID 控制其实
是对偏差的控制过程;
2.如果偏差为 0,则比例环节不起作用,只有存在偏差时,比例环节才起作
用。
3.积分环节主要是用来消除静差,所谓静差,就是系统稳定后输出值和设
定值之间的差值,积分环节实际上就是偏差累计的过程,把累计的误差加到原有
系统上以抵消系统造成的静差。
4.而微分信号则反应了偏差信号的变化规律,或者说是变化趋势,根据偏
差信号的变化趋势来进行超前调节,从而增加了系统的快速性。
好了,关于 PID 的基本说明就补充到这里,下面将对 PID 连续系统离散化,
从而方便在处理器上实现。下面把连续状态的公式再贴一下:
假设采样间隔为 T,则在第 K T 时刻:
偏差 err(K)=rin(K)-rout(K);
积分环节用加和的形式表示,即 err(K)+err(K+1)+……;
微分环节用斜率的形式表示,即[err(K)-err(K-1)]/T;
从而形成如下 PID 离散表示形式:
则 u(K)可表示成为:
至于说 Kp、Ki、Kd 三个参数的具体表达式,我想可以轻松的推出了,这里节省
时间,不再详细表示了。
其实到这里为止,PID 的基本离散表示形式已经出来了。目前的这种表述形式属
于位置型 PID,另外一种表述方式为增量式 PID,由 U 上述表达式可以轻易得到:
那么:
这就是离散化 PID 的增量式表示方式,由公式可以看出,增量式的表达结果和最
近三次的偏差有关,这样就大大提高了系统的稳定性。需要注意的是最终的输出
结果应该为
u(K)+增量调节值;
PID 的离散化过程基本思路就是这样,下面是将离散化的公式转换成为 C 语言,
从而实现微控制器的控制作用。
PID 控制算法的 C 语言实现三 位置型 PID 的 C 语言实
现
上一节中已经抽象出了位置性 PID 和增量型 PID 的数学表达式,这一节,
重点讲解 C 语言代码的实现过程,算法的 C 语言实现过程具有一般性,通过 PID
算法的 C 语言实现,可以以此类推,设计其它算法的 C 语言实现。
第一步:定义 PID 变量结构体,代码如下:
struct _pid{
float SetSpeed; //定义设定值
float ActualSpeed; //定义实际值
float err; //定义偏差值
float err_last; //定义上一个偏差值
float Kp,Ki,Kd; //定义比例、积分、微分系数
float voltage; //定义电压值(控制执行器的变量)
float integral; //定义积分值
}pid;
控制算法中所需要用到的参数在一个结构体中统一定义,方便后面的使用。
第二部:初始化变量,代码如下:
void PID_init(){
printf("PID_init begin \n");
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.voltage=0.0;
pid.integral=0.0;
pid.Kp=0.2;
pid.Ki=0.015;
pid.Kd=0.2;
printf("PID_init end \n");
}
统一初始化变量,尤其是 Kp,Ki,Kd 三个参数,调试过程当中,对于要求的控制
效果,可以通过调节这三个量直接进行调节。
第三步:编写控制算法,代码如下:
剩余43页未读,继续阅读
Areaor
- 粉丝: 2
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0