找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 56031|回复: 45
打印 上一主题 下一主题
收起左侧

PID算法原理,调整规律及代码

  [复制链接]
跳转到指定楼层
楼主
ID:72008 发表于 2015-1-12 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、PID算法简介
在智能车竞赛中,要想让智能车根据赛道的不断变化灵活的行进,PID算法的采用很有意义。
    首先必须明确PID算法是基于反馈的。一般情况下,这个反馈就是速度传感器返回给单片机当前电机的转速。简单的说,就是用这个反馈跟预设值进行比较,如果转速偏大,就减小电机两端的电压;相反,则增加电机两端的电压。

控制器公式 为:
  
 式中  
     顾名思义,P指是比例(Proportion),I指是积分(Integral),D指微分(Differential)。在电机调速系统中,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。要想搞懂PID算法的原理,首先必须先明白P,I,D各自的含义及控制规律:
比例P比例项部分其实就是对预设值和反馈值差值的发大倍数。举个例子,假如原来电机两端的电压为U0,比例P为0.2,输入值是800,而反馈值是1000,那么输出到电机两端的电压应变为U0+0.2*(800-1000)。从而达到了调节速度的目的。显然比例P越大时,电机转速回归到输入值的速度将更快,及调节灵敏度就越高。从而,加大P值,可以减少从非稳态到稳态的时间。但是同时也可能造成电机转速在预设值附近振荡的情形,所以又引入积分I解决此问题。
积分I顾名思义,积分项部分其实就是对预设值和反馈值之间的差值在时间上进行累加。当差值不是很大时,为了不引起振荡。可以先让电机按原转速继续运行。当时要将这个差值用积分项累加。当这个和累加到一定值时,再一次性进行处理。从而避免了振荡现象的发生。可见,积分项的调节存在明显的滞后。而且I值越大,滞后效果越明显。
微分D微分项部分其实就是求电机转速的变化率。也就是前后两次差值的差而已。也就是说,微分项是根据差值变化的速率,提前给出一个相应的调节动作。可见微分项的调节是超前的。并且D值越大,超前作用越明显。可以在一定程度上缓冲振荡。比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。
二、参数调整一般规则
由各个参数的控制规律可知,比例P使反应变快,微分D使反应提前,积分I使反应滞后。在一定范围内,P,D值越大,调节的效果越好。各个参数的调节原则如下:
PID调试一般原则
a.       在输出不振荡时,增大比例增益P。
b.       在输出不振荡时,减小积分时间常数Ti。
c.       输出不振荡时,增大微分时间常数Td。
三、参数调整一般步骤
a.确定比例增益P
确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0,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控制而言,参数的选择始终是一件非常烦杂的工作,需要经过不断的调整才能得到较为满意的控制效果。依据经验,一般PID参数确定的步骤如下:
(1)确定比例系数Kp
确定比例系数Kp时,首先去掉PID的积分项和微分项,可以令Ti=0、Td=0,使之成为纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。
(2)确定积分时间常数Ti
比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。
(3) 确定微分时间常数Td
微分时间常数Td一般不用设定,为0即可,此时PID调节转换为PI调节。如果需要设定,则与确定Kp的方法相同,取不振荡时其值的30%。
(4) 系统空载、带载联调
对PID参数进行微调,直到满足性能要求。
PID代码如下:
#include<string.h>
#include<stdio.h>
typedef struct PID {

double SetPoint; // 设定目标Desired value
double Proportion; // 比例常数Proportional Const
double Integral; // 积分常数Integral Const
double Derivative; // 微分常数Derivative Const
double LastError; // Error[-1]

double PrevError; // Error[-2]
double SumError; // Sums of Errors
} PID;

/*====================================================================================================
PID计算函数
=====================================================================================================*/
double PIDCalc( PID *pp, double NextPoint )
{
    double dError, Error;
    Error = pp->SetPoint - NextPoint; // 偏差
    pp->SumError += Error; // 积分
    dError = pp->LastError - pp->PrevError; // 当前微分
    pp->PrevError = pp->LastError;
    pp->LastError = Error;
    return (pp->Proportion * Error // 比例项
    + pp->Integral * pp->SumError // 积分项
    + pp->Derivative * dError // 微分项 );
}

/*====================================================================================================
PID结构体变量初始化函数
=====================================================================================================*/
void PIDInit (PID *pp)
{
memset ( pp,0,sizeof(PID));
}

/*====================================================================================================
读取输入变量函数(在此设定为固定值100)
======================================================================================================*/
double sensor (void)  
{
return 100.0;
}

/*====================================================================================================
输出变量控制函数
======================================================================================================*/

void actuator(double rDelta)  
{
}

//主函数

void main(void)
{
    PID sPID; // PID Control Structure
    double rOut; // PID Response (Output)
    double rIn; // PID Feedback (Input)
    PIDInit ( &sPID ); // Initialize Structure
    sPID.Proportion = 0.5; // Set PID Coefficients
    sPID.Integral = 0.5;
    sPID.Derivative = 0.0;
    sPID.SetPoint = 100.0; // Set PID Setpoint
    for (;;)
    { // Mock Up of PID Processing

        rIn = sensor (); // Read Input
        rOut = PIDCalc ( &sPID,rIn ); // Perform PID Interation
        actuator ( rOut ); // Effect Needed Changes
    }

}

评分

参与人数 9黑币 +68 收起 理由
123000.。 + 10 很给力!
温存723 + 7 绝世好帖!
dww465757120 + 30 很给力!
为之则易 + 1 共享资料的黑币奖励!
zha + 3
owlandauk + 1 赞一个!
凉城以北 + 3 赞一个!
wei1996313 + 5 绝世好帖!
send + 8 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏81 分享淘帖 顶21 踩1
回复

使用道具 举报

沙发
ID:72527 发表于 2015-1-20 10:26 | 只看该作者
学习了,51黑有你更精彩!!
回复

使用道具 举报

板凳
ID:56903 发表于 2015-1-22 10:32 | 只看该作者
讲得太棒了,这是我见过的把智能小车 PID讲解的最透彻的文章。
回复

使用道具 举报

地板
ID:72995 发表于 2015-2-2 14:43 | 只看该作者
终于在手机上看完了,解决了我一直以来关于pid的疑惑 谢谢楼主.
回复

使用道具 举报

5#
ID:100002 发表于 2016-4-12 11:08 | 只看该作者
赞一个
回复

使用道具 举报

6#
ID:113840 发表于 2016-4-12 22:41 | 只看该作者
终于了解pid
回复

使用道具 举报

7#
ID:101392 发表于 2016-4-15 22:05 | 只看该作者
只能给你刷波666
回复

使用道具 举报

8#
ID:117647 发表于 2016-4-30 13:56 | 只看该作者
看完了,却没看懂
回复

使用道具 举报

9#
ID:130196 发表于 2016-8-5 00:40 来自手机 | 只看该作者
写的清楚明白
回复

使用道具 举报

10#
ID:107832 发表于 2016-11-5 10:21 | 只看该作者
在实际的工程例如温控,速度控制中。也是只用PI控制就可以吗?
回复

使用道具 举报

11#
ID:72292 发表于 2016-12-17 15:27 | 只看该作者
很好,谢谢楼主
回复

使用道具 举报

12#
ID:185968 发表于 2017-4-23 11:11 | 只看该作者
赞一个,慢慢理解
回复

使用道具 举报

13#
ID:202452 发表于 2017-5-19 10:41 | 只看该作者
为什么上面说微分越大越好,但是下面的微分直接设置为零????
回复

使用道具 举报

14#
ID:187365 发表于 2017-7-19 16:14 | 只看该作者
讲的很清楚赞一个
回复

使用道具 举报

15#
ID:222737 发表于 2017-7-27 17:41 | 只看该作者
讲的很清楚赞一个,解决了我一直以来关于pid的疑惑 谢谢楼主.
回复

使用道具 举报

16#
ID:203640 发表于 2017-7-31 15:37 | 只看该作者
多谢分享经验
回复

使用道具 举报

17#
ID:110278 发表于 2017-8-4 13:41 | 只看该作者
参考一下。。。
回复

使用道具 举报

18#
ID:222394 发表于 2017-8-5 21:59 | 只看该作者
好帖!
回复

使用道具 举报

19#
ID:125038 发表于 2017-8-5 22:26 | 只看该作者
学习了,谢谢楼主!
回复

使用道具 举报

20#
ID:225338 发表于 2017-8-7 04:32 来自手机 | 只看该作者
编程还是不会,伤心
回复

使用道具 举报

21#
ID:229761 发表于 2017-9-12 10:31 | 只看该作者
怎么进行参数的整定?对于实际工程项目来说也是这样的吗?
回复

使用道具 举报

22#
ID:231115 发表于 2017-9-25 11:18 | 只看该作者
慢满消化,谢谢
回复

使用道具 举报

23#
ID:244991 发表于 2017-11-2 13:49 | 只看该作者
看看能不能结合到我的安卓里面
回复

使用道具 举报

24#
ID:160351 发表于 2017-11-2 14:25 | 只看该作者
学习了,不光是在智能小车上,在温度控制上PID也是 一样的道理!
回复

使用道具 举报

25#
ID:223788 发表于 2018-3-31 17:41 | 只看该作者
学习了,51黑有你更精彩!!
回复

使用道具 举报

26#
ID:343709 发表于 2018-8-10 10:33 | 只看该作者
谢谢啦
回复

使用道具 举报

27#
ID:400755 发表于 2018-9-21 13:32 | 只看该作者
赞一个
回复

使用道具 举报

28#
ID:402219 发表于 2018-9-25 16:33 | 只看该作者
插个眼,下来慢慢理解
回复

使用道具 举报

29#
ID:338711 发表于 2018-10-29 14:51 | 只看该作者
赞一个
回复

使用道具 举报

30#
ID:350791 发表于 2018-12-18 09:30 | 只看该作者
这是我见过的把PID讲解的最透彻,我要好好理解和学习
回复

使用道具 举报

31#
ID:276118 发表于 2018-12-18 13:18 | 只看该作者
这就是理论与软件的结合
回复

使用道具 举报

32#
ID:426166 发表于 2018-12-18 15:09 | 只看该作者

这就是理论与软件的结合
回复

使用道具 举报

33#
ID:525712 发表于 2019-12-23 16:40 | 只看该作者
学习了,很有帮助
回复

使用道具 举报

34#
ID:444278 发表于 2020-3-28 17:45 | 只看该作者
学习了,棒棒哒
回复

使用道具 举报

35#
ID:601357 发表于 2020-7-23 11:24 | 只看该作者
讲的清楚明白,谢谢,学到了
回复

使用道具 举报

36#
ID:259648 发表于 2020-8-6 14:44 | 只看该作者
受益匪浅!!  感谢分享  51黑有你更精彩
回复

使用道具 举报

37#
ID:259648 发表于 2020-8-6 14:46 | 只看该作者
这个属于增量式还是位置式呢
回复

使用道具 举报

38#
ID:91521 发表于 2022-3-16 12:11 | 只看该作者
楼主好人一生平安!
回复

使用道具 举报

39#
ID:91521 发表于 2022-3-16 12:11 | 只看该作者
温存723 发表于 2020-8-6 14:46
这个属于增量式还是位置式呢

当然是增量式
回复

使用道具 举报

40#
ID:1024431 发表于 2022-5-6 23:09 | 只看该作者
这个文章太透彻了谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表