射击模拟训练器激光靶设计
扫描二维码
随时随地手机看文章
1、概述
模拟训练器激光靶是接收射击训练手枪发出的激光束,训练枪由真实手枪改造而成,子弹为空爆弹,即没有子弹头。射击过程膛内有压力,手枪有后坐力,因此和实弹射击没有不同的感觉,能够达到预期的训练效果。手枪的不同之处是枪内加入一组小型纽扣电池和一个微型激光发生器,并利用膛内压力使激光器工作,其工作时间由膛内压力控制.激光靶由光敏二极管,模拟电路,数字电路,单片机和个人计算机系统组成,激光靶接收到激光信号后,经过信号处理,由单片机以串口通讯方式将信息发送给个人计算机,此时个人计算机显示胸靶图像,弹着点颜色不同与其它部分,并语音报靶,同时系统采用网络技术,在监控室可以实时的观看并统计各个激光靶的射击训练情况,及对训练效果进行评估.
2、硬件电路
2.1 激光信号采集处理电路
训练枪激光器发出的激光束波长为622~1500nm,激光靶采用光敏二极管作为传感器,而太阳光含有该波长范围内的光,特别是当阳光强烈时激光枪信号更显微弱.设计中采用完全补偿方案,即单独使用一个光敏二极管感应太阳光,再叠加微小电压作为基准电压,当激光打到靶面光敏二极管时,其输出高于基准电压,否则其输出低于基准电压,设计中采用CD4053将电平信号转换为开关信号.
由于激光器的工作时间较短,加之射击时的抖动,因此必须对CD4053的输出信号进行脉宽调制,以保证单片机读到有效的激光信号脉冲.激光信号采集处理电路如图1所示.
2.2 计算机实时通讯电路
8031单片机将采集到的数据处理完成后,将中靶位置信息通过RS232串口传送给个人计算机,由于单片机供电没有负电源,采用如图2所示的电路实现8031单片机与个人计算机的通信.
图1中V1和V2分别为激光接收电路电压和基准电压
2.3 数字信号编码采集电路
我们将激光靶的764 个光敏二极管分为64块,采用8位二进制编码处理,并将其组成8×8矩阵式键盘机构,使用8279完成对靶面位置的不断扫描,自动消抖,自动识别出位置并给出编码.采用8031单片机完成对8279的初始化和控制,以及数据的采集和处理,数字信号编码采集电路如图3所示
图3数字信号编码采集电路
3、单片机软件流程
单片机程序设计主要包括主程序,中断服务程序和数据传送子程序,其基本工作方式采用中断方式。单片机用8031CPU,它与PC机数据传送采用RS232串口通讯。单片机程序流程图如图4所示。
4、PC机软件设计
4.1 设计思想
软件使用VC++6.0设计,通过RS232串行接口接收下位机发来信息,然后显示并报环,同时记录做统计处理,产生报表。串行通讯采用MSCOMM32.OCX控件实现。
由于需要同时对对台下位机进行监控,软件采用多文档模式进行设计,硬件采用多串口卡PCL-858实现。系统结构如图1
4.2 关于MSCOMM32.OCX
MSCOMM32.OCX 控件是由微软提供,该控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他串行通信设备;可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工的、事件驱动的、高效实用的通信程序。现将常用的属性列举如下:
CommPort:设置通信口号 Settngs:设置串行口参数
PortOpen:打开与关闭串行口 InputLen:读入输入数据长度
Input:读入数据 InBufferCount:输入缓冲区读入字节数
Output:输出数据 OutBufferCount:输出缓冲区读出字节数
InputMode:定义Input属性获得数据的方式。
Rthreshold:设置、返回在通信控件置ComEvRecieve并激发OnComm事件前要接收的字符数。
Sthreshold:设置、返回通信控件置ComEvSend并激发OnComm事件前发送缓冲区种的最小字符数。
4.3 串口通讯的实现
在ClassWizard中为新创建的通信控件定义成员对象:CMSComm m_Serial。以下是通过设置控件属性对串口进行初始化的源代码:
CString m_set;
m_CommDpj.SetCommPort(m_pDoc->m_dpjComm.m_uPort); // 指定串口号
m_set.Format("%d,n,8,1",m_pDoc->m_dpjComm.m_uBps);
m_CommDpj.SetSettings(m_set); // 通信参数设置
m_CommDpj.SetInBufferSize(1024);// 指定接收缓冲区大小
m_CommDpj.SetInBufferCount(0);// 清空接收缓冲区
m_CommDpj.InputMode(1);// 设置数据获取方式
m_CommDpj.SetInputLen(0);// 设置读取方式
图5 系统结构图
m_CommDpj.SetRThreshold(10);//设置OnComm事件的响应
m_Opened=m_CommDpj.SetPortOpen(m_Port);// 打开指定的串口
打开所需串口后,使用OnComm事件和CommEvent属性捕捉并检查通信事件和错误的值。发生通信事件或错误时将触发OnComm事件,CommEvent属性的值将被改变,应用程序通过检查CommEvent属性值并作出相应的反应。以下为OnComm事件的源代码:
VARIANT m_input1;
COleSafeArray m_input2;
long length,i;
if(m_CommDpj.GetCommEvent()==2)//接收缓冲区内有字符
{
m_input1=m_CommDpj.GetInput();//读取缓冲区内的数据
m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,m_Data+i);//将数据转换为BYTE型数组
FromDpj();//进行事件处理
DpjLock=false;
}
4.4 数据文件的生成
数据文件才文本形式进行存储。在数据文档中建立如下结构体:
struct ShotData{
unsigned int m_uNum;//编号
unsigned int m_uSNum;//站号
unsigned int m_uPlot;//射击点
CTime m_Curtime;//当前时间};
数据记录的源代码如下:
void CJGBDoc::GetFileName()//获取记录文件名
{
CString m_str;
GetCurrentDirectory(128,m_str.GetBuffer(128));
m_str.ReleaseBuffer(-1);
CFileDialog dlg(false,"Txt",m_str+"\*.Txt",NULL,"记录文件(*.Txt)");
if(dlg.DoModal()==IDOK)
{
if(file.Open(dlg.GetPathName(),CFile::modeRead)!=0)
{
if(AfxMessageBox("文件已存在,是否覆盖?",MB_YESNO)==IDNO)
{
AfxMessageBox("文件保存失败!");
return;
}
file.Close();
}
if(file.Open(dlg.GetPathName(),CFile::modeWrite|CFile::modeCreate)==0)
{
AfxMessageBox("文件保存失败!");
}
}
else
AfxMessageBox("文件保存失败!");
}
实时记录函数:
{
---
CString m_record;
m_record.Format("%d,%d,%d,%s",m_pDoc-> ShotData.m_uNum,
m_pDoc-> ShotData.m_uNum, m_pDoc-> ShotData.m_uNum
m_pDoc-> ShotData.m_CurTime.Format ("%y-%m-%d %H:%M:%S"));
file.Write(m_record);
---
}
5、结论
激光靶研制出样机后,与模拟射击训练用手枪进行了联调,试验表明,激光靶设计合理,满足设计技术指标要求,工作稳定可靠。通过采用模拟射击训练,一方面可以降低训练成本,另一方面也可消除意外事故,因此模拟射击训练器有很好的应用前景。
参考文献
[1] 王福瑞. 单片微机测控系统设计大全.北京航空航天大学出版社,1998.4
[2] 李大友.微型机算计接口技术.清华大学出版社,1998.5
[3] David J.Kruglinski,Scot Wingo,George Shepherd ,Programming Visual C++ 6.0技术内幕
1999.5