第五飞思卡尔智能车电磁组获奖程序Word格式文档下载.docx
《第五飞思卡尔智能车电磁组获奖程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第五飞思卡尔智能车电磁组获奖程序Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
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;
//设定目标期望值
intFeedBack=0;
floatKKp=1.5;
//比例常数
floatKKi=0;
floatKKd=0.6;
//微分常数
signedintEE0=0;
//当前误差
signedintEE1=0;
//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;
//启用中断通道0
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;
//PLL系统脱离
PLLCTL_PLLON=1;
//打开PLL
SYNR=0xc0|0x07;
REFDV=0xc0|0x01;
POSTDIV=0x00;
//pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
_asm(nop);
//BUSCLOCK=64M
while(!
(CRGFLG_LOCK==1));
//当锁相环稳定时,使用它;
CLKSEL_PLLSEL=1;
//PLL系统进行;
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));
//非空时,继续等待
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;
//禁用PIT
PITCE_PCE0=1;
//启用定时器通道0
PITMUX_PMUX0=0;
//ch0连接到微定时器
PITMTLD0=0X0F;
//微时基0等于255个时钟周期
PITLD0=0XFFFF;
//超时期间=(PITMTLD+1)*(PITLD+1)/fBUS
//时间计算
//举例,16MHz总线计时器,最大超时时间等于:
//15*65536*/64000000=0.01536s.
PITINTE_PINTE0=1;
PITCFLMT_PITE=1;
//启用PIT
voidPit1_Init(void)
//PITCE_PCE1=1;
PITMUX_PMUX1=0;
//ch0连接到微定时器0
PITMTLD1=0X0F;
PITLD1=0XFFFF;
//time-outperiod=(PITMTLD+1)*(PITLD+1)/fB