1、激光枪自动射击报靶装置1 沈建华等著, MSP430系列16位超低功耗单片机原理与实践M,北京:北京航空航社,20102 华成英, 童诗白著,模拟电子技术M,北京:高等教育出版社,2006年3 阎石著,数字电子技术基础M,北京:高等教育出版社,1997年4 沈建华等. MSP430系列16位超低功耗单片机实践.清华大学出版社,2005.45 刘刚,彭荣群著. Protel DXP 2004 SP2原理图与PCB设计M. 北京:电子工业出版社20076 鹿玉红,戴彦,江培蕾. 基于PROTEUS的DS18B20数字温度计的仿真实现J. 福建电脑,2010,(1):117-118.2012年TI杯
2、四川省电子设计竞赛激光枪自动射击报靶装置(E题)【本科组】 时间:8.58.7 编号:XS-13-本-E摘要:本设计采用MSP430F169单片机和MSP430G2553单片机作为控制核心,系统主要包括电源模块、步进电机驱动模块、摄像头采集模块、激光发射模块、LCD12864报靶装置和按键控制模块显示装置电路。主要控制整个系统实现了按键控制及自动定位打靶,从任意位置迅速击中靶心,并使用摄像头采集打靶数据,通过单片机以处理后,用LCD12864显示打靶环数,图像和方位。通过实验表明:该系统达到了设计的各项要求。关键词:MSP430F169单片机;MSP430G2553单片机;步进电机电机;OV6
3、620FIFO摄像头;激光头;独立按键键盘;LCD128641.系统方案设计,比较与论证根据题目基本要求,设计任务完成按键控制打靶,自动定位打靶,摄像头对打靶情况采集,并用单片机处理后,在LCD12864液晶显示屏上显示打靶结果。为完成相应功能,系统由MSP430G2553单片机,电源模块,电机驱动模块,激光头打靶模块,摄像头模块及LCD12864显示模块构成,系统方案如图1所示 图1 系统框图1.1控制模块方案论证方案一:采用TI公司的msp430f169,msp430g2553单片机作为控制器。相对于本设计题目设计来说,由于采集和打靶硬件问题,我们需要用到两个单片机。msp430f169单
4、片机工作频率高,功耗低,I/O口多,性价比高,相对于本设计题目来说,需要较多IO口,及优越的Flash,m430g2553单片机,使用超低功耗,符合题目设计要求。方案二:采用TI公司的AT89S52单片机,但51单片机处理速度慢,功耗相对较高,且不符合题目要求。通过上述描述表明,方案一优于方案二,我们选择第一种方案。1.2电源模块的方案论证 方案一:双电源供电。电动机驱动电源采用12V稳压电池,单片机及其外围电路电源采用5V钮扣电池供电,两路电源完全分开,这样做可以将电动机驱动所造成的干扰彻底消除,提高了系统稳定性。但是造成了电池资源的浪费,使花费增大。方案二:所有器件采用单一电源(12V)供
5、电,通过7812稳压输出提供给需要12V的地方,通过2596稳压输出提供给需要5V的地方,通过LM1117输出3.3V电压给无线模块。这样供电简单方便,而且使电池充分的应用,节约了资源。 我们认为本设计的性价比和方便性更为重要,故拟采用方案二。1.3电机驱动模块。方案一:中功率三级管直接搭建在电机驱动要求不高的地方可以由三极管直接搭建一个驱动电路,使用三级关搭建的电机驱动电路电路简单,但功率和性能一般。对输入信号要求较高,输出性能只能满足一般要求。方案二:使用专用电机驱动芯片ULN2003ULN2003的驱动能力强,输入电压可变化范围大,是一块专用直流电机驱动芯片。其各项性能都较好,且价格便宜
6、,体积小,性能优越。综上考虑,两个步进电机使用方案二。1.4数据采集电路的论证与选择方案一:摄像头采集图像信号进行图像分析由摄像头采集图像信号,通过采集到的图像信号进行图像分析,然后计算出击中光点所在位该方案具有信息精确度高、抗干扰性强等优点。方案二:使用光敏电阻对击中区检测由光敏电阻加上一些辅助电路实现击中光斑的识别。由于靶场由白底和黑色的引导线组成,光敏元件可以在黑色和白色区发光区域识别,检测到光,电阻值变小。该方案具有电路简单,成本低廉,但干扰较大,信息精度低。通过比较,本设计采用方案一。1.5报靶电路模块的论证与选择方案一:采用语音方式报靶 通过喇叭及一些辅助电路通过单片机控制,根据摄
7、像头采集,控制芯片处理得出的数据,用喇叭方式进行语音报靶,但这种方式硬件制作相对复杂。方案二:使用LCD12864显示报靶由单片机控制LCD12864,根据采集处理到的数据,在12864上画图显示,并报靶,该方案具有电路简单,成本相对语音方式低廉,且显示结果精准。通过比较,本设计采用方案二。1.6按键控制模块的论证与选择方案一:采用独立按键控制激光笔的转动,以实现准确打靶。独立按键,使用方便,且电路简单。方案二:采用矩阵键盘控制,但根据实际需要,矩阵相对资源浪费,且编程相对复杂。综上比较,我们选择方案一。2.理论分析与计算2.1定位打靶及控制分析2.1.1按键控制打靶使用一个独立按键键盘,控制
8、两个步进电机的转动,以第一个电机实现激光笔的上下,第二个电机实现左右移动,通过激光笔的转动,实现打靶位置的移动,最终实现按键控制打靶,同时分配一个独立按键,实现模式切换,实现自动定位打靶。2.1.2自动定位打靶通过按键先控制,确定任意打靶位置,并进行定位,实现15秒内瞄准击中靶心。2.1.3摄像头的数据采集 使用OV6620FIFO摄像头对打靶情况进行数据采集,并将采集所得数据存入fifoAL422B,再从fifo传送给msp430g2553单片机进行处理,其中,OV6620可以每秒采集25帧,一帧两场,那么每秒就有50场,意味着20MS就有一幅图像产生。356x 292 pixels,理解为
9、:有292行,一行有356个点,但根据实际情况,我们只采集一帧。并采用二值化方式,是输出图像为黑白灰度形式,根据采集的图像灰度来进数据分析,用于在单片机上处理,以确定任意打靶坐标和正确显示打靶结果。2.1.4打靶结果显示采集数据通过单片机MSP430F169处理后,用LCD12864对结果进行显示。主要显示打靶画面,以及弹着点的环数与方位信息。2.1.5节能分析使用低功耗的msp430f169和超低功耗的msp430g2553控制芯片,并使用28BYJ步进电机,功耗相对低,精度高,最大限度的节约能源,降低功耗。3.电路与程序设计3.1硬件电路设计3.1.1电源由于控制芯片小系统,显示电路,步进
10、电机运转驱动激光笔打靶,摄像头各模块需要的电压不同,为了实现单电池供电,我们将7812、2596和LM1117做到一个板子上,实现了12V电压、5V和3V电压实现输出功能。具体电路如图2:图2 电源电路 3.1.2驱动电路驱动电路包括一片ULN2003芯片,该驱动芯片带负载能力强,温度范围宽,起保护作用,避免电流过大而损坏驱动芯片,具体电路如图3所示。 图3 驱动电路3.1.3摄像模块电路摄像模块电路由AL422B和ov6620组成,AL422B输入端与摄像头0v6620相连,输出端与单片机相连,具体电路如图4所示。图4 摄像头模块电路3.1.4报靶显示模块电路报靶部分使用LCD12864显示
11、,主要显示摄像头采集到的打靶图像,打中环数及其打中区域,具体电路如图5所示。图5 LCD12864报靶显示模块电路3.2软件设计3.2.1主程序流程图图6 主程序流程图3.2.2摄像头采集处理显示程序流程图 图7 摄像头模块流程图3.2.3打靶模块程序流程图图8 打靶程序流程图4 系统测试4.1测试方法自制胸环靶,靶心直径10cm,各靶环间距5cm,共六环,由激光笔代替激光枪,实现打靶。打靶方式包括:按键控制打靶,自动打靶,摄像头按坐标自动打靶。打靶内容包括打靶环数,打靶方位,如中心、正上、正下、正左、正右、左上、左下、右上、右下以及在15秒内将激光束光斑从胸环靶上的指定位置迅速瞄准并击中靶心
12、(即10环区域),并检测打靶是否正确,及偏移量,由12864显示打靶结果。4.2测试结果与分析4.2.1按键控制打靶测试,测试数据如下:次数设定环数实际环数110102993884.2.2摄像头识别打靶,测试数据如下:次数设定环数设定方向实际环数实际方向17右上7右上28左上8正左39正下9正下4.2.3液晶显示打靶环数及弹着点,测试结果如下:次数设定打靶环数设定方位显示是否正确18左上是29正右是37右下是4.2.4从任意位置击中靶心测试,测试结果如下:次数指定环数方位是否击中靶心17左上是28右下是39正上是分析:大部分打靶,及显示都正常执行,但部分摄像头识别打靶有不精准情况,由于摄像头采
13、集及一些硬件的不稳定,形成一定误差。5 结束语经过三天的辛勤努力,我们基本上实现了题目的要求,在编程和调试的过程中,我们遇到很多问题。由于时间紧,工作量大,但本次竞赛锻炼了我们各方面的能力,虽然我们遇到了很多困难和障碍,但总体上成功与挫折交替,困难与希望并存,我们将继续努力争取更大的进步。当然,我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请各位老师批评指正。全部程序#include io430.h#include in430.h#include 12864.c#include 12864.h#include nbc430.h#define uchar unsigned ch
14、ar#define uint unsigned int#define S_A P10 /定义步进电机A相#define S_B P11 /定义步进电机B相#define S_C P12 /定义步进电机C相#define S_D P13 /定义步进电机D相#define jg1 P60 /定义激光闪烁 #define jg2 P61 /定义激光闪烁#define S_A2 P14 /定义步进电机A相#define S_B2 P15 /定义步进电机B相#define S_C2 P16 /定义步进电机C相#define S_D2 P17 /定义步进电机D相#define S17 P27 /shang
15、#define S18 P26 /you#define S19 P25 /启动/暂停#define S20 P24 /zuo#define S21 P23 /xia/#define Dataport P5 /数据口定义uchar table0 = 方位:环数:; /液晶显示内容位置与“环数:”uchar table1 = 正上 右上 正右 右下 正下 左下 正左 左上 中心; /每两个字显示一个方位uchar table2 = 10环9 环8 环7 环6 环5 环脱靶; /显示环数/*10环*9环*8环*7环*6环*5环*脱靶*方向*uchar tbzhsh72 = 96,29,96,23,
16、96,19, 96,13, 96,9, 96,3, 96,0; /正上uchar tbzhxia72 = 96,33,96,39, 96,44, 96,49, 96,54, 96,59, 96,63; /正下uchar tbzhzuo72 = 93,31,88,31, 83,31, 78,31, 73,31, 68,31, 64,31; /正左uchar tbzhyou72 = 99,31,103,31,109,31,113,31,119,31,123,31,127,31; /正右uchar tbzuosh72 = 94,27,91,24, 87,22, 84,19, 80,15, 77,12
17、, 73,8; /左上uchar tbzuoxia72= 94,33,91,36, 87,40, 84,43, 80,47, 77,50, 73,54; /左下uchar tbyoush72 = 98,27,101,24,105,22,108,19,112,15,115,12,119,8; /右上uchar tbyouxia72= 98,33,101,36,105,40,108,43,112,47,115,50,119,54; /右下uchar stop,speed,sh,xh,zh,yh,x,sh1,xh1,zh1,yh1,a,b,q,h; uchar keyValue; uchar dis
18、16=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, / 0 1 2 3 4 5 6 7 0x80,0x90;/0F的段码 / 8 9 uchar zhuan8=0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90; /右转8节拍地址uchar zhuan18=0x90,0x80,0xc0,0x40,0x60,0x2,0x30,0x10; /左转8节拍地址uchar zhuan28=0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09; /上转8节拍地址uchar zhuan38=0x09,0x08,0x0c
19、,0x04,0x06,0x02,0x03,0x01; /下转8节拍地址 uchar dis18=0xFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F; /位选 / 0 1 2 3 4 5 6 7/*/延时/*void delay(uint time) uint i,j; for(i = 0;i time; i+) for(j = 0;j 30; j+); /*/IO初始化操作/*void IO_init(void) P1DIR=0xff; /设置P1为输出 P1=0xff; /设置P1初始化为高电平 P2DIR=0X00; P2=0x00; / P3DIR=0xff;
20、 /设置P3为输出 /P3=0xff; /设置P3初始化为高电平 / P4DIR=0xff; /设置P4为输出 /P4=0xff; /设置P4初始化为高电平 /P5DIR=0xff; /设置P5为输出 /P5=0xff; /设置P5初始化为高电平 P6DIR=0xff; P6=0xff;/*/数码管显示函数/*/*void smg_show(uchar sh,uchar xh,uchar zh,uchar yh) P4=dis14; Dataport=dissh;delay(10);P4=dis16; Dataport=disxh;delay(10);P4=dis12; Dataport=di
21、szh;delay(10);P4=dis10; Dataport=disyh;delay(10);*/*/1*5按键扫描函数/*void keyScan() if(P2IN&0xf8)!=0xf8) /判断是否有按键按下 delay(100); /延时肖抖 if(P2IN&0xf8)!=0xf8) /再次判断是否有按键按下 keyValue=(P2IN&0xf8); /读取扫描结果 while(P2IN&0xf8)!=0xf8); /等待按键松开 void keyScan1() if(P2IN&0xf8)!=0xf8) /判断是否有按键按下 delay(100); /延时肖抖 if(P2IN&
22、0xf8)!=0xf8) /再次判断是否有按键按下 keyValue=(P2IN&0xf8); /读取扫描结果 delay(300); /*/步进电机控制/*void youzh() uint y; for(y=0;y8;y+) P1=zhuany; delay(speed); void zuozh() uint y; for(y=0;y8;y+) P1=zhuan1y; delay(speed); void shangzh() uint y; for(y=0;y8;y+) P1=zhuan2y; delay(speed); void xiazh() uint y; for(y=0;y8;y+
23、) P1=zhuan3y; delay(speed); /*/1*5按键扫描结果处理函数/*keyHandle() switch(keyValue) case 0xb8: /如果S18按键按下时下转 shangzh(); delay(50); break; case 0xe8: /如果S20按键按下时上转 xiazh(); delay(50); break; case 0x78: /如果S17按键按下时右转 youzh(); delay(50); break; case 0xf0: /如果S21按键按下时左转 zuozh(); delay(50); break; case 0xd8: /如果S
24、19按键按下时切换模式 x+; delay(50); break; default: break; keyHandle1() switch(keyValue) case 0xe8: /如果S20按键按下时上转xh下 xh+; /smg_show( sh,xh,zh,yh); if(xh=12) xh=0; delay(100); break; case 0xf0: /如果S21按键按下时左转zh下 zh+; /smg_show( sh,xh,zh,yh); if(zh=12) zh=0; delay(100); break; case 0xd8: /如果S19按键按下时切换模式 x+; delay(100); break; case 0x78: /如果S17按键按下时右转yh下 yh+; /smg_show( sh,xh,zh,yh); if(yh=12) yh=0; delay(100); break; case 0xb8: /如果S18按键按下时下转sh下 sh+; /smg_show( sh,xh,zh,yh); if(sh=12) sh=0; dela
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1