智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4522|回复: 11
打印 上一主题 下一主题

跪求PID控制程序的注释

[复制链接]

5

主题

38

帖子

0

精华

高级会员

Rank: 4

积分
804
QQ
威望
303
贡献
469
兑换币
6
注册时间
2011-12-26
在线时间
16 小时
跳转到指定楼层
1#
发表于 2012-3-9 11:06:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2贡献
求frespeed、prespeed、freservospeed、presservopeed、preserved、temppwm、Speed代表的含义
以及速度和舵机控制分别用了那种具体的PID算法
衷心感谢!!!

#include "Judgement.H"
#include <math.h>
unsigned short PWM;
#define maxpwm 18000
int count =0;
int tempmid=0;
unsigned short frespeed=0;
unsigned short prespeed=0;
unsigned short freservospeed=0;
unsigned short presservopeed=0;
unsigned short preserved[80]={0};
int mortorPwm[16]={16000,13000,11000,9000,8000,6000,6000,6000,6000,6000,8000,6000,4000,6000,4000,3000};
extern "C" _declspec(dllexport)
int speedPid(int temppwm,int frespeed,int Speed,int prespeed)
{
double retVal=10.9*Speed+17.02*(temppwm-10.9*Speed)+9*10.9*(Speed-frespeed)+10.9*(frespeed-prespeed);
if (retVal>65535)
  retVal=65535;
if (retVal<0)
  retVal=0;
return retVal;
return retVal;
}
int servoPid(int temppwm,int frespeed,int prespeed)
{
double retVal=temppwm+0.8*(temppwm-frespeed)+0.32*(frespeed-prespeed);
  if (retVal>65535)
  retVal=65535;
if (retVal<0)
  retVal=0;
return retVal;
}
void Judge( unsigned short Speed,
   unsigned char* SensorData, unsigned short SensorCount,
   unsigned char* CCDData, int CCDWidth, int CCDHeight,
   unsigned short* MotorPWM, unsigned short* SteerPWM)
{
/*PWM += 1;
*MotorPWM = 0;
*SteerPWM = 16384;*/
int i=0;
int j=0;
int k=0;
int m=0;
double mid=0;
int loop=0;
double avgpwm=0;
double interlapce=0;
double angle=0;
double temppwm;
double linek=0;
double lineb=0;
double dkd=0;
double offset=0;
  for(i=0;i<CCDWidth*CCDHeight;i++)
{
  if(CCDData[i]==0&&CCDData[i-1]==255)
   j=i;
  if(CCDData[i]==0&&CCDData[i+1]==255)
   k=i;
  m=j/32;
  j=j%32;
  k=k%32;
  mid=(j+k)/2+0.5;
  preserved[m]=(unsigned short)mid;
}
linek=(preserved[79]-preserved[0])/79;
lineb=preserved[0];
dkd=sqrt(linek*linek+1);
for(i=0;i<80;i++)
{
  offset+=(preserved[i]-linek*i-lineb)/dkd;
}
for(i=CCDWidth*CCDHeight;i>0;i--)
{
  if(CCDData[i]==0&&CCDData[i-1]==255)
   j=i;
  if(CCDData[i]==0&&CCDData[i+1]==255)
   k=i;
}
m=j/32;
j=j%32;
k=k%32;
mid=(int)((j+k)/2);
if(j==0)
{
  /*if(frePWM[count]>0)
   temppwm=32768*(1-frePWM[count]/(3.14/6));
  else
   temppwm=32768*(1+frePWM[count]/(3.14/6));
  *SteerPWM=temppwm;
  *MotorPWM=500;*/
  return;
}
*MotorPWM=18000;
if((int)mid==CCDWidth/2)
{
  prespeed=Speed;
  frespeed=Speed;
  *MotorPWM=speedPid(18000,frespeed,Speed,prespeed);
  *SteerPWM=32768;
}
else
{
  
  interlapce=(CCDWidth/2-mid);
  
  temppwm=32768+65535/32*interlapce;
  if(temppwm>65535)
   temppwm=65535;
  else if(temppwm<0)
   temppwm=0;
  
  *SteerPWM=servoPid(temppwm,freservospeed,presservopeed);
  presservopeed=freservospeed;
  freservospeed=*SteerPWM;
  
  int interspeed=0;
  if(interlapce>0)
   interspeed=16-interlapce;
  else
   interspeed=16+interlapce;
  temppwm=mortorPwm[abs(interlapce)];
  
  *MotorPWM=speedPid(temppwm,frespeed,Speed,prespeed);
  prespeed=frespeed;
  frespeed=Speed;
}
}
extern "C" _declspec(dllexport)
void Reset()
{
PWM = 0;
}

5

主题

38

帖子

0

精华

高级会员

Rank: 4

积分
804
QQ
威望
303
贡献
469
兑换币
6
注册时间
2011-12-26
在线时间
16 小时
2#
 楼主| 发表于 2012-3-12 08:20:35 | 只看该作者
各位大哥大姐,拜托啦
回复

使用道具 举报

2

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
威望
318
贡献
98
兑换币
68
注册时间
2012-2-27
在线时间
37 小时
毕业学校
锡林浩特市第六中学
3#
发表于 2012-3-12 16:40:30 | 只看该作者
我也想要 709733624@qq.com  我的邮箱 麻烦大神给我发分
回复

使用道具 举报

1

主题

12

帖子

0

精华

注册会员

Rank: 2

积分
199
威望
142
贡献
47
兑换币
0
注册时间
2012-3-13
在线时间
5 小时
毕业学校
东方学院
4#
发表于 2012-3-13 16:32:28 | 只看该作者
哪位大神有也给小弟一份呗
        jun198933@163.com   
回复

使用道具 举报

5

主题

123

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3288
QQ
威望
1642
贡献
1068
兑换币
562
注册时间
2012-3-22
在线时间
289 小时
5#
发表于 2012-3-23 16:47:17 | 只看该作者
菜鸟求学
回复

使用道具 举报

5

主题

123

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3288
QQ
威望
1642
贡献
1068
兑换币
562
注册时间
2012-3-22
在线时间
289 小时
6#
发表于 2012-3-23 16:47:48 | 只看该作者
740126966 饿一份
回复

使用道具 举报

2

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
威望
186
贡献
55
兑换币
0
注册时间
2012-3-21
在线时间
9 小时
毕业学校
山东交通学院
7#
发表于 2012-4-9 22:02:24 | 只看该作者
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//==================================================
//定时中断函数
//定时中断0 实现500MS 定时
//author:yangtze
//time:2009/5/2
//==================================================
#define PITTIME 5000//设定为50MS 定时
unsigned int vTmpPIT=0;
void pllclk(void)//24MHz,外部时钟为16MHz
{
CLKSEL=0X00;
PLLCTL=0xe1;
SYNR=2;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
REFDV=1;
PLLCTL=0X60;
asm NOP;
asm NOP;
asm NOP;
while((CRGFLG&0X08)==0);//时钟校正同步
CLKSEL=0X80;
}
void initIOBoutput(void)//IO 口初始化,B 口为输出
{
DDRB=0XFF;
PORTB=0XFF;
}
void initPIT(void)//定时中断初始化函数50MS 定时中断设置
{
PITCFLMT_PITE=0; //定时中断通道0 关
PITCE_PCE0=1;//定时器通道0 使能
PITMTLD0=240-1;//8 位定时器初值设定。240 分频,在24MHzBusClock 下,为0.1MHz。

10us.
PITLD0=PITTIME-1;//16 位定时器初值设定。PITTIME*0.01MS
PITINTE_PINTE0=1;//定时器中断通道0 中断使能
PITCFLMT_PITE=1;//定时器通道0 使能
}
void main(void)
{
pllclk();
initIOBoutput();
initPIT();
EnableInterrupts;
for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
vTmpPIT++;
if(vTmpPIT==10)
{
PORTB=~PORTB;//输出取反
vTmpPIT=0;
}
PITTF_PTF0=1;//清中断标志位
}
回复

使用道具 举报

6

主题

214

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5338

论坛元老奖章

QQ
威望
740
贡献
4452
兑换币
10
注册时间
2011-7-13
在线时间
73 小时
8#
发表于 2012-4-10 13:35:31 | 只看该作者
这都是啥,这么乱
回复

使用道具 举报

6

主题

124

帖子

0

精华

高级会员

Rank: 4

积分
712
QQ
威望
488
贡献
146
兑换币
3
注册时间
2012-2-12
在线时间
39 小时
9#
发表于 2012-4-12 13:43:53 | 只看该作者
看看
回复

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
威望
172
贡献
62
兑换币
0
注册时间
2012-3-26
在线时间
19 小时
10#
发表于 2012-4-12 16:56:39 | 只看该作者
各种寄存器啊,还穿插汇编
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 16:36 , Processed in 0.216523 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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