模型车控制主程序代码.docx

上传人:b****4 文档编号:5966299 上传时间:2023-05-09 格式:DOCX 页数:18 大小:17.53KB
下载 相关 举报
模型车控制主程序代码.docx_第1页
第1页 / 共18页
模型车控制主程序代码.docx_第2页
第2页 / 共18页
模型车控制主程序代码.docx_第3页
第3页 / 共18页
模型车控制主程序代码.docx_第4页
第4页 / 共18页
模型车控制主程序代码.docx_第5页
第5页 / 共18页
模型车控制主程序代码.docx_第6页
第6页 / 共18页
模型车控制主程序代码.docx_第7页
第7页 / 共18页
模型车控制主程序代码.docx_第8页
第8页 / 共18页
模型车控制主程序代码.docx_第9页
第9页 / 共18页
模型车控制主程序代码.docx_第10页
第10页 / 共18页
模型车控制主程序代码.docx_第11页
第11页 / 共18页
模型车控制主程序代码.docx_第12页
第12页 / 共18页
模型车控制主程序代码.docx_第13页
第13页 / 共18页
模型车控制主程序代码.docx_第14页
第14页 / 共18页
模型车控制主程序代码.docx_第15页
第15页 / 共18页
模型车控制主程序代码.docx_第16页
第16页 / 共18页
模型车控制主程序代码.docx_第17页
第17页 / 共18页
模型车控制主程序代码.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

模型车控制主程序代码.docx

《模型车控制主程序代码.docx》由会员分享,可在线阅读,更多相关《模型车控制主程序代码.docx(18页珍藏版)》请在冰点文库上搜索。

模型车控制主程序代码.docx

模型车控制主程序代码

附录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_turn1

sign=-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(turn

turn=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

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

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2