第五届飞思卡尔智能车电磁组获奖程序.docx
- 文档编号:8791853
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:16
- 大小:17.55KB
第五届飞思卡尔智能车电磁组获奖程序.docx
《第五届飞思卡尔智能车电磁组获奖程序.docx》由会员分享,可在线阅读,更多相关《第五届飞思卡尔智能车电磁组获奖程序.docx(16页珍藏版)》请在冰豆网上搜索。
第五届飞思卡尔智能车电磁组获奖程序
#include
#include"derivative.h"/*derivative-specificdefinitions*/
#include
#include
#include
#include
#pragmaLINK_INFODERIVATIVE"mc9s12xs128"
#defineK1
#defineN3
unsignedinti=0,j=0,m=0,n=0;
unsignedcharstr[]={'0'};
signedintb=0,c=0,d=0,e=0,f=0,g=0,spe=0,r=0,l,x3,y,z,x1,x2,x4;
inttime;
intzd=0,flag;
intpp;
/////////////////////////////////////
////电机PID定义
/////////////////////////////////////
intSetPoint=0;//设定目标DesiredValue
intFeedBack=0;
floatKKp=1.5;//比例常数ProportionalConst
floatKKi=0;
floatKKd=0.6;//微分常数DerivativeConst
signedintEE0=0;//当前误差
signedintEE1=0;//Error[-1]
signedintEE2=0;//Error[-2]
signedintEError0=0,EError1=0;
signedintiiIncpid=0;
intsp=0;
///////////////////////////////
///舵机PID定义
//////////////////////////////
floatKp=3;//比例常数ProportionalConst
floatKi=1;
floatKd=4.2;//微分常数DerivativeConst
signedintE0=0;//当前误差
signedintE1=0;//Error[-1]
signedintE2=0;//Error[-2]
signedintError0=0,Error1=0;
signedintiIncpid=0;
/////////////////////////////////////
/////////////////////////////////////
////电机PID
/////////////////////////////////////
////////////////////////////////////
unsignedintGetspeed(intcch1,intcch2)
{
EE0=cch1-cch2;//增量计算
EError0=EE0-EE1;
EError1=EE1-EE2;
iiIncpid=(int)(KKi*EError0+KKp*EE0+KKd*(EError0-EError1));
EE1=EE0;
EE2=EE1;//存储误差,用于下次计算
sp+=iiIncpid;
if(sp>210)
sp=210;
if(sp<0)
sp=0;
returnsp;
}
voidsudu(intSetPoint)
{
pp=Getspeed(SetPoint,FeedBack);
PWMDTY2=pp;
}
//////////////////////////////
///////////////////////////////
///舵机PID
//////////////////////////////
//////////////////////////////////////
intPcrtl(intch1,intch2)
{
E0=ch1-0;//增量计算
Error0=E0-E1;
Error1=E1-E2;
iIncpid=(int)(Ki*Error0+Kp*E0+Kd*(Error0-Error1));
E1=E0;
E2=E1;//存储误差,用于下次计算
returniIncpid;
}
///////////////////////////////////////
voidshache(intsha,inttim)
{
PWMDTY3=sha;
time=tim;
PITCE_PCE1=1;
PITINTE_PINTE1=1;//enableinteruptchannel0
zd=0;
}
////////////////////////////////////////
voidvIOPortInit(void)
{
DDRA=0X00;//PROTB键盘输出
PORTA=0X00;
DDRB=0xff;
DDRJ=0xFF;//PROTB
PTJ=0X80;
}
voiddelayms(intms)//40MHz--1ms
{
intii,jj;
if(ms<1)ms=1;
for(ii=0;ii for(jj=0;jj<0xff;jj++); } ////////////////////////////////// voidSetBusCLK_64M(void) { CLKSEL=0X00;//disengagePLLtosystem PLLCTL_PLLON=1;//turnonPLL SYNR=0xc0|0x07; REFDV=0xc0|0x01; POSTDIV=0x00;//pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz; _asm(nop);//BUSCLOCK=64M _asm(nop); while(! (CRGFLG_LOCK==1));//whenpllissteady,thenuseit; CLKSEL_PLLSEL=1;//engagePLLtosystem; } voidECT_Init(void)/*ECT初始化,使用输入捕捉功能*/ { TIOS=0x00;//设为输入捕捉 TSCR1=0x80;//定时器使能 TSCR2=0x07; TIE=0b00000010;//开中断 TCTL4=0b00001000;//0,1触发电平: //TCTL3=0b10101010; } /////////////////////// voidPWMInit(void) { PWME=0x00;//禁止PWM输出 PWMPOL=0xff; PWMCLK=0x08; PWMCTL=0x10; PWMSCLB=80; PWMCAE=0x00;//左对齐 PWMPRCLK=0x44;//PWM时钟CLOCKA, PWMPER01=40000; PWMPER3=250; PWMPER2=255; PWMDTY2=0; PWMDTY3=31; PWMDTY01=4675; PWME=0x0f;/*使能01,23通道*/ } ////////////////////////// voidSCI(void) { SCI1BDH=0X01; SCI1BDL=0XA0; SCI1CR1=0X00; SCI1CR2=0X08; } voidshacheV(intch3) { PWMDTY3=ch3; while(FeedBack>30); PWMDTY3=30; zd=0; } voidTERMIO_PutChar(unsignedcharch) { while(! (SCI1SR1&0x80));//keepwaitingwhennotempty SCI1DRL=ch; } unsignedcharTERMIO_GetChar(void) { while(! (SCI1SR1&0x80));//keepwaitingwhennotempty returnSCI1DRL; } voidun(unsignedcharch) { while(! (SCI1SR1&0X40)) { } SCI1DRL=ch; } ///////////////////////////// voidADInit(void) { ATD0CTL1=0x00; ATD0CTL2=0X40;/*使能AD,清除标志*/ ATD0CTL3=0XB0;/*队列长度为6,依次存入结果寄存器,继续转换*/ ATD0CTL4=0X05;/*8位精度,总线频率32分频*/ ATD0CTL5=0X30;/*,多通道,连续,从AD0开始转换*/ ATD0DIEN=0x00;//禁止数字输入 } //////////////////////////////// voidPACN_init(void) { PACTL_PAEN=0; TSCR1=0X80;//快速清除flag: PAOVFPAIF TSCR2=0X03; PACNT=0; PACTL_PAEN=1;//启动脉冲累加器A PACTL_PAMOD=0;//事件计数方式 PACTL_PEDGE=1;//PT7引脚上的出现上升沿时脉冲累加器计数器加1 TSCR1_TEN=1; } voidPit0_Init(void) { PITCFLMT_PITE=0;//disablePIT PITCE_PCE0=1;//enabletimerchannel0 PITMUX_PMUX0=0;//ch0connectedtomicrotimer0 PITMTLD0=0X0F;//microtimebase0equals255clockcycles PITLD0=0XFFFF;//time-outperiod=(PITMTLD+1)*(PITLD+1)/fBUS. //时间计算 //Forexample,fora16MHzbusclock,themaximumtime-outperiodequals: //15*65536*/64000000=0.01536s. PITINTE_PINTE0=1;//enableinteruptchannel0 PITCFLMT_PITE=1;//enablePIT } voidPit1_Init(void) { PITCFLMT_PITE=0;//disablePIT //PITCE_PCE1=1;//enabletimerchannel0 PITMUX_PMUX1=0;//ch0connectedtomicrotimer0 PITMTLD1=0X0F;//microtimebase0equals255clockcycles PITLD1=0XFFFF;//time-outperiod=(PITMTLD+1)*(PITLD+1)/fBUS. //时间计算 //Forexample,fora16MHzbusclock,themaximumtime-outperiodequals: //15*65536*/64000000=0.01536s. //PITINTE_PINTE1=1;//enableinteruptchannel0 PITCFLMT_PITE=1;//enablePIT } ///////////////////////////////////// voidbustor(intx[],intn) { inti,j,m,k; for(i=1;i<=n-1;i++) { k=1; for(j=1;j<=n-i;j++) if(x[j]>x[j+1]) { m=x[j]; x[j]=x[j+1]; x[j+1]=m; k=0; } if(k==1) break; } } /////////////////////////// voidkongzhi(void) { vIOPortInit(); SetBusCLK_64M(); ADInit(); SCI(); PORTB=0X00; PWMInit(); PACN_init(); Pit0_Init(); Pit1_Init(); for(;;) { ECT_Init(); while(! ATD0STAT0_SCF);/*等待当前队列转换完成*/ b=ATD0DR0L; c=ATD0DR1L; d=ATD0DR2L; e=ATD0DR3L; f=ATD0DR4L; g=ATD0DR5L; //printf("x1=%dx2=%dFeedBack=%dEE0=%diiIncpid=%dsp=%db=%dc=%d",x1,x2,FeedBack,EE0,iiIncpid,sp,b,c); if(b>0x10&&c>0x10) { x1=b-210; x2=c-210; if(d x1=-x1; if(f x2=-x2; y=Pcrtl(x1,x2); if(y>560) y=560; if(y<-450) y=-450; PWMDTY01=4675-y; //printf("x1=%dx2=%d",x1,x2); if(x2>80||x2<-80)//大弯道 { if(zd==1&&FeedBack>78) { sudu(65); if(d>e) { PORTB=0XF0; shacheV(8); } else { PORTB=0X0F; shacheV(52); } } } else//直道 { if(x1>50||x1<-50) { x4++; if(x4<60) sudu(60); else sudu(60); } else { zd=1; sudu(100); PWMDTY3=30; x4=0; } } } else sudu(65); } } voidmain(void){ /*putyourowncodehere*/ EnableInterrupts; kongzhi(); for(;;){ _FEED_COP();/*feedsthedog*/ }/*loopforever*/ /*pleasemakesurethatyouneverleavemain*/ } /////////////////////////////////// #pragmaCODE_SEG__NEAR_SEGNON_BANKED voidinterrupt9T1CaptureInterrupt(void) {TFLG1=0b00000010; i++; PORTB=0xff-i; un(i); if(i>0x0c) { PTJ=0X00; } } #pragmaCODE_SEGDEFAULT //////////////////////////////////////// ////////////////////////////////// #pragmaCODE_SEG__NEAR_SEGNON_BANKED voidinterrupt66PIT0_ISR(void) { PITTF_PTF0=1;//CLERFLAG FeedBack=PACNT; PACNT=0; } ////////////////////////////////// #pragmaCODE_SEG__NEAR_SEGNON_BANKED voidinterrupt67PIT1_ISR(void) { PITTF_PTF1=1;//CLERFLAG r++; if(r==time) {r=0; zd=0; PORTB=0XFF; PWMDTY3=30; PITCE_PCE1=0; PITINTE_PINTE1=0;//DISableinteruptchannel0 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 届飞思 卡尔 智能 电磁 获奖 程序