智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2328|回复: 8
打印 上一主题 下一主题

PID

[复制链接]

15

主题

49

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4627

论坛元老奖章

QQ
威望
938
贡献
3267
兑换币
16
注册时间
2011-10-22
在线时间
211 小时
跳转到指定楼层
1#
发表于 2012-2-15 15:10:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神帮我看看,三个偏差值基本正确但输出chang1不正确,这是什么原因?


//申明变量
//定义变量
float Kp;//PID 比例系数常数
float Ti;//PID 积分系数常数
float Td;//PID 微分系数常数
#define T;//PID 采样周期
float pid_E0;//偏差e[k]
float pid_E1;//偏差e[k-1]
float pid_E2;//偏差e[k-2]
float a0;
float a1;
float a2;
float chang1;//变化量
int chang;//对chang1取整
int setpoint;//目标值
//PID初始化
void PID_init(void)
{  
     Kp=;
     Ti=;
     Td=;
     T=;
     a0=Kp*(1+T/Ti+Td/T);
     a1=-Kp*(1+2*Td/T);
     a2=Kp*Td/T;
    // Ki=KpT/Ti=0.8,微分系数Kd=KpTd/T=0.8,Td=0.0002,根据实验调得的  

  //结果确定这些参数
     pid_E0=0;
     pid_E1=0;
     pid_E2=0;
     chang1=0;
     chang=0;
     setpoint=0;

}
//增量计算
void PID_cal(int nextpoint)
{   
    pid_E0 = SetPoint - nextPoint;//当前误差
    chang1 =  ao* pid_E0 //E[k]项
             - a1* pid_E1//E[k-1]项
             + a2 * pid_E2; //E[k-2]项
    //存储误差,用于下次计算
    pid_E2 = pid_E1;
    pid_E1 = pid_E0;
    gabs(float chang1);
    //返回增量值
    chang=(int)chang1;
    return(chang);

}
//增量为负值时的处理
float gabs(float chang1)
{
if(chang1<0)
{
chang1=0-chang1;
}
return chang1;
}

1

主题

9

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
QQ
威望
297
贡献
80
兑换币
14
注册时间
2012-2-15
在线时间
36 小时
2#
发表于 2012-2-21 21:06:49 | 只看该作者
void 怎么 return的??是这个 原因么。。。
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

高级会员

Rank: 4

积分
688
威望
432
贡献
166
兑换币
81
注册时间
2012-2-24
在线时间
45 小时
毕业学校
龙港高级中学
3#
发表于 2012-2-27 17:52:13 | 只看该作者
楼主好人 楼主一生平安
回复 支持 反对

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
威望
206
贡献
55
兑换币
0
注册时间
2012-2-20
在线时间
32 小时
毕业学校
西南石油
4#
发表于 2012-3-1 19:37:01 | 只看该作者
如二楼所说,你的无返回值函数哪来的返回值。。。
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
379
威望
310
贡献
49
兑换币
0
注册时间
2011-2-26
在线时间
11 小时
5#
发表于 2012-3-1 19:38:23 | 只看该作者
程序怎么这么简单??
回复 支持 反对

使用道具 举报

2

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
532
威望
340
贡献
94
兑换币
6
注册时间
2012-3-3
在线时间
49 小时
毕业学校
西南石油大学
6#
发表于 2012-3-5 21:29:43 | 只看该作者
楼主的程序似乎有点问题,change1应该等于chang1 =  ao* pid_E0+a1* pid_E1+ a2 * pid_E2吧,楼主试一下哈,我看的资料上这么写的哦!当然,void函数也是没有return的
回复 支持 反对

使用道具 举报

6

主题

124

帖子

0

精华

高级会员

Rank: 4

积分
712
QQ
威望
488
贡献
146
兑换币
3
注册时间
2012-2-12
在线时间
39 小时
7#
发表于 2012-3-7 22:20:05 | 只看该作者
乱七八糟
回复 支持 反对

使用道具 举报

8

主题

206

帖子

0

精华

高级会员

Rank: 4

积分
808

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

QQ
威望
418
贡献
300
兑换币
174
注册时间
2011-12-23
在线时间
45 小时
8#
发表于 2012-3-8 21:34:19 | 只看该作者
回复 支持 反对

使用道具 举报

6

主题

741

帖子

0

精华

常驻嘉宾

大坏蛋

Rank: 8Rank: 8

积分
3542

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

威望
2051
贡献
627
兑换币
193
注册时间
2012-3-11
在线时间
432 小时
9#
发表于 2012-5-5 21:43:24 | 只看该作者
这是想干嘛、、、、
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 07:14 , Processed in 0.078170 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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