模型车控制主程序代码.docx
《模型车控制主程序代码.docx》由会员分享,可在线阅读,更多相关《模型车控制主程序代码.docx(18页珍藏版)》请在冰点文库上搜索。
模型车控制主程序代码
附录A模型车控制主程序代码
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#include"xslcd.h"
#defineCENTER3450
#defineBZ2
inttime=0,time2=0,t3=0,t4=500;
intspeed=0;
intstart=0;
intbiao[14]={0};//原始数据
intrun=0,run1=0;
intsf=65;//偏差量
intsf_turn=0,sf_turn1=0;//偏差量
intturn=0,turn1=0;//转向大小
intk2=0,k1=0;
intt=0;//转向级别
intmiddle=0,left=0,right=0;
intsign=0;
intgraph=0;
intsign_key_con=0,sign_2=0;
intzhi=0,wan=0;
////////////////舵机////////////
intdjzx=3000;
intleftmax=1500;
intrightmax=4900;
////////////////////////////////
staticvoidIOC_Init(void)
{
TSCR1=0x80;//定时器使能
TSCR2=0X01;
PACTL=0X50;//PT7PIN,PACN3216BIT,FALLingedge,NOTINTERRUPT
TCTL3=0xc0;//c-输入捕捉7任何沿有效,
TCTL4=0x0e;//40表示ICx禁止,1表示上升沿,2表示下降沿,3表示任何沿
TIE=0x00;//每一位对应相应通道中断允许,0表示禁止中断
TIOS=0x00;//每一位对应通道的:
0输入捕捉,1输出比较
TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
}
voidSetBusCLK_80M(void)
{
CLKSEL=0X00;//disengagePLLtosystem
PLLCTL_PLLON=1;//turnonPLL
SYNR=0xc0|0x09;
REFDV=0x80|0x01;
POSTDIV=0x00;//pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
_asm(nop);//BUSCLOCK=80M
_asm(nop);
while(!
(CRGFLG_LOCK==1));//whenpllissteady,thenuseit;
CLKSEL_PLLSEL=1;//engagePLLtosystem;
}
staticvoidRTI_Init(void)
{
RTICTL=0x97;//1ms,
CRGINT=0X80;//enableRTIInterrupt
}
voidIO_Init(void)
{
DDRE=0XFF;
DDRT=0X00;
DDRB=0X18;
DDRA=0X00;
DDRS=0xff;
}
/*******************************************************
函数名称:
PwmInit
函数作用:
初始化PWM,通道0使用100K时钟A,8位PWM控制电机,通道23级联使用16位PWM,2000K时钟A控制舵机
入口参数:
无
出口参数:
无
********************************************************/
voidPwmInit(void)
{
PWME=0x00;//关闭PWM
PWMPOL=0xff;//PWM极性先高后低
PWMCLK=0xff;//使用时钟源SA,SB
PWMPRCLK=0x35;//时钟A预分频设置E/32=32/32=2.5MHz时钟B预分频设置E/8=32/8=10MHz
PWMCAE=0x00;//左对齐
PWMCTL=0x20;//23通道级联方式,01通道非级联方式
PWMSCLA=0x19;//设定时钟SA=2.5MHz/25/2=100KHz
PWMSCLB=0x02;//设定时钟SB=10MHz/2/2=2500KHz
PWMPER23=25000;//通道3设定周期值25000,周期10ms
PWMDTY23=1800;//
PWMPER1=100;//通道1设定周期值100,1kHz
PWMDTY1=45;//通道1设定脉宽值50
PWMPER5=100;//通道1设定周期值100,1kHz
PWMDTY5=100;//通道1设定脉宽值50
PWME=0x2A;//通道1PWM使能通道3PWM使能
}
/******************************************************
函数名称:
key()
函数作用:
按键down4left2right5up3
*******************************************************/
intkey(){
intKEY=0;
intc=0;
if(PTT_PTT3==0){//up
KEY=2;
}
if(PTT_PTT5==0){//right
KEY=1;
}
if(PTT_PTT2==0){//left
KEY=3;
}
if(PTT_PTT4==0){//left
KEY=4;
}
returnKEY;
}
voidconfig(){
intc=0;
inti=0;
c=key();
if(c!
=0){
sign_2=key();
}else{
if(sign_2!
=0){
sign_key_con=sign_2;
sign_2=0;
}
}
if(sign_key_con==1){//调试函数减少
zhi=zhi+2;
sign_key_con=0;
}
if(sign_key_con==3){//调试函数减少
zhi=zhi-2;
sign_key_con=0;
}
if(sign_key_con==2){//调试函数减少
wan=wan+2;
sign_key_con=0;
}
if(sign_key_con==4){//调试函数减少
wan=wan-2;
sign_key_con=0;
}
}
voidCaiji_ji(void){
biao[0]=0;
biao[13]=0;
if(PORTB_PB5==1){
biao[1]=1;
}else{
biao[1]=0;
}
if(PORTB_PB0==1){
biao[3]=1;
}else{
biao[3]=0;
}
if(PORTB_PB6==1){
biao[5]=1;
}else{
biao[5]=0;
}
if(PORTB_PB1==1){
biao[7]=1;
}else{
biao[7]=0;
}
if(PORTB_PB7==1){
biao[9]=1;
}else{
biao[9]=0;
}
if(PORTB_PB2==1){
biao[11]=1;
}else{
biao[11]=0;
}
}
voidCaiji_ou(void){
if(PORTB_PB5==1){
biao[2]=1;
}else{
biao[2]=0;
}
if(PORTB_PB0==1){
biao[4]=1;
}else{
biao[4]=0;
}
if(PORTB_PB6==1){
biao[6]=1;
}else{
biao[6]=0;
}
if(PORTB_PB1==1){
biao[8]=1;
}else{
biao[8]=0;
}
if(PORTB_PB7==1){
biao[10]=1;
}else{
biao[10]=0;
}
if(PORTB_PB2==1){
biao[12]=1;
}else{
biao[12]=0;
}
}
voidcelue(){
inti=0;//循环变量
intgate=0;//两点差值
intsign_black=0;//在黑区上标志
intsign_enter=0;//进入标志
intsign_exit=0;//离开标志
inteffect=0;//有效标志
intenter_black=0;//进入黑区
intexit_black=0;//离开黑区
intnumber_black=0;//黑点个数
intblackge=0;//黑区个数
intsf_new=0;
intsf_cha=0;
run=0;
for(i=0;i<13;i++){
gate=biao[i]-biao[i+1];//两点逐差
if(gate==-1&&sign_enter==0&&sign_exit==0){//进入黑区
sign_black=1;
sign_enter=1;
enter_black=i;//入口位置黑前白
}
if(gate==1&&sign_enter==1&&sign_exit==0){//离开黑区
sign_black=0;
sign_exit=1;
exit_black=i+1;//离开位置黑后白
}
if(sign_black==1){//在黑区上
number_black++;
}
if(sign_enter==1&&sign_exit==1){//计算中心线
sign_enter=0;
sign_exit=0;
if(number_black>0&&number_black<3)
effect=1;
if(number_black>2&&number_black<=4)
effect=2;
if(number_black>4){
sf=65;
//run=1;
}
if(effect==1){//正常黑区
sf_new=(enter_black+exit_black)*5;
if(sf-sf_new<30&&sf-sf_new>-30){
sf=sf_new;
run=1;
//break;
}
blackge++;
}
effect=0;
enter_black=0;
exit_black=0;
number_black=0;
}
}
if(run==1){
sf_turn=sf-65;
switch(sf_turn){
case55:
t=40;break;
case50:
t=35;break;
case45:
t=35;break;
case40:
t=32;break;
case35:
t=32;break;
case30:
t=30;break;
case25:
t=24;break;
case20:
t=24;break;
case15:
t=20;break;
case10:
t=20;break;
case5:
t=20;break;
case0:
t=0;break;
case-5:
t=20;break;
case-10:
t=20;break;
case-15:
t=20;break;
case-20:
t=24;break;
case-25:
t=24;break;
case-30:
t=25;break;
case-35:
t=25;break;
case-40:
t=27;break;
case-45:
t=27;break;
case-50:
t=30;break;
case-55:
t=40;break;
default:
break;
}
turn=djzx+sf_turn*t;
if(sf_turn1!
=sf_turn){
if((sf_turn1>sf_turn&&sf_turn>0)||(sf_turn1sign=-2;
if((sf_turn1>sf_turn&&sf_turn<0)||(sf_turn10))//向外
sign=-1;
turn=djzx+sf_turn*t+(sf_turn1-sf_turn)*35;
sf_turn1=sf_turn;
}
if(sf_turn==55||sf_turn==-55)
sign=-3;
if(sf_turn1>-25&&sf_turn1<25)
sign=1;
}
}
voidsudu(void){
intsu=0;
intbreaktime=0;
intbreaktime1=0;
intbreaktime2=0;
intbreaktime4=0;
if(start==1){
if(sign<0){
breaktime4=0;
if(sign==-1){//入弯减速
breaktime++;
if(breaktime<100){
su=35;
}else{
su=60;
}
graph=100-(su-speed);
}
if(sign==-2){//出弯加速
breaktime1++;
if(breaktime1<50){
su=50;
}else{
su=70;
}
graph=80-(su-speed)-wan;
}
if(sign==-3){
breaktime2++;
if(breaktime2<200){
su=30;
}else{
su=60;
}
graph=65-(su-speed)-wan;
}
}else{
breaktime=0;
breaktime1=0;
breaktime2=0;
if(sf_turn1>-20&&sf_turn1<20){
breaktime4++;
if(breaktime4<300)
su=30;
else
su=60;
graph=20-(su-speed)-zhi;
}
}
if(graph>100)
graph=100;
if(graph<0)
graph=0;
PWMDTY1=graph;
}elsePWMDTY1=100;
}
voidmain(void)
{
/*putyourowncodehere*/
inti=0;
IO_Init();
SetBusCLK_80M();
IOC_Init();
RTI_Init();
EnableInterrupts;
PwmInit();
for(;;)
{
config();
PORTB_PB3=1;
PORTB_PB4=0;
for(i=0;i<2000;i++);
Caiji_ji();
PORTB_PB3=0;
PORTB_PB4=1;
for(i=0;i<2000;i++);
Caiji_ou();
PTS_PTS0=0;
PTS_PTS1=0;
if(turnturn=leftmax;
if(turn>rightmax)
turn=rightmax;
PWMDTY23=turn;
//_FEED_COP();/*feedsthedog*/
}/*loopforever*/
/*pleasemakesurethatyouneverleavemain*/
}
#pragmaCODE_SEG__NEAR_SEGNON_BANKED
voidinterrupt7RTI_ISR(void)
{
CRGFLG|=0X80;//Write1toclearRTIFbit
time++;
if(time==10){//添加中断处理
speed=PACNT;
PACNT=0;
time=0;
time2++;
}
celue();
if(time2>200)
start=1;
if(t4>200){
if(PORTA_PA0==0){
k2++;
t3=1;
t4=0;
}
}else{
t4=500;
}
if(t3==1)
t4++;
if(k2<2){
sudu();
}else
PWMDTY1=100;
}
#pragmaCODE_SEGDEFAULT