第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx

上传人:b****7 文档编号:21928029 上传时间:2023-02-01 格式:DOCX 页数:16 大小:17.55KB
下载 相关 举报
第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx_第1页
第1页 / 共16页
第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx_第2页
第2页 / 共16页
第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx_第3页
第3页 / 共16页
第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx_第4页
第4页 / 共16页
第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx

《第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。

第五届飞思卡尔智能车电磁组获奖程序Word文件下载.docx

//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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1