电磁组飞思卡尔.docx
- 文档编号:17813291
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:21
- 大小:18.40KB
电磁组飞思卡尔.docx
《电磁组飞思卡尔.docx》由会员分享,可在线阅读,更多相关《电磁组飞思卡尔.docx(21页珍藏版)》请在冰点文库上搜索。
电磁组飞思卡尔
小车代码源程序
RouteTest.c
#include
#include
#include"main.h"
#defineuintunsignedint
uintAD0,AD1,AD2,AD3,AD4,AD5,AD6,AD7,AD8,AD9,ADFULL=0;
uintA0=0,A1=0,MAXTEMP0,MINTEMP0,MAXTEMP1,MINTEMP1;
uintA2=0,A3=0,MAXTEMP2,MINTEMP2,MAXTEMP3,MINTEMP3;
uintA4=0,A5=0,MAXTEMP4,MINTEMP4,MAXTEMP5,MINTEMP5;
uintA6=0,A7=0,MAXTEMP6,MINTEMP6,MAXTEMP7,MINTEMP7;
uintA8=0,A9=0,MAXTEMP8,MINTEMP8,MAXTEMP9,MINTEMP9;
voidRouteTest(void){
while(!
ATD0STAT2_CCF0);//判断通道0是否转换完成
AD0=ATD0DR0;
if(A0==0){
MAXTEMP0=AD0;
MINTEMP0=AD0;
}
else{
if(MAXTEMP0 if(MINTEMP0>AD0)MINTEMP0=AD0; } A0++; if(A0==LENGTH){ A0=0; MAXTEMP0=MAXTEMP0-MINTEMP0; } while(! ATD0STAT2_CCF1);//判断通道1是否转换完成 AD1=ATD0DR1; if(A1==0){ MAXTEMP1=AD1; MINTEMP1=AD1; } else{ if(MAXTEMP1 if(MINTEMP1>AD1)MINTEMP1=AD1; } A1++; if(A1==LENGTH){ A1=0; MAXTEMP1=MAXTEMP1-MINTEMP1; } while(! ATD0STAT2_CCF2);//判断通道2是否转换完成 AD2=ATD0DR2; if(A2==0){ MAXTEMP2=AD2; MINTEMP2=AD2; } else{ if(MAXTEMP2 if(MINTEMP2>AD2)MINTEMP2=AD2; } A2++; if(A2==LENGTH){ A2=0; MAXTEMP2=MAXTEMP2-MINTEMP2; } while(! ATD0STAT2_CCF3);//判断通道3是否转换完成 AD3=ATD0DR3; if(A3==0){ MAXTEMP3=AD3; MINTEMP3=AD3; } else{ if(MAXTEMP3 if(MINTEMP3>AD3)MINTEMP3=AD3; } A3++; if(A3==LENGTH){ A3=0; MAXTEMP3=MAXTEMP3-MINTEMP3; } while(! ATD0STAT2_CCF4);//判断通道4是否转换完成 AD4=ATD0DR4; if(A4==0){ MAXTEMP4=AD4; MINTEMP4=AD4; } else{ if(MAXTEMP4 if(MINTEMP4>AD4)MINTEMP4=AD4; } A4++; if(A4==LENGTH){ A4=0; MAXTEMP4=MAXTEMP4-MINTEMP4; } while(! ATD0STAT2_CCF5);//判断通道5是否转换完成 AD5=ATD0DR5; if(A5==0){ MAXTEMP5=AD5; MINTEMP5=AD5; } else{ if(MAXTEMP5 if(MINTEMP5>AD5)MINTEMP5=AD5; } A5++; if(A5==LENGTH){ A5=0; MAXTEMP5=MAXTEMP5-MINTEMP5; } while(! ATD0STAT2_CCF6);//判断通道6是否转换完成 AD6=ATD0DR6; if(A6==0){ MAXTEMP6=AD6; MINTEMP6=AD6; } else{ if(MAXTEMP6 if(MINTEMP6>AD6)MINTEMP6=AD6; } A6++; if(A6==LENGTH){ A6=0; MAXTEMP6=MAXTEMP6-MINTEMP6; } while(! ATD0STAT2_CCF7);//判断通道7是否转换完成 AD7=ATD0DR7; if(A7==0){ MAXTEMP7=AD7; MINTEMP7=AD7; } else{ if(MAXTEMP7 if(MINTEMP7>AD7)MINTEMP7=AD7; } A7++; if(A7==LENGTH){ A7=0; MAXTEMP7=MAXTEMP7-MINTEMP7; } while(! ATD0STAT2_CCF8);//判断通道8是否转换完成 AD8=ATD0DR8; if(A8==0){ MAXTEMP8=AD8; MINTEMP8=AD8; } else{ if(MAXTEMP8 if(MINTEMP8>AD8)MINTEMP8=AD8; } A8++; if(A8==LENGTH){ A8=0; MAXTEMP8=MAXTEMP8-MINTEMP8; } while(! ATD0STAT2_CCF9);//判断通道9是否转换完成 AD9=ATD0DR9; if(A9==0){ MAXTEMP9=AD9; MINTEMP9=AD9; } else{ if(MAXTEMP9 if(MINTEMP9>AD9)MINTEMP9=AD9; } A9++; if(A9==LENGTH){ A9=0; MAXTEMP9=MAXTEMP9-MINTEMP9; } ADFULL=ADFULL+1; } CarControl.c #include #include #include"SetPwm.h" #include"main.h" #include"RouteTest.h" #defineuintunsignedint #defineucharunsignedchar #definevalue01L-43 #definevalue23L-94 #definevalue45L-90 #definevalue67L-120 #definevalue89L-60 #definevalue01R43 #definevalue23R90 #definevalue45R110 #definevalue67R130 #definevalue89R60 //#definebentspeed45 //#definedirspeed45 #definevalueDL-220 #definevalueDR220 uintSPEED;//小车速度 intCARREL01=0,CARREL23=0,CARREL45=0,CARREL67=0,CARREL89=0;//小车偏移量 intERROR=4050,D_ERROR=0,LASTERROR=4050,E_ERROR=4050,ERRORREL=0; intspeedrel=0; uintsetspeed=60,realspeed=0; voidDelay10us(uintm)//延时10us { uintu; for(;m>0;m--) for(u=0;u<38;u++); } voidCarControl(void){ //采样100个数据 if(ADFULL==LENGTH){ ADFULL=0; //*********************************************** CARREL01=MAXTEMP0-MAXTEMP1; CARREL23=MAXTEMP2-MAXTEMP3; CARREL45=MAXTEMP4-MAXTEMP5; CARREL67=MAXTEMP6-MAXTEMP7; CARREL89=MAXTEMP8-MAXTEMP9; if(CARREL01>value01R)//01右转处理 { ERROR=4050+CARREL01-value01R; if(ERROR>=4100) ERROR=4100; setspeed=dirspeed; } if(CARREL23>value23R)//23右转处理 { ERROR=4100+2*(CARREL23-value23R); if(ERROR>=4264) ERROR=4264; setspeed=dirspeed; } if(CARREL45>value45R)//45右转处理 { ERROR=4264+6*(CARREL45-value45R); if(ERROR>=4411) ERROR=4411; setspeed=40; } if(CARREL67>value67R)//67右转处理 { ERROR=4411+6*(CARREL67-value67R); if(ERROR>=4600) ERROR=4600; setspeed=bentspeed; } //以上是右转弯处理 //************************************************************************* //以下是左转弯处理 if(CARREL01 { ERROR=4050+CARREL01-value01L; if(ERROR<=4000) ERROR=4000; setspeed=dirspeed; } if(CARREL23 { ERROR=4000+3*(CARREL23-value23L); if(ERROR<=3886) ERROR=3886; setspeed=dirspeed; } if(CARREL45 { ERROR=3886+4*(CARREL45-value45L); if(ERROR<=3794) ERROR=3794; setspeed=(dirspeed+bentspeed)/2; } if(CARREL67 { ERROR=3794+8*(CARREL67-value67L); if(ERROR<=3600) ERROR=3600; setspeed=bentspeed; } D_ERROR=D_ERROR+ERROR-LASTERROR;//误差累积计算 if(D_ERROR>valueDR||D_ERROR ERRORREL=D_ERROR; } LASTERROR=ERROR;//保存前一次误差 E_ERROR=ERROR+ERRORREL;//叠加误差累计值 if(E_ERROR>4600)E_ERROR=4600; if(E_ERROR<3600)E_ERROR=3600; PWMDTY23=E_ERROR; ERRORREL=0; //PWMDTY01=bentspeed; //**************速度控制************************* realspeed=(xishu+1)*speed; speedrel=setspeed-realspeed; if(speedflag==0){ if(speedrel<=-10&&(E_ERROR>4400||E_ERROR<3800)){ PWMDTY45=90;//反转迅速减速 PWMDTY01=0; }else{ PWMDTY45=0; PWMDTY01=setspeed; } }else{ PWMDTY01=setspeed; PWMDTY45=0; } } } Main.c #include #include #include"RouteTest.h" #include"CarControl.h" #include"SetPwm.h" #defineuintunsignedint #defineucharunsignedchar //#definedirspeed60 uintSTOPCAR=0,speed,speedsum=0,xishu=0,flag=0,jishi=0; uintbentspeed=0,dirspeed=0; uintspeedflag=0; voidDelay10(uintm)//延时10us { uintu; for(;m>0;m--) for(u=0;u<38;u++); } voidDelay(intk)//延时k*1ms { intu; for(;k>0;k--) for(u=0;u<3998;u++); } //总线时钟设置 voidsetbusclock(void) { SYNR=0x02; REFDV=0x01; while(! (CRGFLG&0x08)); CLKSEL=0x80; } /***************************************************** 功能: 时基中断初始化,实现5ms中断 500us进行一次测速。 ******************************************************/ voidPIT_Init(void) { PITCFLMT_PITE=0;//定时中断通道0关 PITCE_PCE0=1;//定时器通道0使能 PITMTLD0=240-1;//8位定时器初值设定。 240分频,在24MHzBusClock下,为10MHz。 即10us. PITLD0=50-1;//16位定时器初值设定。 50*10us=500us PITINTE_PINTE0=1;//定时器中断通道0中断使能 PITCFLMT_PITE=1;//定时器通道0使能 } /***************************************************** 功能: 脉冲累加器初始化,实现脉冲测速。 端口使用: PTT7口,电路接法: 需要上拉电阻5.1千欧姆 ******************************************************/ voidPACA_Init(void)//初始化脉冲累加器A { PACTL=0x40;//PT7上升沿脉冲计数 PACNT=0x00;//累加器置初值 } //ADC初始化 //ad转换速度3us voidADC_Init(void) { ATD0CTL1=0x2F;//10位精度 ATD0CTL2=0x40;//快速清零//AD模块上电,快速清零,无等待模式,禁止外部触发,中断禁止 ATD0CTL3=0xd0;//右对齐NOFIFO,FREEZE继续//每个序列10次转换,NoFIFO,Freeze模式下继续转换 ATD0CTL4=0x01;//4ATD周期,ATDClock=[BusClock*0.5]/[PRS+1]=6M,PRS=1;采样时间=4*1/6M=0.66us ATD0CTL5=0x30;//连续多通道 ATD0DIEN=0x00;//禁止数字输入 } //PWM初始化 voidPWM_Init(void){ //23舵机0145电机 PWME=0x00;//所有通道禁止 PWMPRCLK=0x33;//时钟8分频=3M PWMSCLB=150;//sB=10k PWMSCLA=15;//sa=b/2/15=100k PWMCLK_PCLK1=1;//选择sa PWMPOL_PPOL1=1; PWMCLK_PCLK5=1;//选择sa PWMPOL_PPOL5=1;//高电平输出 PWMCLK_PCLK3=0;//选择b PWMPOL_PPOL3=1;//高电平输出 PWMCTL=0xf0;//级联控制 PWMCAE_CAE1=0;//左对齐 PWMCAE_CAE5=0; PWMCAE_CAE3=0; PWMPER01=100;//周期寄存器sa/100=1k PWMPER23=60000;//sb/200=50hz20ms PWMPER45=100;//周期寄存器sa/100=1k PWMDTY01=45;//速度 PWMDTY23=4050;//1.5ms0度 PWMDTY45=0; PWME_PWME1=1; PWME_PWME5=1; PWME_PWME3=1; } voidPORT_Init(void){ //*********J口外部中断检测起跑线********************* DDRJ=0X00;//PJ0判断行同步脉冲到达 PPSJ=0x01;//上升沿 //PPSJ=0x00;//下降沿 PIEJ=0X01; PERJ=0xff; //**********拨码开关初始化**************** DDRE=0x00; DDRH=0x00; } voidmain(void) { DisableInterrupts; Delay(600); setbusclock(); PWM_Init(); PIT_Init(); PACA_Init(); ADC_Init(); PORT_Init(); //---------------------------------------- bentspeed=50; dirspeed=80; if(PORTE_PE0==0&&PORTE_PE2==1&&PORTE_PE3==1){ dirspeed=45; bentspeed=45; speedflag=1; }elseif(PORTE_PE0==1&&PORTE_PE2==0&&PORTE_PE3==1){ dirspeed=60; bentspeed=50; speedflag=1; }elseif(PORTE_PE0==1&&PORTE_PE2==1&&PORTE_PE3==0){ dirspeed=60; bentspeed=60; speedflag=1; }elseif(PORTE_PE0==1&&PORTE_PE2==0&&PORTE_PE3==0){ dirspeed=50; bentspeed=50; speedflag=1; }elseif(PORTE_PE0==0&&PORTE_PE2==0&&PORTE_PE3==0){ dirspeed=50; bentspeed=60; speedflag=1; }elseif(PORTE_PE0==0&&PORTE_PE2==0&&PORTE_PE3==1){ dirspeed=70; bentspeed=50; speedflag=0; } //--------------------------------------------------- for(;;){ EnableInterrupts; RouteTest(); CarControl(); if(STOPCAR>=2)PWME=0x88; //TimerOverflow(); }/*waitforever*/ /*pleasemakesurethatyouneverleavethisfunction*/ } //-----------------------中断函数处理-------------------// #pragmaCODE_SEG__NEAR_SEGNON_BANKED voidinterrupt24PORTJ_ISR(void) { if(STOPCAR==0||flag>2000){ STOPCAR=STOPCAR+1; jishi=1; } PIFJ_PIFJ0=1;//清除中断标志位
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电磁 组飞思 卡尔