四驱车超声波避障课程报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四驱车超声波避障课程报告
设计人:刘绍春
电力电子实验室
2014年5月
目录
一、原理分析
二、硬件系统设计
三、程序的设计
四、结论与心得
一、原理分析
四驱车作为比较灵活且有意思的车模,设计课题研究一下是必然的。本次课题为超声波避障,即使用超声判断前方是否有障碍物从而控制四驱车转向避开障碍物继续行进。
二、硬件系统设计
针对超声波使用的是HC-SR04型号超声波,转向控制为S3031模拟舵机,电机采用飞思卡尔竞赛专用电机并采用BTS7971驱动,控制芯片为MC9S12XS128,7.2伏电源,两路7805稳压一路给舵机供电、另一路给XS128以及超声波、BTS7971驱动供电。
三、程序的设计
/************四驱车超声波避障*********/
/***超声波模块接口:Trig----PA0;*********/
/***超声波模块接口:Echa----PT0;********/
/***近端盲区1厘米左右****************/
#include
#include "derivative.h" /* derivative-specific definitions */
unsigned int Start=0,End=0,Diff=0;
unsigned int S=0; //flag=1
unsigned int vTmpPIT=0;
void pllclk(void)// 设置16MHz总线频率
{
CLKSEL=0x00;
SYNR=0X00|0X01;
REFDV=0X80|0X01;
PLLCTL_PLLON=1;
POSTDIV=0X00;
asm(nop);
asm(nop);
while(0==CRGFLG_LOCK); //锁相环锁定
CLKSEL_PLLSEL=1; //选定PLL时钟
}
void initIOBoutput(void)// IO口初始化,A 口为输出
{
DDRA_DDRA0=1;
PORTA_PA0=1;
}
/*-----PWM初始化-----*/
void PWM_Init(void) {
PWME=0x00;//关闭PWM
PWMCTL_CON01=1; //控制PWM0和1级联,电机前进
PWMCTL_CON23=1; //控制PWM4和5级联,电机后退
PWMCTL_CON45=1; //控制PWM4和5级联,舵机
PWMPOL=0xff;//极性设置,先高后低
PWMCAE=0x00;//左对齐
PWMCLK=0xff;//01:SA 23:SB 45:SA作为时钟源
PWMPRCLK=0x33; //A=16/8=2MHz B=16/8=2MHz
PWMSCLA=5;//SA=A/2/5=200KHz
PWMSCLB=5;//SB=A/2/5=200KHz
}
void initPIT(void) //定时中断初始化函数40MS 定时中断设置
{
PITCFLMT_PITE=0; //PIT通道禁止
PITMUX_PMUX0=0;
PITMUX_PMUX1=0;
PITCE_PCE0=1; //定时器通道0使能
PITCE_PCE1=1; //定时器通道1使能
PITMTLD0=160-1; //8位定时器初值设定。200分频,在80MHzBusClock 下,为0.1MHz。即10us
PITMTLD1=160-1; //8位定时器初值设定。200分频,在80MHzBusClock 下,为0.1MHz。即10us
PITLD0=4000-1; //16位定时器初值设定。PItt_Aime*0.01MS =40MS
PITLD1=5000-1; //16位定时器初值设定。PItt_Aime*0.01MS =50MS
PITINTE_PINTE0=1; //定时器中断通道0中断使能
PITINTE_PINTE1=1; //定时器中断通道1中断使能
PITCFLMT_PITE=1; //定时器通道使能
}
void Conut(void)
{
S=(Diff*17);
}
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=160;
while(--j);
}
}
}
void delayus(unsigned int us)
{
unsigned char j;
for(;us;us--)
{
j=16;
while(--j);
}
}
void StartModule()
{
PORTA_PA0=1;
delayus(25);
PORTA_PA0=0;
}
void CaptureInit(void)
{
TSCR1=0x80; //定时器使能
TIE =0x00; //每一位对应相应通道中断允许,0表示禁止中断
TCTL4=0x02; //EDGnB EDGnA 1表示上升沿, 2表示下降沿, 3表示任何沿TIOS =0x00; //每一位对应通道的: 0输入捕捉,1输出比较
TIE=0x01; //中断使能
}
/*************控制转向以及速度*************/
void qh(int i,int j) {
PWMPER01=250; //输出为SA/250=800Hz的波
PWMPER23=250; //SB/250=800Hz
PWMDTY01=i;
PWMDTY23=j;
PWME_PWME1=1;//0通道使能,0通道为输出通道
PWME_PWME3=1;
}
void dj_you(void)
{