智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 39722|回复: 393
打印 上一主题 下一主题

[编程类] PID算法

  [复制链接]

2

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
QQ
威望
253
贡献
49
兑换币
14
注册时间
2010-4-2
在线时间
3 小时
跳转到指定楼层
1#
发表于 2010-4-4 18:36:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
//*****************************************************

//定义PID结构体

//*****************************************************

typedef struct PID

{

    int SetPoint; //设定目标 Desired Value

    double Proportion; //比例常数 Proportional Const

    double Integral; //积分常数 Integral Const

    double Derivative; //微分常数 Derivative Const

    int LastError; //Error[-1]

    int PrevError; //Error[-2]

} PID;

//*****************************************************

//定义相关宏

//*****************************************************

#define P_DATA 100

#define I_DATA
0.6

#define D_DATA
1

#define HAVE_NEW_VELOCITY 0X01

//*****************************************************

//声明PID实体

//*****************************************************

static PID sPID;

static PID *sptr = &sPID;

//*****************************************************

//PID参数初始化

//*****************************************************

void IncPIDInit(void)

{

sptr->LastError = 0; //Error[-1]

sptr->PrevError = 0; //Error[-2]

sptr->Proportion = P_DATA; //比例常数 Proportional Const

sptr->Integral = I_DATA; //积分常数Integral Const

sptr->Derivative = D_DATA; //微分常数 Derivative Const

sptr->SetPoint =100;
目标是100

}

//*****************************************************

//增量式PID控制设计

//*****************************************************

int IncPIDCalc(int NextPoint)

{

   int iError, iIncpid; //当前误差

   iError = sptr->SetPoint - NextPoint; //增量计算

   iIncpid = sptr->Proportion * iError //E[k]项

             - sptr->Integral * sptr->LastError //E[k-1]项

             + sptr->Derivative * sptr->PrevError; //E[k-2]项

    sptr->PrevError = sptr->LastError;
//存储误差,用于下次计算

    sptr->LastError = iError;

    return(iIncpid);
//返回增量值

}

int g_CurrentVelocity;

int g_Flag;


void main(void)

{



DisableInterrupt

InitMCu();


IncPIDInit();

g_CurrentVelocity=0;
//全局变量也初始化

g_Flag=0;
//全局变量也初始化

EnableInterrupt;




While(1)

{


if (g_Flag& HAVE_NEW_VELOCITY)


{


PWMOUT+= IncPIDCalc(CurrentVelocity);


g_Flag&=~ HAVE_NEW_VELOCITY;

}

}

}

//****************************************

//采样周期T

//****************************************

Interrrupt TIME void

{


CurrentVelocity =GetCurrentVelocity;


g_Flag|= HAVE_NEW_VELOCITY;

}


这是从其他贴复制过来的,请问谁能帮我看看main函数里的错误。。。。。

或者谁有更好的PID程序。。能不能发给我~~

5

主题

17

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4018
威望
243
贡献
3753
兑换币
0
注册时间
2010-3-17
在线时间
11 小时
2#
发表于 2010-4-4 19:05:14 | 只看该作者
看看
回复

使用道具 举报

4

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
879
威望
528
贡献
181
兑换币
87
注册时间
2009-1-20
在线时间
85 小时
3#
发表于 2010-4-4 19:10:40 | 只看该作者
路过
回复

使用道具 举报

6

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
681
威望
448
贡献
151
兑换币
0
注册时间
2010-1-10
在线时间
41 小时
4#
发表于 2010-4-4 21:58:00 | 只看该作者
期待高人指点~~~~
回复

使用道具 举报

4

主题

151

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1335
威望
779
贡献
372
兑换币
346
注册时间
2009-11-28
在线时间
92 小时
5#
发表于 2010-4-4 22:03:43 | 只看该作者
还没做到。。。急死了。。。
回复

使用道具 举报

1

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
422
威望
313
贡献
61
兑换币
0
注册时间
2010-2-6
在线时间
24 小时
6#
发表于 2010-4-4 22:07:01 | 只看该作者
看看了
回复

使用道具 举报

0

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
威望
207
贡献
20
兑换币
0
注册时间
2010-3-9
在线时间
1 小时
7#
发表于 2010-4-4 23:06:22 | 只看该作者
深奥
回复

使用道具 举报

2

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
威望
263
贡献
41
兑换币
0
注册时间
2010-2-5
在线时间
15 小时
8#
发表于 2010-4-4 23:27:31 | 只看该作者
这程序我也试过~~怎么调参数效果都不理想。。。期望高人指点!
回复

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
QQ
威望
255
贡献
20
兑换币
0
注册时间
2009-12-22
在线时间
11 小时
9#
发表于 2010-4-4 23:35:36 | 只看该作者
看看
回复

使用道具 举报

10

主题

208

帖子

0

精华

常驻嘉宾

新手

Rank: 8Rank: 8

积分
3455

论坛元老奖章

QQ
威望
644
贡献
2693
兑换币
0
注册时间
2009-12-18
在线时间
59 小时
10#
发表于 2010-4-5 11:58:56 | 只看该作者
学习了一下程序,问题没看出来,有个资料和这个程序很相近,分享一下吧!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-2 04:59 , Processed in 0.112784 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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