智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 15089|回复: 71
打印 上一主题 下一主题

形象解释PID算法+PID算法源代码

  [复制链接]

24

主题

603

帖子

1

精华

跨届大侠

西点君

Rank: 10Rank: 10Rank: 10

积分
8838

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章资源大师奖章

威望
3135
贡献
3875
兑换币
1580
注册时间
2011-5-9
在线时间
914 小时
跳转到指定楼层
1#
发表于 2012-12-21 19:38:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小明接到这样一个任务:
有一个水缸点漏水(而且漏水的速度还不一定固定不变),
要求水面高度维持在某个位置,
一旦发现水面高度低于要求位置,就要往水缸里加水。

小明接到任务后就一直守在水缸旁边,
时间长就觉得无聊,就跑到房里看小说了,
每30分钟来检查一次水面高度。水漏得太快,
每次小明来检查时,水都快漏完了,离要求的高度相差很远
,小明改为每3分钟来检查一次,结果每次来水都没怎么漏
,不需要加水,来得太频繁做的是无用功。几次试验后,
确定每10分钟来检查一次。这个检查时间就称为采样周期。

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

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

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


大学时代做机器人时用的PID算法源代码:
#define PID_Uint struct pid_uint
PID_Uint
{
        int U_kk;
        int ekk;
        int ekkk;
        int Ur;                                //限幅输出值,需初始化
        int Un;                                //不灵敏区
        //int multiple;                //PID系数的放大倍数,用整形数据的情况下,提高PID参数的设置精度          固定为256
        int Kp;                                //比例,从小往大调
        int Ti;                                //积分,从大往小调
        int Td;                                //微分,用巡线板时设为0
        int k1;                                //
        int k2;
        int k3;
};

/********************************************************************
函 数 名:void Init_PID_uint(PID_uint *p)
功    能:初始化PID参数
说    明:调用本函数之前,应该先对Kp,Ti,Td做设置        ,简化了公式
入口参数:PID单元的参数结构体 地址
返 回 值:无
***********************************************************************/
void Init_PID_uint(PID_Uint *p)
{
        p->k1=(p->Kp)+(p->Kp)*1024/(p->Ti)+(p->Kp)*(p->Td)/1024;
        p->k2=(p->Kp)+2*(p->Kp)*(p->Td)/1024;
        p->k3=(p->Kp)*(p->Td)/1024;
}
/********************************************************************
函 数 名:void reset_Uk(PID_Uint *p)
功    能:初始化U_kk,ekk,ekkk
说    明:在初始化时调用,改变PID参数时有可能需要调用
入口参数:PID单元的参数结构体 地址
返 回 值:无
***********************************************************************/
void reset_Uk(PID_Uint *p)
{
        p->U_kk=0;
        p->ekk=0;
        p->ekkk=0;
}
/********************************************************************
函 数 名:int PID_commen(int set,int jiance,PID_Uint *p)
功    能:通用PID函数
说    明:求任意单个PID的控制量
入口参数:期望值,实测值,PID单元结构体
返 回 值:PID控制量
***********************************************************************/
int PID_common(int set,int jiance,PID_Uint *p)
{
        int ek,U_k=0;
        ek=jiance-set;
        if((ek>(p->Un))||(ek<-(p->Un)))                //积分不灵敏区
                U_k=(p->U_kk)+(p->k1)*ek-(p->k2)*(p->ekk)+(p->k3)*(p->ekkk);
        p->U_kk=U_k;
           p->ekkk=p->ekk;
        p->ekk=ek;
        if(U_k>(p->Ur))                                        //限制最大输出量,
                U_k=p->Ur;
        if(U_k<-(p->Ur))
                U_k=-(p->Ur);        
        return U_k/1024;
}

评分

1

查看全部评分

1

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
365
威望
245
贡献
98
兑换币
40
注册时间
2011-9-11
在线时间
11 小时
2#
发表于 2012-12-21 19:43:55 | 只看该作者
真的蛮形象的
回复 支持 反对

使用道具 举报

9

主题

314

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3026

优秀会员奖章活跃会员奖章

威望
1440
贡献
916
兑换币
615
注册时间
2012-6-22
在线时间
335 小时
毕业学校
11
3#
发表于 2012-12-21 19:49:19 | 只看该作者
顶了
回复 支持 反对

使用道具 举报

42

主题

1450

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
8643

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
4293
贡献
2166
兑换币
2108
注册时间
2011-10-20
在线时间
1092 小时
4#
发表于 2012-12-21 20:02:28 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

63

帖子

0

精华

高级会员

Rank: 4

积分
640
威望
327
贡献
191
兑换币
74
注册时间
2012-5-18
在线时间
61 小时
毕业学校
上海理工
5#
发表于 2012-12-21 20:10:00 | 只看该作者
:lol瞬间理解了一点。
回复 支持 反对

使用道具 举报

24

主题

603

帖子

1

精华

跨届大侠

西点君

Rank: 10Rank: 10Rank: 10

积分
8838

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章资源大师奖章

威望
3135
贡献
3875
兑换币
1580
注册时间
2011-5-9
在线时间
914 小时
6#
 楼主| 发表于 2012-12-21 20:11:20 | 只看该作者
周旭春 发表于 2012-12-21 20:10
瞬间理解了一点。

哈哈
回复 支持 反对

使用道具 举报

31

主题

1084

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5125

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

威望
2630
贡献
1311
兑换币
922
注册时间
2011-5-8
在线时间
592 小时
7#
发表于 2012-12-21 20:34:25 | 只看该作者
这也太形象了吧,为啥我发现好多PID都用结构体啊,用结构体有啥好处啊
回复 支持 反对

使用道具 举报

25

主题

1217

帖子

0

精华

知名人物

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
27518

论坛元老奖章活跃会员奖章优秀会员奖章在线王奖章资源大师奖章

QQ
威望
18721
贡献
5855
兑换币
3255
注册时间
2012-6-6
在线时间
1471 小时
8#
发表于 2012-12-21 20:53:59 | 只看该作者
有点儿启发
回复 支持 反对

使用道具 举报

50

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2905

活跃会员奖章优秀会员奖章

威望
1424
贡献
707
兑换币
798
注册时间
2012-10-17
在线时间
387 小时
9#
发表于 2012-12-21 20:57:52 | 只看该作者
我顶
回复 支持 反对

使用道具 举报

18

主题

690

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2173
威望
972
贡献
655
兑换币
673
注册时间
2012-11-20
在线时间
273 小时
毕业学校
安徽新华学院
10#
发表于 2012-12-21 21:32:02 | 只看该作者
学习了
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-20 06:28 , Processed in 0.146976 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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