第六届飞思卡尔杯智能小车大赛源程序.docx
- 文档编号:9015296
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:35
- 大小:187.81KB
第六届飞思卡尔杯智能小车大赛源程序.docx
《第六届飞思卡尔杯智能小车大赛源程序.docx》由会员分享,可在线阅读,更多相关《第六届飞思卡尔杯智能小车大赛源程序.docx(35页珍藏版)》请在冰点文库上搜索。
第六届飞思卡尔杯智能小车大赛源程序
*******************/
/*
文件名:
Bace.h*/
头文件
****************************************************************************
/*功能:
Base.c对应头文件*/
/******************************************************************************
*******************/
//结构体定义在头文件中
voiddelay(intdelaytime);voidlongdelay(intdelaytime);
_n)o哈哈~
//延时大约3us
//长延时大约3ms,没有细算,本应该用定时器的,0(n
unsignedcharMax(intbijiao[],unsignedcharn);//最大值,返回数组下标unsignedcharMin(intbijiao[],unsignedcharn);//最小值,返回数组下标intMidnum(intbijiao[],unsignedcharn);//中值,返回中间数下标
voidMaxtoMin(intbijiao[],char
flag[],intn);
intAverage(intbijiao[],unsignedcharn);//求中间值
intabs(inti);
intPIDcalc1(intPcoe,intIcoe,intDcoe,intError,intLastError,intPrevError,intSumError,intiError_max);//位置pid用于驱动舵机;//位置式PID用于驱动舵机
intPIDcalc2(intPcoeS,intIcoeS,intDcoeS,intSetPoint,intCurrentPoint,intLastErrorS,intPrevErrorS,intPrevPrevErrorS,intIterm_max);//增量式PID用于驱动马达currentpoint当前测量值
****************************************************************************
***********************************************************************************************/
/*以下内部文件调用*/
#ifndef_H_SURELOCATION_
#define_H_SURELOCATION_
intBackLocationtest(void);
/*以下外部文件调用*/
intSureLocationTest(void);
intWandaotest(void);
intCrosstest(void);
#endif****************************************************************************
****************************************************************************
#ifndef_H_HARDWARE_
#define_H_HARDWARE_
/*以下内部函数调用*/
voidCLK_init(void);
voidECT_init(void);
voidIO_init(void);
voidPWM_init(void);
voidAD_init(void);
/*以下外部函数调用*/
voidinit(void);
unsignedcharGetATD0(unsignedcharch);
#endif
/******************************************************************************
*******************/
/*************************************************************************************************/
/*以下内部文件调用*/
#ifndef_H_CONTROL_
#define_H_CONTROL_
voidduojicontrol(void);
voidupv(intvj);
voiddownv(intvj);
intSpeedWanted(void);
voidControlMotor(intuin);
voidMotorControl(void);
/*以下外部文件调用*/voidControl(void);
#endif
/******************************************************************************
*****************
/*文件名:
Sensor.h*/
/*功能:
Sensor.c对应头文件*/
***********************************************************************************************/
/*以下内部文件调用*/
voidGetADdata(inttestevetime);
voidGetordinarydata(void);
voidADdataOk(void);
/*以下外部文件调用*/voidProcess(void);
/*功能包括其它所有头文件的文件*/
***********************************************************************************************/
#ifndef_H_INCLUDE_
#define_H_INCLUDE_
#include"Sensor.h"
//#include"LCD.h"
#include"Surelocation.h"
#include"Control.h"
#include"base.h"
#include"HardWare.h"
#include"Hardwaredriver.h"
#include"MC9S12XS128.h"
/*以下传感器整定参数*/
#defineFRONTNUM8//前排传感器数4
#defineTESTTIME4//每次采集每个传感器读取的数值数目
#defineHISTORYNUM10//历史数据保存量
#defineMIDYUZHI3//中间两传感器迷失后的和
#defineZHONGJIANYUZHI35//线在两个传感器中间和某个传感器之下时的阈值
#defineZHONGJIAN210//用来检测车子是否在跑到中心(赛车中心距离赛道中心八厘米)
中间两传感器的两单峰函数叠加为单峰函数峰值250
#defineADYUZHI10//AD数据校验阈值
#defineLOCYUZHI68//跨区阈值
#defineCOE1
/*以下电机整定参数*/
#definePWMMOTOT800//电机PWM周期;//电机PWM周期1.6ms,电机周期随便
只关心占空比。
//电机PWM周期1.6ms
#defineUOUTMAX700//最大正向电压
#defineUOUTMIN400//最大反向电压
/*以下舵机整定参数*/
#definePWMDT30000//舵机PWM周期20ms
#defineCENTRAL2100〃舵机PWM中心占空1.53ms,转动极限duojizhankong=750
#defineMOSTLEFT2850//舵机最左边位置
#defineMOSTRIGHT1350//舵机最右边位置
/*速度控制相关宏定义*/
#definePIDYushe(450+speedset*7)
#definePIDYushe1(450+speedset*7)//(450+speedset*7)
#definePIDYushe2(550+speedset*10)//(450+speedset*7)
#defineSTOPCOUNT120//检测到速度异常(很小)停车所需的累加数目
#defineSTOPSAFTMIN30//启动防撞需要达到的最小速度值
#defineSPEEDMAX25//最高速度
#defineSPEEDMIN12//最低速度
/*LCD相关宏定义*/
//#defineRSPORTA_PA5
//#defineENPORTA_PA3
#endif
程序
/******************************************************************************
*******************/
/*文件名:
Bace.c*/
/*功能:
基础功能,延时和数据处理*/
/******************************************************************************
*******************/
#include"Include.h"//包括延时、数据算术处理等
voiddelay(intdelaytime)
{//软件延时,24M总线频率时延时时间约为10us
inti;unsignedcharj;
for(i=0;i for(j=0;j<24;j++) }voidlongdelay(intdelaytime) {//软件延时,24M总线频率时延时时间约为1msinti; for(i=0;i } /*求数组中中间值函数*/ //函数返回值unsignedcharbijiao[n/2]; //输入参数intbijiao[],unsignedcharn //求中值,bijiao[]为原始数据,n为数据量 /**/ intMidnum(intbijiao[],unsignedcharn) { inti,j,temp;if(n==1)returnbijiao[0]; if(n==2) return(bijiao[0]+bijiao[1])/2; for(j=1;j for(i=0;i {if(bijiao[i] temp=bijiao[i]; bijiao[i]=bijiao[i+1];bijiao[i+1]=temp; } } if(n%2) returnbijiao[(n-1)/2]; elsereturn(bijiao[n/2]+bijiao[n/2-1])/2; } /*求数组中最大值函数*/ //函数返回值unsignedchartemp //输入参数intbijiao[],unsignedcharn //求最大值,bijiao[]为原始数据,n为数据量 /**/ unsignedcharMax(intbijiao[],unsignedcharn) { unsignedchari,temp=0;for(i=0;i {if(bijiao[temp] }return(temp); } /*求数组平均值函数*/ //函数返回值数组平均值 //输入参数intbijiao[],unsignedcharn //求平均值,bijiao[]为原始数据,n为数据量 /**/ intAverage(intbijiao[],unsignedcharn)//建立了一个原来数组的副本,否则应该是指针*int { unsignedchari=0; inttemp=0; for(i=0;i { temp+=bijiao[i]; } return(temp/n); } /*求数组中最小值函数*/ //函数返回值unsignedchartemp //输入参数intbijiao[],unsignedcharn //求最小值bijiao[]为原始数据,n为数据量 /**/ unsignedcharMin(intbijiao[],unsignedcharn) { unsignedchari,temp=0;for(i=0;i {if(bijiao[temp]>bijiao[i])temp=i; }return(temp); }//得到数组前n个元素中最小一个数的下标 /*数组排序按下标*/ //函数返回值void //输入参数intbijiao[],intflag[],intn //参数bijiao[]原始数据,flag[]排序后的标号数组,n数组长度/**/ voidMaxtoMin(intbijiao[],intflag[],intn) { inttemp[10]={0}; inti; if(n>10) n=10; for(i=0;i for(i=0;i { flag[i]=Max(temp,n); temp[flag[i]]=1;//给一个很小的数值} }//将数组bijiao[]中数字从小到大排列的下标存入数组flag/*绝对值函数*/ //函数返回值int//输入参数int//返回输入数字的绝对值 */ /*intabs(inti){ intj; if(i>=0) j=i; else j=0-i; return(j); } /*PID定义部分*/ //函数返回值int //输入参数intbijiao[],intflag[],intn //参数bijiao[]原始数据,flag[]排序后的标号数组,n数组长度 /**/ intPIDcalc1(intPcoe,intIcoe,intDcoe,intError,intLastError,intPrevError,intSumError,intiError_max)//位置pid用于驱动舵机 { intdError,iError,pError; PrevError=LastError; LastError=Error; SumError+=Error; dError=Dcoe*(LastError-PrevError);iError=Icoe*(SumError); pError=Pcoe*Error;if(iError>iError_max) iError=0; return(pError+iError+dError); } intPIDcalc2(intPcoeS,intIcoeS,intDcoeS,intSetPoint,intCurrentPoint,intLastErrorS,intPrevErrorS,intPrevPrevErrorS,intIterm_max)//增量式PID用于驱动马达currentpoint当前测量值 { intPterm,Iterm,Dterm; PrevPrevErrorS=PrevErrorS; PrevErrorS=LastErrorS; LastErrorS=SetPoint-CurrentPoint;Pterm=PcoeS*(LastErrorS-PrevErrorS); Iterm=IcoeS*LastErrorS; Dterm=IcoeS*(LastErrorS-2*PrevErrorS+PrevPrevErrorS);if(Iterm>Iterm_max) Iterm=0; return(Pterm+Iterm+Dterm); } /****************************************************************************** ********************/ /****************************************************************************** /****************************************************************************** /****************************************************************************** #include #include"derivative.h"/*derivative-specificdefinitions*/ #include"Include.h" externintADdataokflag;//AD数据有效 externintCrossflag; externintWandaoflag; externintduojizhankong; externintmodeflag; intforecast[15];//弯道识别 intTingcheflag;//停车标志位 intLINE_V; intTC0count; unsignedintf1,f2; intstartline=0; unsignedintspeed; unsignedintmodecount; /*主函数*/ //main.c: Startprogramhere... /**/ voidmain(void) { DisableInterrupts; //longdelay(2000);//2s延时 init(); PTM_PTM0=1; TC0=11320;//54ms modeflag=0; LEDtest(); EnableInterrupts;//离线调试的时候如果不禁止此项就会因为18号中断而中止程序执行while (1) { MOD_init(); /*if(PORTA_PA1==0)//干簧管扫描 longdelay (1);//机械开关防抖 startline++; if(startline==3) Tingcheflag=1; } if(Tingcheflag) { while (1){ DisableInterrupts; PWMDTY23=2400; }调试禁止*/ } } 〃#pragmaCODE_SEG__NEAR_SEGNON_BANKED禁止随便用近调用 #pragmaCODE_SEGNON_BANKED voidinterrupt8timer0(void) { DisableInterrupts; TFLG1&=0x01; PACTL_PAEN=0; TC0=(TC0+1125)%65525;//定时6ms则1125 f仁PACNT;//先把PACNT值存进变量中再在实时调试时读取否则PACNT分高低位读取 会出错误 /*此参数需整定*/ speed=f1*720/1260;〃(幵/200*6*10人(-3))*(40/105)*0.18速度单位: 厘米/秒 /*轮周长180mm传动比105/40 车速2m/s时车轮转速11r/s编码器转速29.17r/s脉冲数5833/s脉冲周期 0.1714ms每次脉冲数35个*/ PITTF_PTF=1;/清中断标志位 PACTL_PAEN=1; PACNT=0x00;//计数器归零 Process(); Control(); EnableInterrupts; } //#pragmaCODE_SEG__NEAR_SEGNON_BANKED #pragmaCODE_SEGNON_BANKED voidinterrupt24externinterrupt(void) { DisableInterrupts; //PIEJ=0x00; longdelay (1);//干簧管是机械开关要防抖以后的干簧管 要加电容防抖 PIFJ=0x80; startline++; if(startline==3) Tingcheflag=1; EnableInterrupts; } /****************************************************************************** *******************/ if(ADdata[7]>1) location=8; elselocation=9; } } if((loctemp==6&&ADdata[7]>39)||(loctemp==7&&ADdata[6]>35)){ loc=0b01000000; if((loctemp==6)&&ADdata[6]<44) {if(ADdata[6]>36)location=1; else location=0; } } if(loctemp==3) location=0; if(loctemp==2&&ADdata[1]<29) {loc=0b00010000; if(ADdata[2]>35) location=-1; else location=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六 届飞思 卡尔 智能 小车 大赛 源程序