智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 17530|回复: 30
打印 上一主题 下一主题

舵机的PID控制输出

    [复制链接]

19

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
919
QQ
威望
487
贡献
284
兑换币
0
注册时间
2009-11-4
在线时间
74 小时
跳转到指定楼层
1#
发表于 2010-4-15 18:18:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//位置式 PID 控制设计
unsigned int LocPIDCalc(int NextPoint)
{
    register int  iError,dError;
  
  iError = sptr->SetPoint - NextPoint;       //偏差
  sptr->SumError += iError;       //积分
  dError = iError - sptr->LastError;     //微分
  sptr->LastError = iError;
      
  return(sptr->Proportion * iError            //比例项
           + sptr->Integral * sptr->SumError   //积分项
           + sptr->Derivative * dError);        //微分项
}

第一:以上的是位置式PID 算法,输入的是从CCD中读取过来的黑线的中点,setpoint的值是舵机位置。按照凌阳公司的PID解说,好像这个函数的返回值是具体的位置,而不是增量。其实PID的程序,比如说要偏差啦,积分了,微分了,这些设置我是懂的,我也看了好多大学的报告,也包括他们的程序,程序也很少。感觉还是有点云里雾里的。这个返回值到底是什么东西,是舵机角度的增量吗??还是PWM的增量,还是直接是具体位置(比如采集40个点,正中是20)?我知道增量式PID算出来是增量的,最后要实现控制的话还得加上原来的PWM数值。这个位置式是什么情况。
看过whut_wj的一个回答,输出的是PWM的增量。但是,他回答的是增量式的,而不是位置式的。

19

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
919
QQ
威望
487
贡献
284
兑换币
0
注册时间
2009-11-4
在线时间
74 小时
2#
 楼主| 发表于 2010-4-15 18:24:30 | 只看该作者
谢谢回答!!!!
回复 支持 反对

使用道具 举报

11

主题

212

帖子

0

精华

常驻嘉宾

侠客

Rank: 8Rank: 8

积分
5969

论坛元老奖章

威望
2649
贡献
3234
兑换币
0
注册时间
2010-1-13
在线时间
43 小时
3#
发表于 2010-4-15 20:24:30 | 只看该作者
好东西,不知道还有 电机控制PID么 急需???
回复 支持 反对

使用道具 举报

14

主题

586

帖子

0

精华

禁止发言

事人

积分
3226
威望
988
贡献
1966
兑换币
62
注册时间
2008-9-5
在线时间
136 小时
4#
发表于 2010-4-15 20:24:55 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

19

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
919
QQ
威望
487
贡献
284
兑换币
0
注册时间
2009-11-4
在线时间
74 小时
5#
 楼主| 发表于 2010-4-15 21:56:17 | 只看该作者
回复 3# 632693521


    PID控制电流的很多啊,论坛上发的也都是控制电流的,因为控制电流的通常用的是增量式的,我给你一个PDF吧,里面应该有你想要的东西,哎弄不上去,我复制黏贴下,程序如下:
//数据结构
typedef struct PID
{
  int  SetPoint;     //设定目标 Desired Value
  long SumError;                //误差累计  

  double  Proportion;         //比例常数 Proportional Const
  double  Integral;           //积分常数 Integral Const
  double  Derivative;         //微分常数 Derivative Const

  int LastError;               //Error[-1]
  int PrevError;               //Error[-2]
} PID;


//增量式 PID 控制设计
int IncPIDCalc(int NextPoint)
{
  register 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);
}
回复 支持 反对

使用道具 举报

19

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
919
QQ
威望
487
贡献
284
兑换币
0
注册时间
2009-11-4
在线时间
74 小时
6#
 楼主| 发表于 2010-4-15 21:58:57 | 只看该作者
回复 4# 50833713


    谢谢你的简单明了的回答。我可以确定下,这个位置式的PID控制,直接输给(比如我是用6.7级联的)PWMDTY6,控制舵机的转角??
回复 支持 反对

使用道具 举报

14

主题

586

帖子

0

精华

禁止发言

事人

积分
3226
威望
988
贡献
1966
兑换币
62
注册时间
2008-9-5
在线时间
136 小时
7#
发表于 2010-4-16 09:07:06 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

19

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
919
QQ
威望
487
贡献
284
兑换币
0
注册时间
2009-11-4
在线时间
74 小时
8#
 楼主| 发表于 2010-4-16 14:16:36 | 只看该作者
回复 7# 50833713


    十分感谢你的耐心回答,哈哈,终于有点知道了。。。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
324
威望
272
贡献
38
兑换币
18
注册时间
2010-4-14
在线时间
7 小时
9#
发表于 2010-4-16 15:55:31 | 只看该作者
路过~~~~
回复 支持 反对

使用道具 举报

0

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
威望
315
贡献
58
兑换币
0
注册时间
2010-4-13
在线时间
33 小时
10#
发表于 2010-4-16 18:16:33 | 只看该作者
guo
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 04:54 , Processed in 0.087340 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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