激光枪自动射击装置Word文档下载推荐.docx
《激光枪自动射击装置Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《激光枪自动射击装置Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
1.激光枪自动射击装置
1.1任务
设计一个能够控制激光枪击发、自动报靶及自动瞄准等功能的电子系统。
该系统由激光枪及瞄准机构、胸环靶、弹着点检测电路组成,其结构示意见图1。
1.2要求
1.2.1基本要求
1.用激光笔改装激光枪,激光枪可受电路控制发射激光束,激光束照射于胸环靶上弹着点的光斑直径<5mm;
激光枪与胸环靶间距离为3m。
图1激光枪自动射击装置示意图
2.激光枪固定在一机构上,可通过键盘控制激光枪的弹着点(用键盘设置激光束在靶纸上上下、左右移动一定距离)。
3.制作弹着点检测电路,通过摄像头识别激光枪投射在胸环靶上的弹着点光斑,并显示弹着点的环数与方位信息。
其中环数包括:
10、9、8、7、6、5、脱靶;
方位信息是指弹着点与10环区域的相对位置,包括:
中心、正上、正下、正左、正右、左上、左下、右上、右下。
详见图2-b。
1.2.2拓展部分
1.在图形点阵显示器上显示胸环靶的相应图形,并闪烁显示弹着点。
2.自动控制激光枪,在15秒内将激光束光斑从胸环靶上的指定位置迅速瞄准并击中靶心(即10环区域)。
3.可根据任意设定的环数,控制激光枪瞄准击中胸环靶上相应位置。
4.其他
2-a胸环靶尺寸2-b胸环靶环数及方位信息示意
图2胸环靶示意图
1.3方案比较选择
1.3.1电机选择
方案一:
两个伺服电机。
伺服电机自带高精度编码器,便于进行速度的闭环控制,驱动能力强,机械性能也好。
在实验中发现,虽然进行了闭环控制,控制也很平缓,但是打靶的精度也只能基本达到要求。
方案二:
两个步进电机。
步进电机具有快速启动能力,转换精度高,正反转控制灵活,可以轻松达到通过脉冲进行控制。
在实验中发现,当步进电机进行一定的细分之后,精度可以很好地控制,完全能满足控制要求。
方案三:
步进电机加舵机。
舵机使用方便,扭矩大,控制简单,机械性能好,但是在实验中发现,舵机的转动靠脉冲宽度来调节,它的转动精度不能达到基本要求,误差很大。
电机作为此次设计最主要的执行单元,它的好坏直接关系到指标的完成情况,对控制精度要求很高,综合考虑以上因素,本次设计选择方案二。
1.3.2电机驱动
方案一:
使用L298N电机驱动芯片。
L298N是一个具有高电压大电流的全桥驱动芯片,响应频率高,自带使能控制端,操作方便,性能稳定,一个L298N就可以控制一个两相四线步进电机。
但是L298N不能进行细分,步进电机转动所需要的精度不能得到有效的调节。
使用半桥驱动芯片BTS7960,需要2个芯片来驱动一个电机,电流最高43A,由于其内阻很小,驱动过程中发热不明显,但其价格较高,并且经过实验,它不能满足细分的精度要求。
使用东芝公司的TB6560AQH驱动芯片,可以输出高达3A的驱动电流,集成度高所需外围器件少,使用方便,并且经过芯片自带的细分设置后能够很好地满足控制电机时的转动精度要求,芯片自带的衰减模式也非常利于调节电机的震动。
电机驱动主要受DSP6436里的PWM控制用去驱动本设计的主要执行单元——步进电机,它的好坏直接影响到执行单元的运行稳定性。
综合考虑转动精度,电流衰减等因素,选择方案三。
1.3.3摄像头传感器
采用索尼公司的1/3480线CCD摄像头,该摄像头具有超过38万的像素,清晰度很高,价格适中。
该摄像头为多电源供电,供电复杂,通过CCD摄像头采集回来的图像需要经过AD转换后再通过预处理器预处理,处理过程较为复杂。
在实验中发现使用这种摄像头,单片机无法快速完成图像处理工作,在时间上不能给主控制器足够的时间进行步进电机控制,不能满足控制要求。
采用OV7670摄像头集成模块,该摄像头为30万(640*480)像素,内部集成了AGC、AWB、AEC多种功能,集成度极高。
OV7670对环境的适应性好,不依赖于特定环境,能很好地进行自我调节。
该摄像头模块集成了一定容量的存储空间可以缓存一部分图像,对于单片机处理采集回来的图像增加了更多的时间,对于电机控制器也增加了有效的定位时间。
OV7670摄像头价格便宜,对于此次设计所需要的图像采集精度信息量完全足够,在实验中也能完全满足测试要求。
采用日本WATEC星光级黑白摄像机WAT-902B高清晰CCD摄像头集成模块,该摄像头为30万(640*480)像素,内部集成了AGC、AWB、AEC多种功能,集成度极高。
摄像头作为此次设计的唯一传感器,是此设计的核心器件之一。
它的好坏直接影响到PID算法中的反馈信息,对执行单元的调节直接构成影响。
综合以上考虑,此设计选择方案三。
1.3.4控制器
采用MSP430F149单片机作为控制器。
MSP430F149单片机具有丰富的接口资源且为即插型可编程器件,编程方便,同时它可以直接驱动96LCD。
MSP430F149功耗极低,价格便宜,是低功耗要求下的的一款首选处理器。
采用可编程器件CPLD作为控制器。
CPLD可以实现各种复杂的逻辑功能、规模大、密度小、体积小、稳定性高、IO资源丰富,易于进行功能扩展。
采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的核心,但是功耗大价格也相对昂贵。
采用STM32F4单片机作为控制器,STM32F4为32位处理器数据处理能力比普通单片机更强,并且最高可达到72MHz的主频,处理速度极快,端口资源丰富,价格便宜,适合作为一个自动控制系统的控制器。
方案四:
MS320DM6437是TI公司2006年推出的、专门为高性能、低成本视频应用开发的、主频600MHz的、32位定点DSP达芬奇(DaVinci(TM))技术的处理器系列,采用TI第3代超长指令集结构(VelociTI.3)的TMS320C64x+DSP内核,主频可达600MHz,支持8个8位或4个16位并行MAC运算,峰值处理能力高达4800MIPS,可实时处理8路CIF或3路D1格式的H.264编码算法。
根据本题目的要求以及我们现有的资源,所以我们选用了方案四。
2理论分析与计算
2.1激光靶点分析
2.1.1激光点运动轨迹分析
在胸环靶面上建立一个直角坐标系,根据匀速直线运动公式:
,激光点从任一点到达指定点它的位移等于X方向与Y方向的和位移,由此可知
(2-1)
通过运动路径分析(如图2),只要分别满足了X方向和Y方向的位移,则它的运动轨迹即和位移也就确定了,就可达到任一点移动要求。
图2运动路径分析
2.1.2打靶精度分析
如图3,抽象出激光打靶的数学模型。
对于同心圆,在水平方向和竖直方向所需要的位移量是相等的,即控制激光点水平和竖直移动所需要的位移量精度是相等的。
根据自主选择的胸环靶以及设计要求可知:
(2-2)
(2-3)
(2-4)
(2-5)
(2-6)
(2-7)
(2-8)
图3激光打靶模式数学模型
根据数学模型推导如下:
(2-9)
(2-10)
L---激光点距胸环靶水平距离
H---胸环靶中心距地面垂直距离
α---激光点在胸环靶上最小水平移动距离对应移动角
β---激光点在胸环靶上最小竖直移动距离对应移动角
3.系统设计
3.1总体设计
系统以DSP6437为核心,通过按键切换工作模式,将摄像头采集的射击定位数据实时传输到MCU,控制驱动器驱动两个步进电机实现激光枪光斑在胸环靶上下、左右移动,并通过800×
600TFT显示屏显示射击环数及方位。
通过键盘和DSP控制激光枪的亮和灭。
整体系统框图如图3所示。
图3整体系统框图
3.2系统模块设计
3.2.1PWM波的生成
分析:
DSP可以通过捕捉/比较功能来产生PWM波,并且仅在P4口才能产生,通过设定CCR0来设置PWM的频率,CCRx(1~7)来确定占空比,占空比是CCRx/CCR0。
由于舵机的精度与靶和激光笔的3米距离,多以我们要选用较高频率的PWM波,保证单片机能够使舵机达到其最高精度,保证准确性。
3.2.2佳的美PL8003TFT点阵显示屏
佳的美PL8003液晶电视采用8寸高分辨率(800x600)TFT液晶屏,图像清晰细腻,色彩艳丽;
全功能红外遥控,中英文菜单操作显示;
内置立体声扬声器,支持音效调节功;
支持图像上下、左右翻转控制,适应不同的安装使用方式;
具备定时开关机及信号自动待机功能。
与CPU接口采用了8位数据总线并行输入输出和8条控制线。
逻辑工作电压(VDD):
4.5~5.5V电源地(GND):
0V工作温度(Ta):
0~60℃(常温)/-20~75℃(宽温),模块控制芯片提供两套控制命令,基本指令和扩充指令。
详见相关资料。
下表是管脚的功能表;
佳的美PL8003TFT点阵显示屏显示中文、数字只需写好控制字后,再直接输入数据就可以了。
但是显示图像时,我们需要先用字模提取软件提取图像,再将我们的字模显示。
我先用CAD画好靶子后,用生成一个图像文件,在字模提取软件里面不断调整,得到最终的图像字模。
通过串口通信来得到点的位置,改变字模,通过相应的算法,达到闪烁的效果。
4测试方案与测试结果
4.1测试方案设计
4.1.1测试仪器
器件
精度
备注
直尺
1mm
卷尺
1cm
秒表
0.01s
按要求调节激光头打至所需环数,记录液晶显示器上显示的位置信息和实际的位置信息。
测量激光中心点打靶时,根据蜂鸣器提示记录实际的环数信息和显示器上的环数信息以及偏差距离,同时用秒表测量每次中心打靶所需要的时间。
4.2弹着点环数与方位信息显示测试及结果
当激光点打到胸环靶上某一具体位置时,显示器上进行环数和方位信息的显示。
测试结果如表1。
表1环数与方位信息显示测试数据
序号
实际环数
测量环数
实际方位
测量方位
环数误差
是否有方位误差
1
9
左上
否
2
10
中心
3
7
正下
4
8
右下
5
右上
4.3弹着点图像显示测试及结果(拓展部分)
当激光点打在胸环靶上时,胸环靶及弹着点的相应图形都在图形点阵显示器上进行显示,同时闪烁提示。
测试结果如表2。
表2弹着点图像显示测试数据
显示
实际环数与方位
是否有误差
误差环数
环数
方位
6
左下
4.4自动中心打靶测试及结果(拓展部分)
激光点从任意指定位置打到中心点。
测试结果如表3。
表3自动中心打靶测试数据
设定环数
是否到达中心
偏差距离
耗时
蜂鸣器是否指示
是
0.6cm
1.02s
0.8cm
0.96s
1.0cm
0.95s
0.5cm
1.21s
1.13s
0.78s
4.5任一点打靶测试及结果(拓展部分)
通过键盘设定5~10的任意环数,激光点自动打到设定环数。
测试结果如表4。
表4任一点打靶测试数据
4.7结论与分析
通过表格中数据分析,各项指标均达到设计要求,证明该自动射击装置具有较高的可靠性、稳定性,能够快速地进行图像扫描和处理,在多种模式下快速有效的进行射击打靶。
附录一
硬件电路图:
附录二
部分源程序:
//初始化OSD
StartOSD();
touch_screen_init();
nTemp=VPBE_VENC_DACSEL;
nTemp=VPBE_VENC_DACTST;
nTemp=CHIP_CRGET(IER);
GUI_Initial();
GUI_Exec();
del_binary_image_osd0();
#ifdefMOUSE_STATE_EN
GUI_CURSOR_SetPosition(20,20);
#endif
OpenLCD();
//打开LCD
//sd卡初始化
SdReady=0;
if(SDUSE_init()==0)
{
SdReady=1;
//可以使用SD卡
}
osdReady=1;
//可以触摸屏
nStartCursor=1;
nSetupState=0;
nOsdState=OSD_STATE_IDLE;
SDUSE_createfn(FileName,string2str("
LD"
jcCount1),"
BMP"
);
show_whichbmp(FileName);
//屏幕校准
//nOsdState=OSD_STATE_TS_CALIBRATION;
//tsCalSteps=0;
//TouchScreen_Calibration();
//WriteBmp_SD("
test13.bmp"
pImage,buffer);
//2.887s=>
12345678.bmp
//ReadBmp_SD("
//2.752s=>
2.371s
memset(Mark,0,sizeof(Mark));
while(status==0&
&
ss==0){//status用来表示视频设甘否存在==================================================
staticintbb=0;
FVID_exchange(hGioVpfeCcdc,&
frameBuffPtr);
#ifchannel==1
cur=(Uint8*)frameBuffPtr->
frame.frameBufferPtr;
memcpy((void*)L_pImage,cur,ImageHeight*ImageWidth*2);
for(i=0;
i<
ImageHeight;
i++)
for(j=0;
j<
ImageWidth;
j++)
pImage[i*ImageWidth+j]=cur[i*ImageWidth*2+j*2+1];
//if(pImage[i*ImageWidth+j]<
198)pImage[i*ImageWidth+j]=0;
//二值化
//elsepImage[i*ImageWidth+j]=255;
//erzhi();
//new=pImage;
mtemp=CLK_getltime();
switch(nOsdState)
caseOSD_CALIBRATION:
EVMDM6437_GPIO_setOutput(GPIO63,1);
//激光
markkk=0;
findXY();
yuanX=jix;
yuanY=jiy;
show_yuanxin(yuanX,yuanY);
break;
caseOSD_STATE_INITIAL:
EVMDM6437_GPIO_setOutput(GPIO63,0);
caseOSD_STATE_RUN:
nOsdState=0;
fangwei();
show_huanshu(t,f);
erzhihua();
caseOSD_STATE_UPCHU:
MotorDown();
if(yuanX!
=0){
caseOSD_STATE_DOWNCHU:
MotorUp();
caseOSD_STATE_LEFTCHU:
EVMDM6437_GPIO_setOutput(STEP_DIR_IO,1);
EVMDM6437_GPIO_setOutput(STEP_EN_IO,0);
MotorPWM2lx1();
caseOSD_STATE_RIGHTCHU:
EVMDM6437_GPIO_setOutput(STEP_DIR_IO,0);
caseOSD_STATE_COME:
shang();
caseOSD_STATE_BACK:
xia();
caseOSD_STATE_LEFT:
left();
caseOSD_STATE_RIGHT:
right();
caseOSD_STATE_SHI:
shihuan();
caseOSD_STATE_JIU:
jiuhuan();
caseOSD_STATE_BA:
bahuan();
caseOSD_STATE_QI:
qihuan();
caseOSD_STATE_LIU:
liuhuan();
caseOSD_STATE_WU:
EVMDM6437