智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 14027|回复: 51
打印 上一主题 下一主题

PID算法——完美篇

    [复制链接]

24

主题

128

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3525

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

QQ
威望
805
贡献
2486
兑换币
0
注册时间
2010-11-16
在线时间
117 小时
跳转到指定楼层
1#
发表于 2012-2-13 16:45:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
购买主题 已有 515 人购买  本主题需向作者支付 2 贡献 才能浏览

24

主题

128

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3525

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

QQ
威望
805
贡献
2486
兑换币
0
注册时间
2010-11-16
在线时间
117 小时
2#
 楼主| 发表于 2012-2-13 18:11:25 | 只看该作者
文档里部分PID程序,
  1. typedef struct PID
  2. {
  3.     int SetPoint; //设定目标 Desired Value
  4.     double Proportion; //比例常数 Proportional Const
  5.     double Integral; //积分常数 Integral Const
  6.     double Derivative; //微分常数 Derivative Const
  7.     int LastError; //Error[-1]
  8.     int PrevError; //Error[-2]
  9. } PID;
  10. //*****************************************************
  11. //定义相关宏
  12. //*****************************************************
  13. #define P_DATA 100
  14. #define I_DATA  0.6
  15. #define D_DATA  1
  16. #define HAVE_NEW_VELOCITY 0X01
  17. //*****************************************************
  18. //声明PID实体
  19. //*****************************************************
  20. static PID sPID;
  21. static PID *sptr = &sPID;
  22. //*****************************************************
  23. //PID参数初始化
  24. //*****************************************************
  25. void IncPIDInit(void)
  26. {
  27. sptr->LastError = 0; //Error[-1]
  28. sptr->PrevError = 0; //Error[-2]
  29. sptr->Proportion = P_DATA; //比例常数 Proportional Const
  30. sptr->Integral = I_DATA; //积分常数Integral Const
  31. sptr->Derivative = D_DATA; //微分常数 Derivative Const
  32. sptr->SetPoint =100;  目标是100
  33. }
  34. //*****************************************************
  35. //增量式PID控制设计
  36. //*****************************************************
  37. int IncPIDCalc(int NextPoint)
  38. {
  39.    int iError, iIncpid; //当前误差
  40.    iError = sptr->SetPoint - NextPoint; //增量计算
  41.    iIncpid = sptr->Proportion * iError //E[k]项
  42.              - sptr->Integral * sptr->LastError //E[k-1]项
  43.              + sptr->Derivative * sptr->PrevError; //E[k-2]项
  44.     sptr->PrevError = sptr->LastError;   //存储误差,用于下次计算
  45.     sptr->LastError = iError;
  46.     return(iIncpid);                          //返回增量值
  47. }
  48. Int g_CurrentVelocity;
  49. Int g_Flag;
复制代码
但是如果要彻头彻尾地弄PID,建议多调试,写几个仿真程序
这是刘金锟先生的《先进PID控制及其MATLAB仿真.pdf》,方便大家实际演练PID

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

15

主题

331

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1714
威望
1003
贡献
417
兑换币
106
注册时间
2011-10-27
在线时间
147 小时
3#
发表于 2012-2-13 21:04:05 | 只看该作者
抠啊
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
威望
188
贡献
51
兑换币
8
注册时间
2012-2-3
在线时间
17 小时
毕业学校
xmu
4#
发表于 2012-2-14 13:08:30 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
338
威望
203
贡献
73
兑换币
24
注册时间
2012-2-14
在线时间
31 小时
毕业学校
中国计量学院
5#
发表于 2012-2-14 18:10:58 | 只看该作者
不错,通俗易懂的说
回复 支持 反对

使用道具 举报

24

主题

128

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3525

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

QQ
威望
805
贡献
2486
兑换币
0
注册时间
2010-11-16
在线时间
117 小时
6#
 楼主| 发表于 2012-2-15 11:05:18 | 只看该作者
这个PID资料我好不容易找到的,没有功劳也有苦劳吧。。
回复 支持 反对

使用道具 举报

22

主题

246

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4997
QQ
威望
2596
贡献
1389
兑换币
860
注册时间
2011-12-17
在线时间
506 小时
7#
发表于 2012-2-15 12:42:21 | 只看该作者
艾玛 发表于 2012-2-15 11:05
这个PID资料我好不容易找到的,没有功劳也有苦劳吧。。

这个用指针和结构体写的,跟不用指针结构体写有什么异同么,我找到的资料也都是用指针结构体写的~
回复 支持 反对

使用道具 举报

24

主题

128

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3525

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

QQ
威望
805
贡献
2486
兑换币
0
注册时间
2010-11-16
在线时间
117 小时
8#
 楼主| 发表于 2012-2-15 17:06:09 | 只看该作者
月光疾风 发表于 2012-2-15 12:42
这个用指针和结构体写的,跟不用指针结构体写有什么异同么,我找到的资料也都是用指针结构体写的~

使用指针的话,可以把任意更改指针所指的对象,便于以后以后和更改。而且所指对象一般出现在宏定义中,这样经过长时间再回头看的话也会更清楚一点。
这个主要是程序的写法问题,跟功能没有关系的
回复 支持 反对

使用道具 举报

22

主题

246

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4997
QQ
威望
2596
贡献
1389
兑换币
860
注册时间
2011-12-17
在线时间
506 小时
9#
发表于 2012-2-16 01:19:05 | 只看该作者
艾玛 发表于 2012-2-15 17:06
使用指针的话,可以把任意更改指针所指的对象,便于以后以后和更改。而且所指对象一般出现在宏定义中,这 ...

呵呵,多谢,明白了~~
还有个问题想请教下,就是调试过程中,PID,陀螺仪和加速度计角度融合等等的的图像曲线用什么来看啊?是自己写上位机界面把这些参数作成实时图像,还是另有什么软件可以直接看吗?小弟新手,求解答~~
回复 支持 反对

使用道具 举报

4

主题

44

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1966
威望
737
贡献
625
兑换币
45
注册时间
2011-8-16
在线时间
302 小时
10#
发表于 2012-2-16 13:20:08 | 只看该作者
我也想知道,我看网上别人那个分析图像,不知道怎么来的啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 15:55 , Processed in 0.084381 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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