第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx
《第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
//Error[-1]
signedintEE2=0;
//Error[-2]
signedintEError0=0,EError1=0;
signedintiiIncpid=0;
intsp=0;
///////////////////////////////
///舵机PID定义
//////////////////////////////
floatKp=3;
floatKi=1;
floatKd=4.2;
signedintE0=0;
signedintE1=0;
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<
ms;
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
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;
voidTERMIO_PutChar(unsignedcharch)
(SCI1SR1&
0x80));
//keepwaitingwhennotempty
SCI1DRL=ch;
unsignedcharTERMIO_GetChar(void)
returnSCI1DRL;
voidun(unsignedcharch)
0X40))
/////////////////////////////
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;
PITCFLMT_PITE=1;
//enablePIT
voidPit1_Init(void)
//PITCE_PCE1=1;
PITMUX_PMUX1=0;
PITMTLD1=0X0F;
PITLD1=0XFFFF;
//PITINTE_PINTE1=1;
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();
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<
e)
x1=-x1;
if(f<
g)
x2=-x2;
y=Pcrtl(x1,x2);
if(y>
560)
y=560;
if(y<
-450)
y=-450;
PWMDTY01=4675-y;
x1=%dx2=%d"
x1,x2);
if(x2>
80||x2<
-80)//大弯道
if(zd==1&
FeedBack>
78)
sudu(65);
if(d>
PORTB=0XF0;
shacheV(8);
else
PORTB=0X0F;
shacheV(52);
else//直道
if(x1>
50||x1<
-50)
x4++;
if(x4<
60)
sudu(60);
else
zd=1;
sudu(100);
x4=0;
voidmain(void){
/*putyourowncodehere*/
EnableInterrupts;
kongzhi();
){
_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;
voidinterrupt67PIT1_ISR(void)
PITTF_PTF1=1;
r++;
if(r==time)
{r=0;
PORTB=0XFF;
PITCE_PCE1=0;
PITINTE_PINTE1=0;
//DISableinteruptchannel0