PID原理介绍及C#编程仿真

2 篇文章 0 订阅
1 篇文章 2 订阅

 

       1、简介: 

PID简称:比例积分微分控制,是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制,至今仍有90%左右的控制回路具有PID结构。

 简单的说,根据给定值和实际输出值构成控制偏差,将偏差按比例、积分和微分通过线性组合构成控制量,对被控对象进行控制。常规PID控制器作为一种线性控制器。

P:比例

I:积分

D:微分

       2、下面以一个通俗而又经典的小故事来介绍它。

/************************小故事分界线*****************************/

小明接到这样一个任务:

有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水。 小明接到任务后就一直守在水缸旁边,时间长就觉得无聊,就跑到房里看小说了, 每30分钟来检查一次水面高度。水漏得太快,每次小明来检查时,水都快漏完了,离要求的高度相差很远,小明改为每3分钟来检查一次,结果每次来水都没怎么漏,不需要加水,来得太频繁做的是无用功。

几次试验后,确定每10分钟来检查一次。这个检查时间就称为采样周期。 开始小明用瓢加水,水龙头离水缸有十几米的距离,经常要跑好几趟才加够水,于是小明又改为用桶加,一加就是一桶,跑的次数少了,加水的速度也快了, 但好几次将缸给加溢出了,不小心弄湿了几次鞋,小明又动脑筋,我不用瓢也不用桶,老子用盆,几次下来,发现刚刚好,不用跑太多次,也不会让水溢出。这个加水工具的大小就称为比例系数。

小明又发现水虽然不会加过量溢出了,有时会高过要求位置比较多,还是有打湿鞋的危险。他又想了个办法,在水缸上装一个漏斗,每次加水不直接倒进水缸而是倒进漏斗让它慢慢加。这样溢出的问题解决了,但加水的速度又慢了,有时还赶不上漏水的速度。于是他试着变换不同大小口径的漏斗来控制加水的速度,最后终于找到了满意的漏斗。漏斗的时间就称为积分时间 。

小明终于喘了一口,但任务的要求突然严了,水位控制的及时性要求大大提高,一旦水位过低,必须立即将水加到要求位置,而且不能高出太多,否则不给工钱。 小明又为难了!于是他又开努脑筋,终于让它想到一个办法,常放一盆备用水在旁边,一发现水位低了,不经过漏斗就是一盆水下去,这样及时性是保证了,但水位有时会高多了。他又在要求水面位置上面一点将水凿一孔,再接一根管子到下面的备用桶里这样多出的水会从上面的孔里漏出来。这个水漏出的快慢就称为微分时间。

/************************小故事分界线*****************************/

好,故事看完了,相信大家对PID算法有了初步认识,接下来就深入一点进行讲解。

3、PID控制系统示意图:

4、各环节作用 PID控制器各校正环节的作用如下:

①比例环节:比例控制中控制器的输出u与输入误差信号err成比例关系。假如某一刻t你的预期值是E,而实际值为A,那么误差值就为err(t)=E-A,这时候控制器输出就为u(t)=Kp*err(t)。

*问:假设你有一个加减计算器,由于某种原因你每次只能加或减u(t)并且比例系数Kp=0.4,让你从0开始去逼近100。

*解:显然,这时候你的预期值E为100,而实际值为0,那么误差值就为err(t1)=100-0,进行第一次加减运算(你按计算器加的值为u(t1)=0.4*100=40),好了,第一次计算器从0加到了40;

第二次,预期100,实际40,误差60,进行加减运算(你按计算机加的值为u(t2)=0.4*60=24),第二次计算器从40加到了64;

第三次,预期100,实际64,误差36,进行加减运算(你按计算器加的值为u(t3)=0.4*36=14.4),第三次计算器从64加到了78.4;

第四次从78.4加到87.04;

第五次87.04加到92.224

剩下的就直接贴图:

由于比例系数较低,大家可以看到数据是慢慢地逼近100,实际上加减运算到第23次时,实际值A=99.999,显然比例控制已经到达一个比较可观的精度了。如果比例系数Kp设为1则可以一次运算到达100。

②积分环节:在积分控制中控制器的输出与输入误差信号的积分成正比关系。如果系统进入稳态后存在稳态误差,必须引入积分环节以消除误差。积分项为误差对时间的积分,即便误差很小,随着时间的增加积分项也会增大,引导控制器增大输出使稳态误差减小,直至稳态误差为0。如下图所示(图中红色为稳态误差,积分控制下逐渐消除)

③微分环节:在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。误差变化越快,其微分绝对值越大。误差增大时,其微分为正;误差减小时,其微分为负;只有误差为常数时,微分才为0。总体来讲微分环节能预测变化的趋势来提前抑制误差直至微分为0。如上图所示(曲线的斜率为微分值,当误差为常数或者为0时,微分值即曲线的斜率为0)

5、概括:

①、比例(P)+积分(I)控制器可以使系统在进入稳态后无稳态误差;

②、比例(P)+微分(D)控制器能改善系统在调节过程中的动态特性;

PID控制其实是对反馈的误差进行控制的过程,如果误差为0,则比例环节不起作用,只有误差存在才进行比例调节;积分环节是用来消除稳态误差;微分环节根据误差信号的变化趋势进行超前调节。

从时间的角度讲,比例作用是针对系统当前误差进行控制,积分作用则针对系统误差的历史,而微分作用则反映了系统误差的变化趋势,这三者的组合是“过去、现在、未来”的完美结合 。

6、公式推导。

E:预期值、设置值;A:实际值;;err:偏差、误差值;T:采样周期

则在KT时刻:

偏差err(K)=E(k)-A(k);

积分环节用加和形式表示:err(k)+err(K-1)+…err(0);

微分环节用斜率形式表示:[err(k)-err(k-1)]/T;

比例系数:Kp;

积分系数:Ki=Kp*T/Ti;

微分系数:Kd=Kp*Td/T;

从而得到PID离散表示形式(也是位置式PID的表达形式):

可以求出u(k-1),

然后求出△u(k)=u(k)-u(k-1),得到增量式PID的表达形式:

7、编程仿真

①定义PID参数结构体

        public struct PID
        {
            /// <summary>
            /// 定义设定值
            /// </summary>
            public float ExpectedValue;             
            /// <summary>
            /// 定义实际值
            /// </summary>
            public float ActualValue;               //
            /// <summary>
            /// 定义偏差值
            /// </summary>
            public float err;                       //
            /// <summary>
            /// 定义上一个偏差值
            /// </summary>
            public float err_last;                  //
            /// <summary>
            /// 定义前一个的偏差值
            /// </summary>
            public float err_prev;                  //
            /// <summary>
            /// 定义比例、积分、微分系数
            /// </summary>
            public float Kp, Ki, Kd;                //
        }

②、PID初始化函数。

        /// <summary>
        /// 参数初始化
        /// </summary>
        void PID_Init()
        {
	        pid.ExpectedValue = 0.0f;
	        pid.ActualValue = 0.0f;
	        pid.err = 0.0f;
	        pid.err_prev = 0.0f;
	        pid.err_last = 0.0f;

            //pid.Kp = 0.4f;
            //pid.Ki = 0.2f;
            //pid.Kd = 0.0f;
            //界面文本框输入
            pid.Kp = float.Parse(txtKp.Text);
            pid.Ki = float.Parse(txtKi.Text);
            pid.Kd = float.Parse(txtKd.Text);
        }

③、增量式PID公式实现。

        /// <summary>
        /// 增量式PID公式实现
        /// </summary>
        /// <param name="speed"></param>
        /// <returns></returns>
        float PID_Realize(float speed)
        {
            float index;
            pid.ExpectedValue = speed;
            pid.err = pid.ExpectedValue - pid.ActualValue;
            //增量式pid公式
            float incrementValue = pid.Kp * (pid.err - pid.err_last) + pid.Ki * pid.err + pid.Kd * (pid.err - 2 * pid.err_last + pid.err_prev);
            pid.ActualValue += incrementValue;
            pid.err_prev = pid.err_last;
            pid.err_last = pid.err;

            return pid.ActualValue;
        }

UI界面实现的效果:

参数调试1

参数调试2

8、PID调试。

①、PID调试一般原则

a.在输出不振荡时,增大比例增益P。

b.在输出不振荡时,减小积分时间常数Ti。

c.在输出不振荡时,增大微分时间常数Td。

②、位置式PID调节

a.确定比例增益P 确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。

b.确定积分时间常数Ti 比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。

c.确定微分时间常数Td 积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti的方法相同,取不振荡时的30%。

d.系统空载、带载联调,再对PID参数进行微调,直至满足要求。

③、增量式pid调节

增量式pid调节:      

先加大KI,这时候会越来越接近实际速度,当KI过大的时候,在切换目标速度的时候,就会抖动,这时候就是KI大了响应速度高了,但导致超调量增加,这时候就加大增量式的KP,来缓减抖动,减小超调量。

9、PID常用口诀

参数整定找最佳,从小到大顺序查

先是比例后积分,最后再把微分加

曲线振荡很频繁,比例度盘要放大

曲线漂浮绕大湾,比例度盘往小扳

曲线偏离回复慢,积分时间往下降

曲线波动周期长,积分时间再加长

曲线振荡频率快,先把微分降下来

动差大来波动慢。微分时间应加长

理想曲线两个波,前高后低4比1

一看二调多分析,调节质量不会低

附:程序代码下载连接。

C#-PID实现和仿真.rar_C-其它文档类资源-CSDN下载

  • 11
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Big_潘大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值