资源经验分享pid控制算法

pid控制算法

2019-10-22 | |  104 |   0

原标题:pid控制算法

原文来自:CSDN      原文链接:http://www.xinhuanet.com/2019-09/09/c_1124976366.htm


pid的控制原理和特点

工程实际中,应用最为广泛调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制主要技术之一。当被控对象结构和参数不能完全掌握,或不到精确数学模型时,控制理论其它技术难以采用时,系统控制器结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象﹐或不能有效测量手段来获系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是系统误差,利用比例、积分、微分计算出控制量进行控制。

比例控制:P

比例控制是最常用的控制手段之一,对于一个对象,我们对它的属性有一个预期的期望(例如:水的温度,电机的转速等等)但是这时我们的实际值与我们的期望值有一定的误差 ,我们会使用比例控制区调节实际值,使其达到我们的期望值。以水的温度举例就是

error_temp=Set_temp-Actual_temp;期望值减去实际值得到一个误差值

Actual_temp(t)=Actual_temp(t-1)+error_temp*P;123

根据这个算出的误差值乘以我们的比例控制系数P,然后再加上我们上一次的实际值去得到我们这次比例控制后的实际值,当然了,P的大小需要我们根据实际情况去调,如果P你给定的值太大了,那么我们经过运算得到的实际值就会高于我们的期望值,如果我们给定的P值过小了,那我们运算得到的实际值就会达不到我们的期望值。

比例积分控制 :PI

积分,反应系统的累计偏差,使系统消除稳态误差,提高无差度,因为有误差,积分调节就进行,直至无误差;积分调节的“大方向”是正确的,积分项有减小误差的作用。一直要到系统处于稳定状态,这时误差恒为零,比例部分和微分部分均为零,积分部分才不再变化,并且刚好等于稳态时需要的控制器的输出值,因此积分部分的作用是消除稳态误差提高控制精度,积分作用一般是必须的,公式一般如下

Actual_temp(t) = P*error_temp + PI∑error_temp(t) +Actual_temp(t-1) ;1

大家通过公式可以看到积分项是一个历史误差的累积值,如果我们光用比例控制的话,那么我们通过比例控制虽说能够接近我们的期望值,但是总是还会有一些误差,因为单纯靠P调节,系统稳态后,对于不是特别大的误差没办法调节(误差传入到比例控制里面,输出的结果还是相差这些误差),如果我们加上了PI的话,我们能够根据误差的累计值,去慢慢地趋于我们的期望值,达到消除静态稳差的结果。

比例微分控制:PD

微分,反映系统偏差信号的变化率error(t)-error(t-1),具有预见性,能预见偏差变化的趋势,产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除,因此可以改善系统的动态性能。但是分对噪声干扰有放大作用,加强微分对系统抗干扰不利。误差的微分就是误差的变化速率,误差变化越快,其微分绝对值越大。误差增大时,其微分为正;误差减小时,其微分为负。控制器输出量的微分部分与误差的微分成正比,反映了被控量变化的趋势。

Actual_temp(t) = Kp*error(t) + Ki∑error(t) + Kd[error(t) – error(t-1)]+Actual_temp(t-1)1

即填上PD的pid的基本公式就基本出来了

基础的pid控制一般分为两种 分别是位置式控制pid和增量式控制pid,从名字上我们大概就可以明白他们之间的区别,位置式pid是非递推算法,当有误差时,我们的输出是控制器的增量,也就是说我们的目标是一次就要去达到我们的期望值,优点的话就是说响应速度快,适合用于精度不太高的场合,(比如恩智浦智能车舵机打脚的时候,相对于精度,速度对它明显更重要)但是它也有缺点,运算量大,因为它需要对误差进行累加,也就是下面代码里面pid_control.I的计算.而且控制输出出错的话,它的响应波动会比较大
说完了位置式,接着说增量式pid,增量式pid从某种角度上讲就是两次位置式pid的差值,这样理解,它每次输出的是增量,也就是变化量,所以他的优点我们大概就可以猜想一下啦,比如因为每次输出的是增量,所以控制输出出错的话,对它的影响会小很多,另外的话,仔细观察运算式的同学可以发现,在增量运算的时候,在进行积分环节的时候不需要累加误差,这一点减小了运算量,与最近三次的采样值有关所以通过加权平均我们可以得到比较好的控制效果。缺点的话就是位置式的优点,嘿嘿

pid控制代码C语言实现如下

位置式pid

struct pid_{float Setspeed;float Actualspeed;float err;float err_prev;float err_last;float kp,ki,kd;float P,I,D;float out;}pid_control;void pid_init(){ 
	pid_control.Setspeed=0;
	pid_control.Actualspeed=0;
	pid_control.err=0;
	pid_control.err_prev=0;
	pid_control.err_last=0;
	pid_control.kp=0;
	pid_control.ki=0;
	pid_control.kd=0;}float pid_realise(float buff){
	pid_control.Actual=buff;
	pid_control.err=pid_control.Setspeed-Actualspeed;
	pid_control.P=kp*pid_control.err;
	pid_control.I+=ki*(pid_control.err);
	pid_control.D=kd*(pid_control.err-pid_control.err_last);
	pid_control=pid_control.P+pid_control.I+pid_control.D;
	pid_control.err_last=pid_control.err;return pid_control.out;}1234567891011121314151617181920212223242526272829303132333435

增量式pid

struct pid_{float Setspeed;float Actualspeed;float err;float err_prev;float err_last;float kp,ki,kd;float P,I,D;float out;}pid_control;void pid_init(){ 
	pid_control.Setspeed=0;
	pid_control.Actualspeed=0;
	pid_control.err=0;
	pid_control.err_prev=0;
	pid_control.err_last=0;
	pid_control.kp=0;
	pid_control.ki=0;
	pid_control.kd=0;}float pid_realise(float buff){
	pid_control.Actual=buff;
	pid_control.err=pid_control.Setspeed-Actualspeed;
	pid_control.P=kp*(pid_control.err-pid_control.err_prev);
	pid_control.I=ki*(pid_control.err);
	pid_control.D=kd*(pid_control.err-2pid_control.err_prev+pid_control.err_last);
	pid_control+=pid_control.P+pid_control.I+pid_control.D;
	pid_control.err_prev=pid_control.err;
	pid_control.err_last=pid_control.err_prev;return pid_control.out;}1234567891011121314151617181920212223242526272829303132333435

说完了位置式pid和增量式pid,其实还有各种各样的pid,比如积分分离的pid,变积分的pid,还有模糊pid和专家pid等等,这些pid的效果要比位置式和增量式pid的效果要更好(如果你参数或者规则调节设定的好的话),在响应速度,抗干扰能力,不超调不震荡比普通pid要强的多,当然还有其他许许多多的算法,也能取得特别好的效果,比如ADRC等等。

酝酿了很久,今天把自己的一些想法第一次发布在CSDN上,希望能够帮助到别人,同时因为自己也是个菜鸟,对于本文中出现的错误希望各位能够指正,帮助我不断完善自己 谢谢大家!!

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:Processing实现绘制自画像

下一篇:读懂数据结构

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...