智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 7643|回复: 13
打印 上一主题 下一主题

[控制类] 求下面PID程序详细讲解

  [复制链接]

7

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
QQ
威望
388
贡献
69
兑换币
40
注册时间
2011-4-20
在线时间
13 小时
跳转到指定楼层
1#
发表于 2011-12-3 00:16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
/***************************************************************************
** Motor PID
** (c) Copyright 2009-2010, DEMOK
** All Rights Reserved
**
** V1.1.0
**************************************************************************/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
//-----------------------------------------------------
//定义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;
//-----------------------------------------------------
//声明PID实体
//-----------------------------------------------------
static PID sPID;
static PID *sptr = &sPID;
//-----------------------------------------------------
//定义相关宏
//-----------------------------------------------------
#define P_DATA 10
#define I_DATA 0
#define D_DATA 0
#define HAVE_NEW_VELOCITY 0X01
int g_CurrentVelocity; //速度
int g_Flag; //标志位
//-----------------------------------------------------
//定义全局变量
//-----------------------------------------------------
unsigned int CurrentVelocity=0;
unsigned int WholeVelocity=0;
unsigned char flag=0;
unsigned char vTmpPIT=0;
//-----------------------------------------------------
//-------------时钟初始化程序---------------------------
//-----------------------------------------------------
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{
CLKSEL=0x00; //48mhz
PLLCTL_PLLON=1;
SYNR=0XC0 | 0X05;
REFDV=0X80 | 0X01;
POSTDIV=0X00;
_asm(nop);
_asm(nop);
while(0==CRGFLG_LOCK);//锁相环锁定
CLKSEL_PLLSEL=1;//选定外部时钟
}
//-----------------------------------------
//--------------行场中断初始化-------------
//-----------------------------------------
void TIM_Init(void)
{
TIOS = 0x00; //T0、T1设置为输入捕捉,摄像头行场中断---关输出比较通道7
TCTL1 = 0x00; //OC7与逻辑通道断开
TCTL4 = 0x09; //通道0上升沿触发,通道 1 下降沿触发
OC7M = 0x00; //通道7不管理其他通道
TSCR1 = 0x80; //使能定时器
PACTL = 0x40; //使能PA,门计数模式,上升沿,中断禁止 0101 0000
//TIE = 0x03; //通道 0,1 中断使能
TFLG1 = 0xFF; //清中断标志位
}
//-----------------------------------------
//-------------定时中断初始化--------------
//-----------------------------------------
void PIT_Init(void)//定时中断初始化函数 0.01s=10ms定时中断设置
{
PITCFLMT_PITE=0; //定时中断通道0关
PITCE_PCE0=1; //定时器通道0使能
PITMTLD0=240-1; //8位定时器初值设定。240*4000/48000000=20ms
PITLD0=4000-1;//16位定时器初值设定。PITTIME*0.01MS
PITINTE_PINTE0=1;//定时器中断通道0中断使能
PITCFLMT_PITE=1;//定时器通道0中断使能
}
//-----------------------------------------
//--------------PWM初始化------------------
//-----------------------------------------
void PWM_Init(void)
{
//CH01 motor in1
//CH23 motor in2
//CH45 servo
//SB,B for ch2367
//SA,A for ch0145
PWME = 0x00; //PWM禁止
PWMCTL = 0x70; //CH01、23、45级联成16位PWM;
PWMCAE = 0x00; //选择输出模式为左对齐输出模式
PWMPOL = 0xFF; //先输出高电平,计数到DTY时,反转电平
PWMPRCLK = 0x33; //ClockA 8分频=BusClock/8=6MHz ;ClockB 8分频=BusClock/8=6MHz
PWMSCLA = 0x03; //ClockSA=ClockA/(2*3)=1MHz
PWMSCLB = 0x03; //ClockSB=ClockB/(2*3)=1MHz
PWMCLK = 0xFF; //CH0145选择clock SA做时钟源;CH2367选择clock SB做时钟源
PWMPER01=12000; //电机设置 1,3 通
PWMDTY01=0;
PWMPER23=12000;
PWMDTY23=0;
PWMCNT01 = 0;
PWMCNT23 = 0;
PWMCNT45 = 0; //计数器清零;
PWME = 0x2A; //PWM使能
}
//-----------------------------------------
//PID参数初始化
//-----------------------------------------
void PID_Init(void)
{
sptr->LastError = 0; //Error[-1]
sptr->revError = 0; //Error[-2]
sptr->;Proportion =P_DATA; //比例常数Proportional Const
sptr->Integral =I_DATA; //积分常数Integral Const
sptr->Derivative =D_DATA; //微分常数Derivative Const
sptr->SetPoint =20; //目标是40 V=40*4.2=168CM/S
}
//-----------------------------------------
//增量式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); //返回增量值
}
//-----------------------------------------
//---------主函数--------------------------
//-----------------------------------------
void main(void)
{
int PWM_Value;
//DisableInterrupts;
PLL_Init();
PWM_Init();
TIM_Init();
PIT_Init();
PID_Init();
DDRB=0XFF;
g_CurrentVelocity=0; //全局变量也初始化
g_Flag=0; //全局变量也初始化
EnableInterrupts;
for(;;)
{
if (g_Flag& HAVE_NEW_VELOCITY)
{
PWM_Value=IncPIDCalc(CurrentVelocity);
PWMDTY01+=PWM_Value;
g_Flag&=~ HAVE_NEW_VELOCITY;
}
}
}
//---------10ms定时进行速度采样---------//
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
CurrentVelocity=PACNT;
PACNT=0x0000;
g_Flag|= HAVE_NEW_VELOCITY;
//WholeVelocity += CurrentVelocity;
vTmpPIT++;
if(vTmpPIT==100) //2秒
{
PORTB=~PORTB;//输出取反
vTmpPIT=0;
}
PITTF_PTF0=1;//清中断标志位
}

4

主题

38

帖子

0

精华

高级会员

Rank: 4

积分
515
威望
385
贡献
34
兑换币
0
注册时间
2011-10-26
在线时间
48 小时
2#
发表于 2011-12-3 21:25:30 | 只看该作者
标示很复杂 学习中
回复

使用道具 举报

5

主题

59

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1569
威望
863
贡献
386
兑换币
45
注册时间
2011-12-1
在线时间
160 小时
3#
发表于 2011-12-25 15:52:01 | 只看该作者
刚接触PId很是迷惑
回复

使用道具 举报

3

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
威望
179
贡献
37
兑换币
0
注册时间
2011-10-9
在线时间
8 小时
4#
发表于 2011-12-30 19:32:29 | 只看该作者
就是。PID不好调
回复

使用道具 举报

6

主题

124

帖子

0

精华

高级会员

Rank: 4

积分
712
QQ
威望
488
贡献
146
兑换币
3
注册时间
2012-2-12
在线时间
39 小时
5#
发表于 2012-3-5 10:33:20 | 只看该作者
程序写的还行,
回复

使用道具 举报

2

主题

14

帖子

0

精华

注册会员

Rank: 2

积分
183
威望
149
贡献
26
兑换币
0
注册时间
2012-2-18
在线时间
4 小时
毕业学校
西安建筑科技大学
6#
发表于 2012-3-5 16:25:12 | 只看该作者
比较晕乎
回复

使用道具 举报

5

主题

167

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4628
威望
879
贡献
225
兑换币
100
注册时间
2012-2-18
在线时间
3930 小时
毕业学校
神马
7#
发表于 2012-3-10 11:23:05 | 只看该作者
回复

使用道具 举报

1

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
威望
155
贡献
42
兑换币
0
注册时间
2012-3-27
在线时间
8 小时
8#
发表于 2012-4-13 15:27:39 | 只看该作者
表示压力很大
回复

使用道具 举报

7

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
534
威望
319
贡献
117
兑换币
0
注册时间
2012-3-13
在线时间
49 小时
毕业学校
长沙理工小学
9#
发表于 2012-4-26 22:14:39 | 只看该作者
程序里还有笑脸  我擦
回复

使用道具 举报

6

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
744
QQ
威望
514
贡献
134
兑换币
0
注册时间
2011-12-2
在线时间
48 小时
10#
发表于 2012-5-14 22:43:20 | 只看该作者
困惑!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 03:57 , Processed in 0.084231 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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