第三届全国大学生智能汽车大赛
volatile unsigned int IC0Counter=0; volatile unsigned int IC0Counter_1=0; volatile unsigned int stop_flag=0; volatile int NowSpeed;
//2.083ms one int
volatile unsigned int GearWidth[4]={0} ; volatile unsigned int GearIndex=0; unsigned long GearWidthSum; unsigned long AveGearWidth ; unsigned long AveSpeed ;//测速
unsigned int pulse_counter=0; //计数 int DCDuty;
int Object_Speed=SPEED;
//100cm/s
int stop_stop=0xff,stop_stop1=0;
/******************转弯PID函数********************/ int pid1(int a,int b,int c) { int x=0;
x=(KP1*(a-b)+KI1*a+KD1*(a-2*b+c)); return (x); }
/*********************主函数*********************/ void main(void) {
SpdPID.ProportionalGain=30000;//1.52 0.15 0.05 0.94 1.84 24903
SpdPID.ProportionalGainScale=13; (0-1):GainScale=14
//0.76
的
系
数
25
第三届全国大学生智能汽车大赛
//(0-2):gainscale=13 0-128 0-256 ..
//(0-4) 0-8 0-16 0-32 0-64
//.0-32768--不能取最后的那个数,可以有小数,随着数的增大,小数数减少,从15位到0位 //精度1/32768----1
SpdPID.IntegralGain=25000;//20480;15000
1.45(pian da) 0.925 SpdPID.IntegralGainScale=14;//14;//0.6250.45 0.15 0.85 的系数 SpdPID.DerivativeGain=20000;// 0 SpdPID.DerivativeGainScale=14; SpdPID.PositivePIDLimit=DC_Limit; SpdPID.NegativePIDLimit=0; SpdPID.IntegralPortionK_1=0;//=0 SpdPID.InputErrorK_1=0;//=0
RTI_Init(); SET_PLL(); ATD_Init(); Servo_Init(); Forward_Init(); ECT_Init();
DDRT=0x00;
boma=PTIT;//读入拨码开关; boma>>=4;
boma&=0b00001111;
26
1.25
第三届全国大学生智能汽车大赛
zhidao_speed=90+7*boma; wangdao_speed=75+4*boma; chongchu_speed=50;//60+boma;
EnableInterrupts; for(;;) {
/////////////////////调速///////////////////// if(abs(ave_weight[2])<3) {
Object_Speed=zhidao_speed; }
else if(abs(ave_weight[2])<14) Object_Speed=wangdao_speed; else
Object_Speed=chongchu_speed;
/////////////////////转弯/////////////////////
cha1=pid1(ave_weight[2],ave_weight[1],ave_weight[0]); cha1=(cha1*100+cha0*0)/100; cha0 =cha1;
Sensor=4785-38*ave_weight[2];//pid1(ave_weight[2],ave_weight[1],ave_weight[0]);
if(Sensor>MID+MAXTURN) {
Sensor=MID+MAXTURN;
27
第三届全国大学生智能汽车大赛
}
if(Sensor Sensor=MID-MAXTURN; } PWMDTY01=Sensor; ave_weight[0]=ave_weight[1]; ave_weight[1]=ave_weight[2]; count0=0; } } #pragma CODE_SEG NON_BANKED /**********************************************/ 定时void interrupt 7 RTI_int() { int i,j,k,l,m; static int pulse_t; CRGFLG|=0x80; pulse_t++; if(pulse_t>5) { pulse_t=0; DDRA=0xff; 28 中1ms断 第三届全国大学生智能汽车大赛 PORTA_BIT0=1; for(i=0;i<1500;i++); ATD0CTL5=0x90;//启动一个新的转换 ,ch0 begin ATD1CTL5=0x90; while(!(ATD0STAT0&0x80)); //等待队列转换结束 AD_Value[0]=ATD0DR0L;//ATD0DR0L; //读取相应结果寄存器值清相应转换完成通道标志ATD0STAT1 AD_Value[1]=ATD0DR1L; AD_Value[2]=ATD0DR2L; AD_Value[3]=ATD0DR3L; AD_Value[4]=ATD0DR4L; AD_Value[5]=ATD0DR5L; AD_Value[6]=ATD0DR6L; AD_Value[7]=ATD0DR7L; //begin ATD1,ch0 begin while(!(ATD1STAT0&0x80));//等待ATD1队列转换结束 AD_Value[8]=ATD1DR0L; AD_Value[9]=ATD1DR1L; AD_Value[10]=ATD1DR2L; AD_Value[11]=ATD1DR3L; AD_Value[12]=ATD1DR4L; AD_Value[13]=ATD1DR5L;//ATD1DR5L; PORTA_BIT0=0; for(i=0;i<14;i++) { 29