智能设计大赛技术报告智能车组白玉超.docx
- 文档编号:24896742
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:34
- 大小:147.38KB
智能设计大赛技术报告智能车组白玉超.docx
《智能设计大赛技术报告智能车组白玉超.docx》由会员分享,可在线阅读,更多相关《智能设计大赛技术报告智能车组白玉超.docx(34页珍藏版)》请在冰豆网上搜索。
智能设计大赛技术报告智能车组白玉超
智能设计大赛—智能车组
技术报告
学校:
华南理工大学
队名:
CRAZYMCU
队长:
白玉超
队员:
王先礼赵峰
目录
前言
第一章智能车整体设计思路方案
1.1方案设计思路
1.2方案的实现
第二章硬件电路的设计
2.1系统板的设计
2.2电路总体的结构
2.3电源管理模块设计
2.4电机驱动模块
2.5光电传感器电路
2.6舵机安装与固定
第三章软件算法设计级实现
3.1Codewarrior开发环境算法的实现
3.2控制算法编程
第四章总结
附录
前言
比赛中所使用的单片机是飞思卡尔16位微控制器MC9S12DG128,智能车制作涉及到包括控制,模式识别,传感技术,汽车电子电气,计算机,机械等多个学科。
我觉得对于我们这些非电子或非者控制专业的学生更是一种锻炼,在整个过程中我得到了各个方面的提升,并包括与队友的团结协作能力。
自主构思控制方案进行系统设计,包括传感器信号采集处理、动力电机驱动、转向舵机控制以及控制算法软件开发等,完成智能车工程制作及调试,在保证模型车不冲出赛道的前提下,所用时间越短越好。
自动控制器是以微控制器为核心,传感器、电池、舵机和相应的驱动电路与之配合。
其最主要的技术问题是:
路径的自动识别和控制算法(策略)的设计。
在此次比赛中我们队使用红外激光传感器来采集路面信息,通过单片机的控制信号使传感器适时点亮,接收管得到的数据送到LM339进行比较处理,然后将信号发给单片机,单片机根据转换后的数据,识别出黑线的位置,通过PWM波控制舵机的转动,通过L298N控制直流电机的转动,以达到控制车速的目的。
第一章智能车整体设计思路和方案
1.1方案设计思路
本智能车控制系统采用飞思卡尔16位微控制器MC9S12DG128作为唯一的核心控制单元,信号由安装在车前部的光电传感器采集,将采集到的表示路况信息的模拟信号传入核心控制单元,然后由脉宽调制(PWM)发生模块发出3路PWM波,分别对转向舵机,直流电机进行控制,完成智能车的转向,前进,减速的功能。
1.2方案的实现
我们首先是用实验板对整个小车电路设计进行实验,这个过程中充分考验了我们对硬件的设计与焊接的能力,在实验中得到传感器合适的尺寸与角度,花费了很多时间与精力,主要是考虑到前瞻的问题,前瞻太小不利于小车的速度的控制,尤其是直线到转弯的过渡。
前瞻太大会带来识别精度不够,控制精度不高。
直到设计能够采集到合适的传感器数据精度与控制速度,我们才进行了定型车模、系统电路板的设计,安装以及控制算法的改进,完成了对智能车由开环控制到闭环控制,由低速到高速的提速过程。
在实验的过程中我们不断发现问题,解决问题,使智能车能够最大限度地沿着轨道快速、准确地行驶。
设计和制作完成的硬件电路可以简单分成四部分:
1电机的驱动电路采用集成芯片L298N,调制脉冲由单片机提供;
2稳压电路部分,为单片机等电路提供合适的电压;
3路径识别电路(传感器安装电路);
416位单片机MC9S12DG128核心。
硬件电路方案如下:
图1:
系统框图
第二章硬件电路的设计
2.1系统板的设计
我们的智能车系统板的电路总体上分为逻辑控制电路和电机驱动电路两大部分。
逻辑控制电路主要由核心控制器S12单片机,传感器,编码器组成。
S12单片机对电压的稳定性有很高的要求;电机驱动电路要求的电流相对较大,因此,二者在电路设计方面有很大的差别。
硬件设计应在可靠的基础上尽量简单化,使其满足稳定工作的基本要求,电源管理模块要保证使整个系统供电充足并稳定;传感器部分保证信息采集准确有效;电机驱动部分则需在保证正常工作的情况下尽量减少对控制部分的干扰,因为电机的电流很大。
考虑到车模重心越低越好,我们将电路板紧贴底盘放置。
由于舵机占据了不少的空间,我们的电路板需要做得更加紧凑。
考虑到电路的需要和结构的稳定性,以及规则中对车辆尺寸等各方面的要求,我们选择把电机驱动电路板和系统板分开,电池放在舵机后面,一方面为了放置系统板,另外为增加前轮的载重和减小后轮的载重,增加前轮附着力,减小小车后部的质量,实现急转弯小车甩尾,减小转弯的时间,但实际上我们发现效果不明显,尤其是比赛场地很光滑摩擦力小的情况下,反而会一定程度上影响前轮的转向灵敏度,但结构定下来了就没法改变了,但我们认为这也是我们的收获。
2.2转接板结构
我们使用核心S12XS128的电路板,自行设计了系统转接电路板。
并把它固定在智能车的底盘上,并制作了专用的插槽。
图2.为转接板原理图。
2.3电源管理模块设计
为了能使智能车系统能正常工作,需要对电池电压调节。
其中,单片机系统、车速传感器电路、路径识别的光电传感器和接收器电路工作电压均为为5V、伺服电机、直流电机工作电压直接由7.2V蓄电池直接提供。
电池(7.2v)2000mAhNi-cd
7.2V
5V
6V
图3系统电压调节图
电源由7.2V电池提供,分别经过以下途经对其它模块进行供电:
a、经过稳压芯片LM2940T5.0稳压后,输出5V电压以驱动单片机工作;
b、经过稳压芯片LM2940T5.0稳压后,输出5V电压以对传感器供电;
c、经过稳压芯片LM2941T5.0稳压后,输出6V电压舵机供电;
d、电源7.2V接入驱动模块,以对电机进行驱动;
图4:
脉冲信号控制三极管进而控制发光管原理图
2.4激光管检测电路
我们采用的是对射式光电传感器,它价格便宜,发光强度合适,质量轻,把8对光电传感器(发射与接收)排成一列安装在小车的前面探测黑线。
且用单面PCB板来制作传感器,性能比较稳定而且重量比较轻。
图5:
光电传感器原理图
2.5电机驱动模块
直流电机驱动采用L298N构成驱动电路。
系统通过如图5中PWM引脚输入可调制脉冲波形,以调节电机1、2和3、4口的输出电压之差,从而调节电机转速。
电机PWM周期设定为2000个单片机总线周期,其中单片机的工作频率为16MHz。
在L298N上安装了散热片,实际运行效果表明芯片散热量显著。
图6:
由L298N组成的直流电机驱动模块原理图
2.6舵机安装与固定
舵机的安装采用常用的卧式,虽然灵活度不够,但在目前的速度下可以满足要求。
第三章软件算法设计级实现
3.1Codewarrior开发环境算法的实现
在整个开发调试过程中,使用Metrowerks公司为MC9S12系列专门提供的全套开发工具(FreescaleCodewarriorIDE4.6)。
这是一套用C语言进行编程
的集成开发环境——本文智能车定位系统的软件设计部分就是在此开发环境下完成的
Codewarrior是由Metrowerks公司提供的专门面向Freescale所有MCU与DSP嵌入式应用开发的软件工具。
其中包括集成开发环境IDE、处理器专家、全芯片仿真、可视化参数显示工具、项目工程管理、C交叉编译器、汇编器、链接器以及调试器。
CodeWarriorIDE能够自动地检查代码中的明显错误,它通过一个集成的调试器和编辑器来扫描你的代码,以找到并减少明显的错误,然后编译并链接程序以便计算机能够理解并执行你的程序。
每个应用程序都经过了使用像CodeWorrior这样的开发工具进行编码、编译、编辑、链接和调试的过程。
3.2控制算法编程
单片机对黑线的识别是通过传感器的值的大小的比较得出的,在一个检测周期后,我们把8个传感器的检测信号通过LM339与设定的基准电压比较,低于输出0,高于输出1。
通过传感器检测到不同路况,我们控制不同的车速,所以我们能控制小车的直线与弯道的速度范围,能够结合车速控制直线到转弯的过渡。
第四章总结
通过长时间的调试,小车的平均速度不高,大约1.0m/s,这与我们的算法和硬件限制有很大的关系,算法只是很简单的模式识别,没有高级的算法,这是我们学机械专业的劣势,但总之我们在整个小车的制作过程中我们学到了不少电子方面的知识,我们发现了电子信息或者控制真是奇妙无穷,激发了我们的兴趣,我们很感谢大赛给我们提供了一次实际动手与理论结合的机会。
寻迹智能小车系统的设计经硬件电路的制作、单片机程序的编写、用软件测试传感器和控制算法等,这些是我们在整个小车制作过程中的主要工作,在小车的调试过程中我们也发现了很多的问题,当然也有很多进步。
小车主要存在以下问题:
1)传感器的选择不是很好,主要是控制精度与前瞻不是很理想,由于受到车的前瞻性的限制,转弯速度不易过快。
2)采用模式识别可调速控制方案,小车能以2.0m/s左右的上限速度直线运行。
但在弯道时候就只能降低车速。
3)轻微蛇形前进时由于受到前瞻的限制,不能像摄像头组那样直行。
4)小车的传感器是架在前方,很容易就受到损坏。
附件:
程序清单:
//---------------------------------------------------------
/*Target:
MC9S12XS128
Crystal:
16.000Mhz
busclock:
16.000MHz
pllclock:
32.000MHz
auther:
xiaobai
item:
freescalecar*/
//----------------------------------------------------------
#include
#include"derivative.h"/*derivative-specificdefinitions*/
#defineSTEER_MIDDL1500
floatD_value=0.17;
unsignedintsteerold=0;
unsignedintsteer[9]={-450,-350,-250,-150,0,150,250,350,450},steer_value;
unsignedintspeed[11]={0,10,20,30,40,50,60,70,80,90,100};
intporta;
//---------------------------端口初始化--------------------------------
voidPORT_Init(void)
{
DDRA=0x00;
PORTA=0x00;
//DDRB=0x3f;
//PORTB=0x00;
DDRM=0xff;
PTM=0x00;
}
//------------------------锁相环初始化--------------------------------
voidSetBusCLK_16M(void)
{
CLKSEL=0x00;//disengagePLLtosystem
PLLCTL_PLLON=1;//turnonPLL
SYNR=1;
REFDV=0x80|0x01;//pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
_asm(nop);//BUSCLOCK=16M
_asm(nop);
_asm(nop);
while(!
(CRGFLG_LOCK==1));//whenpllissteady,thenuseit;
CLKSEL_PLLSEL=1;//engagePLLtosystem;
}
//-----------------------PWM初始化-----------------------------------------
voidPWMDJ_Init(void)
{
PWME_PWME1=0;//关PWM
//舵机PWM初始化
PWMCTL_CON01=1;//0和1联合成16位PWM;
PWMCNT01=0;//计数器清零;
PWMCLK_PCLK1=1;//选择clockSA做时钟源
PWMPOL_PPOL1=1;//先输出高电平,计数到DTY时,反转电平
PWMCAE_CAE1=0;//选择输出模式为左对齐输出模式
PWMPRCLK|=0x40;//clockA不分频,clockA=busclock=16MHz;CLKB16分频:
1Mhz
PWMSCLA=0x08;//对clockSA16分频,pwmclock=clockA/16=1MHz;
PWMPER01=20000;//周期20ms;50Hz;(可以使用的范围:
50-200hz)
PWMDTY01=1500;//高电平时间为1.5ms;
PWME_PWME1=1;
}
//-----------------------左电机PWM初始化----------------------------------------
voidPWMLM_Init(void)
{
PWME_PWME4=0;
PWME_PWME5=0;//关PWM
PWMCTL_CON45=0;//4和5不级联
PWMCNT4=0;//计数器清零;
PWMCNT5=0;//计数器清零?
PWMCLK_PCLK4=1;//选择CLOCKSA时钟
PWMCLK_PCLK5=1;//选择CLOCKSA时钟
PWMPRCLK|=0x08;//16分频
PWMSCLA=0x05;//10分频
PWMPOL_PPOL4=1;//开始输出高电平
PWMPOL_PPOL5=1;//开始输出高电平
PWMCAE_CAE4=0;//左对齐
PWMCAE_CAE5=0;//左对齐
PWMPER4=100;//频率=CLOCKSA/(PWMPERx+1)=1000HZ
PWMDTY4=50;//占空比=(PWMDTYx+1)/(PWMPERx+1)
PWMPER5=100;//频率=CLOCKSA/(PWMPERx+1)=1000HZ
PWMDTY5=50;//占空比=(PWMDTYx+1)/(PWMPERx+1)
PWME_PWME4=1;//使能4通道
PWME_PWME5=1;//使能5通道
}
//------------------右电机PWM初始化--------------------------------
voidPWMRM_Init(void)
{
PWME_PWME6=0;
PWME_PWME7=0;//关PWM
PWMCTL_CON67=0;//6和7不级联
PWMCNT6=0;//计数器清零;
PWMCNT7=0;//计数器清零;
PWMCLK_PCLK6=1;//选择CLOCKSB时钟
PWMCLK_PCLK7=1;//选择CLOCKSB时钟
PWMPRCLK|=0x80;//16分频
PWMSCLB=0x05;//10分频
PWMPOL_PPOL7=1;//开始输出高电平
PWMPOL_PPOL6=1;//开始输出高电平
PWMCAE_CAE6=0;//左对齐
PWMCAE_CAE7=0;//左对齐
PWMPER6=100;//频率=CLOCKSA/(PWMPERx+1)=1000HZ
PWMDTY6=50;//占空比=(PWMDTYx+1)/(PWMPERx+1)
PWMPER7=100;//频率=CLOCKSA/(PWMPERx+1)=1000HZ
PWMDTY7=50;//占空比=(PWMDTYx+1)/(PWMPERx+1)
PWME_PWME6=1;//使能6通道
PWME_PWME7=1;
}
//----------------------延时程序-------------------------------
voidDly_ms(intms)
{
intii,jj;
if(ms<1)ms=1;
for(ii=0;ii for(jj=0;jj<2670;jj++);//busclk: 16MHz--1ms } //-----------------设置舵机占空比----------------------------- voidsetDuty(unsignedinttemp){ PWMDTY01=temp; PTM=PORTA; Dly_ms(20); PTM=0x00; } //-----------------设置电机的占空比-------------------------------- voidsetDutyM(inttempM) { inti; i=tempM; if(i>20) i=20; if(i<0) i=0; switch(i) { case0: PWMDTY5=0; PWMDTY4=0; PWMDTY7=0; PWMDTY6=0; break; case1: PWMDTY5=10; PWMDTY4=0; PWMDTY7=10; PWMDTY6=0; break; case2: PWMDTY5=20; PWMDTY4=0; PWMDTY7=20; PWMDTY6=0; break; case3: PWMDTY5=30; PWMDTY4=0; PWMDTY7=30; PWMDTY6=0; break; case4: PWMDTY5=40; PWMDTY4=0; PWMDTY7=40; PWMDTY6=0; break; case5: PWMDTY5=50; PWMDTY4=0; PWMDTY7=50; PWMDTY6=0; break; case6: PWMDTY5=60; PWMDTY4=0; PWMDTY7=60; PWMDTY6=0; break; case7: PWMDTY5=70; PWMDTY4=0; PWMDTY7=70; PWMDTY6=0; case8: PWMDTY5=80; PWMDTY4=0; PWMDTY7=80; PWMDTY6=0; break; case9: PWMDTY5=90; PWMDTY4=0; PWMDTY7=90; PWMDTY6=0; break; case10: PWMDTY5=100; PWMDTY4=0; PWMDTY7=100; PWMDTY6=0; break; case11: PWMDTY5=100; PWMDTY4=0; PWMDTY7=0; PWMDTY6=0; break; case12: PWMDTY5=0; PWMDTY4=0; PWMDTY7=100; PWMDTY6=0; break; case13: PWMDTY5=100; PWMDTY4=0; PWMDTY7=0; PWMDTY6=100; break; case14: PWMDTY5=0; PWMDTY4=100; PWMDTY7=100; PWMDTY6=0; break; case15: PWMDTY5=90; PWMDTY4=0; PWMDTY7=0; PWMDTY6=0; break; case16: PWMDTY5=0; PWMDTY4=0; PWMDTY7=90; PWMDTY6=0; break; case17: PWMDTY5=90; PWMDTY4=0; PWMDTY7=0; PWMDTY6=90; break; case18: PWMDTY5=0; PWMDTY4=90; PWMDTY7=90; PWMDTY6=0; break; case19: PWMDTY5=80; PWMDTY4=0; PWMDTY7=10; PWMDTY6=0; break; case20: PWMDTY5=0; PWMDTY4=0; PWMDTY7=80; PWMDTY6=0; break; } } //-------------------PORTA端口扫描------------------------ voidScan_Key(void) { porta=PORTA; switch(porta){ case0x01: //M1 steer_value=STEER_MIDDL+steer[0]+(int)((steer[0]-steerold)*D_value); if(steer_value>2000){ steer_value=2000; } if(steer_value<1000){ steer_value=1000; } setDuty(steer_value); setDutyM(6); steerold=steer[0]; break; case0x02: //M2 steer_value=STEER_MIDDL+steer[1]+(int)((steer[1]-steerold)*D_value); if(steer_value>2000){ steer_value=2000; } if(steer_value<1000){ steer_value=1000; } setDuty(steer_value); setDutyM(7); steerold=steer[1]; break; case0x04: //M3 steer_value=STEER_MIDDL+steer[2]+(int)((steer[2]-steerold)*D_value); if(steer_value>2000){ steer_value=2000; } if(steer_value<1000){ steer_value=1000; } setDuty(steer_value); setDutyM(8); steerol
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 设计 大赛 技术 报告 车组 白玉