智能车制作

标题: 飞思小车PID控制的通俗理解[3] [打印本页]

作者: whut_wj    时间: 2010-3-15 12:47
标题: 飞思小车PID控制的通俗理解[3]

PID实际编程的过程的,要注意的东西还是有几点的。PID这东西可以做得很深。

1 PID的诊定。凑试法,临界比例法,经验法。

2 T的确定,采样周期应远小于过程的扰动信号的周期,在小车程序中一般是ms级别。

3 目标速度何时赋值问题,如何更新新的目标速度?这个问题一般的人都乎略了。目标速度肯定不是个恒定的,那么何时改变目标速度呢?

4 改变了目标速度,那么e(k) e(k-1) e(k-2)怎么改变呢?是赋0还是要怎么变?

5 是不是PID要一直开着?

6 error为多少时就可以当速度已达到目标?

7 PID的优先级怎么处理,如果和图像采集有冲突怎么办?

8 PID的输入是速度,输出是PWM,按理说PWM产生速度,但二者不是同一个东西,有没有问题?

9 PID计算如何优化其速度?指针,汇编,移位?都可以试!

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

//定义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[k1]

             + sptr->Derivative * sptr->PrevError; //E[k2]

    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;

}


作者: chenrunshe_007    时间: 2010-3-15 14:10
回复 1# whut_wj
必须顶万哥
作者: DEMOK    时间: 2010-3-15 14:25
顶师兄~~~
作者: wzdjwlt    时间: 2010-3-15 17:41
狂顶
作者: lansedeyueliang    时间: 2010-3-15 22:19
受教了,谢谢!
作者: 孤舟之踏雪无痕    时间: 2010-3-16 16:18
真是感谢万分啊
作者: 晴空    时间: 2010-3-16 17:29
再顶
作者: fengneedning    时间: 2010-3-17 08:48
顶一下!
作者: mlzhangqiang    时间: 2010-3-17 17:56
顶起
作者: 高山@@    时间: 2010-3-18 08:53
很好
作者: 高山@@    时间: 2010-3-18 08:53
喜欢
作者: zhouhong    时间: 2010-3-20 09:33
顶起
作者: luson1321    时间: 2010-3-23 10:19
感谢....感谢。。。
作者: wangxiaojian    时间: 2010-3-24 14:44
多谢指点~讲的太好了~
作者: cjslaser2001    时间: 2010-3-24 17:58
真是感谢万分啊
作者: jiao19880804    时间: 2010-3-24 19:16
hao
作者: lfllcy    时间: 2010-3-24 19:19
一直顶!!
作者: 许青松    时间: 2010-4-3 09:15
谢谢
作者: 许青松    时间: 2010-4-3 09:15
但是你的【2】呢,有【1】也有【3】啊
作者: 476421477    时间: 2010-4-4 18:34
不行啊~~~main函数里有些没定义~~
作者: feiyangxiaomi    时间: 2010-4-5 10:01
顶了!!
作者: 许青松    时间: 2010-4-5 10:02
呵呵
作者: 许青松    时间: 2010-4-5 10:02
能不能再具体点啊
作者: 许青松    时间: 2010-4-5 10:02
谢谢
作者: hxlightblue    时间: 2010-4-8 10:44
ding
作者: nonfreedom    时间: 2010-4-8 16:59
懂了一点点
作者: forever8tf    时间: 2010-4-9 16:16
感谢感谢。
作者: forever8tf    时间: 2010-4-9 16:16
感谢感谢。
作者: 769777850    时间: 2010-4-17 22:52
顶!!
作者: 罗岳    时间: 2010-6-22 11:37
支持原理与开源,控制理论代码化,会使后辈受益非浅,
作者: shadow    时间: 2010-9-28 12:50
谢谢分享!
作者: vgonlan    时间: 2010-11-26 23:34
受教了,不胜感激,希望能看到更多楼主的文章,我感觉收获很大,谢谢楼主
作者: penny    时间: 2010-11-29 14:40
真的不错哎!
作者: penny    时间: 2010-11-29 14:40
真的不错哎!
作者: heut20080309021    时间: 2010-12-3 19:08
说的真好!!!
作者: echofly    时间: 2010-12-10 18:36
强大!
作者: wish_11    时间: 2010-12-12 08:56
多谢!
作者: wk441050785    时间: 2010-12-15 22:38
谢谢
作者: mikewang01    时间: 2010-12-16 13:54
必须顶起
作者: tshag    时间: 2010-12-28 19:35
谢谢啊,学了
作者: xin5yu    时间: 2010-12-30 16:21
看看
作者: qqhengg    时间: 2011-1-26 21:40
^
  ||
作者: zbl9212    时间: 2011-2-18 22:33
分析的不错
作者: ngng1109    时间: 2011-3-2 22:58
此贴必顶~~~
作者: yyoung    时间: 2011-3-5 09:32

作者: baldkiller    时间: 2011-3-6 01:03
顶!
作者: -简简单单-    时间: 2011-3-30 11:19
什么也不说了,顶你
作者: xiaoshagua    时间: 2011-3-30 21:04

作者: 120730409    时间: 2011-3-30 22:05

作者: 乐逍遥a    时间: 2012-3-12 16:53
感谢楼主
作者: 封号式寂寞    时间: 2012-5-7 21:34
:victory:
作者: 封号式寂寞    时间: 2012-5-7 21:34
不错
作者: tujunjie    时间: 2012-5-15 10:01
希望有人回答那几个问题呀
作者: 三少爷    时间: 2012-7-15 10:29
能解释的在具体些吗
作者: jick0212    时间: 2012-7-17 20:22
新手受教~!
作者: 不吃萝卜的兔子    时间: 2013-1-1 21:40
顶!!
作者: 似水流年、    时间: 2013-1-2 11:34

作者: 微电酱油    时间: 2013-1-7 10:17
备用!~!~
作者: 11463322    时间: 2013-4-26 18:27

作者: warn00    时间: 2013-4-29 20:09

作者: 风水影动    时间: 2013-6-11 23:10
嗯哼
作者: 风雨独行    时间: 2013-6-18 12:43
:):):):)
作者: Legends    时间: 2013-6-23 09:52
so good
作者: 文艺小青年    时间: 2014-11-18 03:36
很好
作者: 六安飞雨    时间: 2014-11-23 01:35
赞一个、、、、、、、、、、、、
作者: 胡莉英    时间: 2016-4-23 19:35
谢谢楼主
作者: 鹿先生_c4P24    时间: 2017-3-30 22:05
问一下,具体是怎么调呢?比如调舵机的PID的P
作者: ggg_ggg    时间: 2017-11-7 21:34
66666666666




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2