TH2=0; TL2=0; TR0=1; //启动定时器 TR1=1; TR2=1; ET0=1; //允许T0中断 ET1=1; ET2=1; ES=1; //串行口中断位 EA=1; //中断允许位 }
//************************************************************************ void t_0() interrupt 1 //定时100ms(抽样时间) {
// unsigned char num; TL0=(256-250); tt0++; if(tt0==400) { tt0=0; // num++; flag=1; } }
//************************************************************************ void t_1() interrupt 3 //驱动电机 PWM speed*发生一次中断时间=低电平,(100-speed)*中断时间=高电平 { TH0=(256-100); tt1++; if(tt1>=400) tt1=0; if(tt1 21 A2=0; } } /********************基本用不到,防止溢出而已****************************/ void t_2() interrupt 5 //计数器 { TH2=0; TL2=0; TF2=0; } /*********PID******************************************************/ void pid(unsigned int count) //增量式 { en=set-count; //Un=q0*en; // -q1*en1+q2*en2 if(en>=5&&en<=-5) {Un=Kp*(en-en1)+Ki*en +Kd*(en-2*en1+en2);} // else Un=Kp*en; speed=speed+Un; if(speed>400)speed=400; if(speed<0) speed=0; en2=en1; en1=en; } //************************************************************************ void main() { T=1; Kp=1.8; Ti=1.8; Td=2.5; Ki=Kp*T/Ti; 22 Kd=Kp*Td; keyscan(); lcd_initial(); write_string(\ rps %\ write_command(0x80+0x40); //第二行 write_string(\ rps\ write_command(0x80+6); // write_date(set/100+0x30); //设置的数据 // write_date(set0/10+0x30); // write_date(set+0x30); init(); while(1) { keyscan(); keyspeed(); if(receive) { receive=0; write_command(0x80+6); write_date(set/100+0x30); write_date(set0/10+0x30); write_date(set+0x30); } if(flag)//100ms { unsigned char ge,shi,bai,num; flag=0; a=(TH2*256+TL2); //rps TH2=0; TL2=0; num++; sum=sum+a; //累加10次达到一秒 if(num==10) { summ=sum; num=0; sum=0; summ=summ/448; 23 bai=summ/100; shi=(summ0)/10; ge=summ; } } } write_command(0x80+0x40+6); write_date(bai+0x30); write_date(shi+0x30); write_date(ge+0x30); TI=1; printf(\ while(!TI); TI=0; delay(10); pid(summ); write_command(0x80+12); write_date(speed00/100+0x30); write_date(speed0/10+0x30); write_date(speed+0x30); 24 }