智能车制作
标题: 飞思小车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[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;
}
作者: 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 |