
本设计是一个能够控制激光枪击发、自动报靶及自动瞄准功能的电子系统.docx
24页11 系统构建与方案设计1.1 系统设计要求本设计是一个能够控制激光枪击发、自动报靶及自动瞄准功能的电子系统基本要求是首先激光枪可受电路控制发射激光束,然后激光枪可通过键盘控制激光枪的弹着点,最后制作弹着点检测电路,通过摄像头识别激光枪投射在胸环靶上的弹着点光斑,并显示弹着点的环数与方位信息1.2 系统方案设计与选择1.2.1 主控制电路设计与选择(1)根据题目要求可知,要求采用激光枪来产生激光束,由于激光很容易受外界光线影响,很难采集到光斑,所以摄像头采集激光光斑的控制器要求运算速度高,存储容量大液晶显示部分因为要显示的像是 320*240,所以控制器的精度和位数要高一些对此有以下方案:方案一:采用 FPGA(Field Programmable Gate Array—现场可编程门阵列)作为系统的控制器由于 FPGA 将所有器件集成在一块芯片上,所以外围电路较少,控制板的体积小,,扩展性能好;但是摄像头采集部分需要运算速度高,存储容量大,由于 FPGA 的运算能力不强,成本偏高,所以不能使用FPGA方案二:采用 16 位 MC9S12XS128 飞思卡尔芯片作为摄像头采集控制器此款芯片控制功能强大,软件编程灵活,运算速度比较高且存储容量大,它不仅具有成本低、体积小和功耗低等优点,且被广泛应用于各个领域,因此非常适合利用此芯片作为控制器。
基于以上分析,控制摄像头采集的控制器采用方案二实现控制2)而控制云台找投射点,只要能满足在串口下载程序找出中心、正上、正下、正左、正右、左上、左下、右上、右下这十个相对位置即可,可以采用带有串口调试的控制器即可,方案如下:2方案一:采用 Atmel 公司的 AT89S52 单片机作为控制云台找投射点的控制器单片机控制功能强大,软件编程灵活,可用软件较简单地实现各种算法和逻辑控制,但是它不带串口下载口所以该控制器不能满足控制云台找投射点方案二:采用 8 位 STC51 单片机控制云台找投射点,此款单片机不仅控制功能强大、体积小、功耗低,而且最重要的是它带有串口下载口,正好符合控制云台找投射点基于以上分析,控制云台找投射点的控制器采用方案二实现控制3)液晶显示部分因为要显示的像分辨率是 320*240,所以控制器的分辨率精度要高,运算速度要快一些方案一:采用 8 位 STC51 单片机控制液晶显示图像,此款单片机不仅控制功能强大、成本低、功耗低,但是它的像分辨率低,运算速度比较慢,所以它不满足控制液晶显示方案二:采用 ARM Cortex-M3 32 位 STM32 芯片控制液晶显示图像,该芯片功能非常强大,位数多,而且能显像分辨率和运算速度都比较高,对于显示分辨率为 320*240 的像很容易。
其控制电路原理图基于以上分析,控制液晶显示的控制器采用方案二实现控制1.2.2 数据采集电路设计与选择因为数据采集的是激光枪投射到胸环靶上的光斑,其中还有一些无效的光束,光斑即一个点,需有 XY 坐标,这就要求有能够连续和隔行两种扫描方式且像素和帧速率较高的摄像头来采集方案一:采用 OV6620 型号摄像头采集光斑它是单片视频/图像摄像头,具有很大的强大的功能,像素为 101376,但是只能逐行扫描,不能满足数据采集来自激光枪投射到胸环靶上的光斑方案二:采用 OV7620 型号摄像头采集光斑是一种 CMOS 图像传感器,被广泛应用在网络摄像头、摄像等产品中 它不仅具有强大数据采集、时序同步与处理等功能,而且它支持连续和隔行扫描帧速率也很快,所以这种型号的摄像头是最佳的选择其摄像头控制原理图如图 1 所示:3基于以上分析,数据采集采用方案二实现控制DI0124WE5GN6TS7R8CLK9VOUABPHeadrM_FY图 1 摄像头控制原理图1.2.3 机构电机驱动电路的设计与选择步进电机驱动是把控制系统发出的脉冲信号转化为步进电机的角位移,即控制系统每发一个脉冲信号,通过驱动器就使步进电机旋转一个步距角。
关于步进电机的驱动有以下几种方案方案一:采用集成电机驱动芯片 LA298采用该方法实现电路驱动,简化了该电路的复杂性,控制比较简单,性能稳定,但成本较高方案二:采用与步进电机相匹配的驱动装置,原理方案图如图 2 所示使用该方法实现步进电机驱动,其优点是工作可靠,节省制作和调试的时间,电路连接比较简单,可提高电路的抗干扰能力,成本较低基于以上分析,采用方案二实现电机驱动一4图 2 采用步进电机驱动器的原理方案图1.3 理论分析与计算(1)激光枪自动控制原理分析与计算:我们采用激光头代替激光枪安装在电机旋转装置上构成云台,用 STM32控制云台来投射到胸环靶上,用摄像头采集胸环靶上的光斑计算公式:靶的位置=120/6/(M_X/6)(2)弹着点检测原理分析与计算制作弹着点检测电路,通过摄像头识别激光枪投射在胸环靶上的弹着点光斑,可显示弹着点的环数与方位信息计算弹着点环数:弹着点环数=20/(M_X+M_Y)/6计算弹着点方位公式:第一象限 :正右 △Y/△X△Y/△X> tan22.5正上 tan67.5△Y/△X第三象限:正下 △Y/△X〉tan22.5左下 tan67.5△Y/△X第四象限:正右 △Y/△X△Y/△X> tan22.5正下 tan67.5 huan_5) //大于五环半径{OK_huan = 4; //五环外脱靶}return OK_huan;}u8 From_panduan(u8 P_x,u8 P_y,u8 xiang_xian){float from,Px,Py;Px=fabs(P_x-U_D);Py=fabs(P_y-R_L);switch(xiang_xian){case 1: {if(Py*10/Px > tan_67) //正上 ↑from=1; elseif((tan_67 >= (Py*10/Px))&&((Py*10/Px) >= tan_22)) //右上 ↗from=2; elseif(Py*10/Px = (Py*10/Px))&&((Py*10/Px) >= tan_22)) //右下 ↘from=4; elseif(Py*10/Px > tan_67) //正下 ↓from=5;}break;case 3: {if(Py*10/Px > tan_22) //正下 ↓from=5; else15if((tan_67 tan_22) //正上 ↑from=1;}break;default:from=0;break;}return from;}//USART3 中断服务函数void USART3_IRQHandler(void){u8 Rx_Data=0;u8 II;u8 From=0;u8 Fang_Wei=0;float RR;if(USART_GetITStatus(USART3,USART_IT_RXNE)!= RESET){USART_ClearITPendingBit(USART3, USART_IT_RXNE);16Rx_Data=USART_ReceiveData(USART3);if(Rx_Data=='$'){Rx_XS128_F=1;Rx_XS128_num=0;}if((Rx_XS128_F==1)&&(Rx_Data=='%')){Rx_XS128_F=0;Rx_XS128_END=1;if(RXD_XS128_CODE[1]=='O'){for(II=1;IIU_D) //右半屏{if(Y_now>R_L) //右下(四){From=4;Fang_Wei=From_panduan(X_now,Y_now,From);}elseif(Y_nowR_L) //左下(三){From=3;Fang_Wei=From_panduan(X_now,Y_now,From);}else if(Y_nowR_L) //正下轴上{Fang_Wei=5;}else{Fang_Wei=0; //圆心}}/////////////////////////////////////////////////////////////////////////////////////////////RR = fabs(Y_now-R_L)*fabs(Y_now-R_L)+fabs(X_now-U_D)*fabs(X_now-U_D);huan_shu = huan_panduan(RR);/////////////////////////////////////////////////////////////////////////////////////////////huanshu_code[17]=huan_shu/10+0x30;huanshu_code[18]=huan_shu%10+0x30;if(huan_shu==4){if(mode_num==3)PLAY_BaoBa(0,9);LCD_DisplayStringLine(Line18-10,40,"Shooting Number: OUT",Red,White); //红色 显示环数}else{if(mode_num==3)PLAY_BaoBa(1,huan_shu);19LCD_DisplayStringLine(Line18-10,40,huanshu_code,Red,White); //红色 显示环数}LCD_PutChar(220,Line18-10,0x30+Fang_Wei,Grey,Red);switch(Fang_Wei){case 1: LCD_DisplayStringLine(Line18-10,210,"U ",Red,White); break;//红色 显示环数case 2: LCD_DisplayStringLine(Line18-10,210,"RU ",Red,White); break;//红色 显示环数case 3: LCD_DisplayStringLine(Line18-10,210,"R ",Red,White); break;//红色 显示环数case 4: LCD_DisplayStringLine(Line18-10,210,"RD ",Red,White); break;//红色 显示环数case 5: LCD_DisplayStringLine(Line18-10,210,"D ",Red,White); break;//红色 显示环数case 6: LCD_DisplayStringLine(Line18-10,210,"LD ",Red,White); break;//红色 显示环数case 7: LCD_DisplayStringLine(Line18-10,210,"L ",Red,White); break;//红色 显示环数case 8: LCD_DisplayStringLine(Line18-10,210,"LU ",Red,White); break;//红色 显示环数default:LCD_DisplayStringLine(Line18-10,210," ",Red,White); break;//红色 显示环数 break;}str_code[2]=X_now/10+48;str_code[3]=X_now%10+48;str_code[7]=Y_now/10+48;str_code[8]=Y_now%10+48;str_code[14]=LCD_X_now/100+48;str_code[15]=LCD_X_now%100/10+48;str_code[16]=LCD_X_now%10+48;str_code[20]=LCD_Y_now/100+48;str_code[21]=LCD_Y_now%100/10+48;s。












