高精度定时器在数字式随动系统测试中的应用
2015-05-06袁江华盛小波
袁江华,盛小波,刘 虹
(重庆望江工业有限公司,重庆 400071)
【信息科学与控制工程】
高精度定时器在数字式随动系统测试中的应用
袁江华,盛小波,刘 虹
(重庆望江工业有限公司,重庆 400071)
针对WINDOWS系统中的普通定时器定时精度低,不能准确测量数字式随动系统调转时间的特点,利用串口事件进行定时触发的测量机制,结合 Windows 高精度时间函数,设计出一种测量数字式随动系统大角度调转时间的机制,解决了用传统定时器所产生的记时不准和误差较大的问题,提高了随动系统指标的测试精度。
定时器;数字式随动系统;大角度调转;测试精度
在火炮数字式随动系统的生产调试过程中,通常需要用 PC 机作为调试设备,通过在 PC 机上运行专用的调试软件,来实现对系统通信协议的验证,对随动指标的测试,并对测试数据进行后处理,绘出火炮相应指标测试的位置、速度及误差曲线。由于基于离散采样,因此对采样周期的准确性的要求很高,如在火炮随动系统的各项指标测量中,大角度调转(如调转角度为 180°)的时间指标就直接与时间精度有关。而一般Windows 程序中采用的普通定时器,定时精度在1/18 s(55 ms)[1],达不到随动系统指标测试所要求的时间精度,造成了较大的测量误差。因此,需要一种更精确的定时方法。
Windows 是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的[2]。这样就会带来一些问题,一旦计算机的 CPU 被某个进程占用或系统资源紧张时,发送到消息队列中的消息就暂时被挂起得不到实时处理。因此不能简单地通过 Windows 消息引发一个对定时要求严格的事件。由于在 Windows 中已经封装了计算机底层硬件的访问,所以,要想通过直接利用访问硬件来完成精确定时是比较困难的[3]。定时器是 WINDOWS 系统中非常宝贵的资源,它的精度越高,越占用系统资源。因而在使用定时器时应根据实际需要,设定合适的定时精度。
1 定时方法确定
在 WINDOWS 系统中,定时器的用法概括起来有以下几种,下面介绍各种定时器的用法以及每种定时方案的精度指标。
最常用的定时器是 SetTimer(),它可以实现周期性的函数调用[2]。首先调用函数 SetTimer()设置定时间隔,然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。它的主要特点是使用简单,定时精度很低,不小于 55 ms,系统资源占用低。定时器消息在多任务操作系统中的优先级很低,得不到及时响应,不能满足实时控制环境下的应用,只可以用在对定时精度要求不高的场合。
在定时精度要求较高的情况下,可以使用多媒体定时器 timeSetEvent[4],该函数可以实现周期性的函数调用,下面的代码说明了相关函数的用法。
MMRESULT timeGetDevCaps(LPTIMECAPS ptc,UINT cbtc); //获取系统的时间分辩率。
timeBeginPeriod(resolution) ; //设置定时精度, 起动定时器, 单位:毫秒。timeEndPeriod(resolution);//清除定时精度,停止定时器,要求它必须和 timeBeginPeriod()匹配成对使用。
MMRESULT timeSetEvent ( UINT uDelay,UINT uResolution,LPTIMECALLBACKlpTimeProc,WORD dwUser,UINT fuEvent )//函数调用成功后返回事件的标识符代码,否则返回 NULL。
具体应用时,可以通过调用 timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc 回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是,在定时器使用完毕后, 应及时调用 timeKillEvent()将之释放。 多媒体定时器定时的特点是精度高,理论上可以达到毫秒级,任务处理的时间不能大于周期间隔时间,当精度设置较高时,系统资源占用也比较高,使用相对较为复杂[5]。
对于精确度要求更高的定时操作, 则使用QueryPerformanceFrequency() 和QueryPerformanceCounter()函数[4]。 这两个函数是 VC 提供的仅供 Windows 95 及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器,QueryPerformanceFrequency()函数和 QueryPerformanceCounter()函数的原型如下:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount)。
数据类型 ARGE_INTEGER 既可以是一个 8 字节长的整型数, 也可以是两个 4 字节长的整型数的联合结构,其具体用法根据编译器是否支持 64 位而定。该类型的定义如下:
typedef union _LARGE_INTEGER
{
证明 已知(xi)A→RSθ,η(A,D),则有conf((xi)A→Dk)≥θ和R((xi)A→Dk)≥η。又(xi)B→Dk⟹(xi)A→Dk,则由定义8知conf((xi)B→Dk)=conf((xi)A→Dk)≥θ。又因B⊆A,故有(xi)A⊆(xi)B。由式(3)得
struct
{
DWORD LowPart ;// 4 字节整型数
LONG HighPart;// 4 字节整型数
};
LONGLONG QuadPart ;// 8 字节整型数
}LARGE_INTEGER。
在进行定时之前,先调用 QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用 QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。
2 定时器应用
在随动指标的测试中,针对实际测试情况,采用了 Windows 高精度时间函数,并利用串口事件进行定时触发的测量机制。 在测试软件初始化时, 先利用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,当上机位测试软件发出调转命令后,记下系统时间记数值,同时随动系统开始调转,当随动系统调转到位后,再次记下系统时间记数值,最后把两次系统记数值相减,得到记数差值。再测出计时频率,根据下面的公式就可以计算出随动系统的调转时间
T=lCount/dfFreq
其中,T为时间(s);lCount 为两次系统记数之差;dfFreg为处理器频率。
下面是说明测试软件的设计过程以及部分代码。
进入测试软件时,调用 QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)函数,将系统频率存储在变量在 lpFrequency 中,其中,系统频率是与硬件相关的。当用户按随动 调 转 按 键 时, 测 试 软 件 发 出 随 动 调 转 命 令, 程 序 调 用QueryPerformanceCounter(LARGE_INTEGER *lpCount1),将系统计数值存储在 lpCount1 变量中,随动系统开始调转,不断回传当前位置数据,对接收到的随动数据进行分析,如果发现回传当前位置数据跟目标位置一致(通常存在允许的系统误差),就认为随动系统调转到位了。现在再次调用 QueryPerformanceCounter(LARGE_INTEGER *lpCount2),将系统记数存储在lpCount2 中,根据下面的公式,随动系统的调转时间
T= (lpCount2- lpCount1)/ lpFrequency×1 000
T为两次记数之间所经过的时间。
其中,lpCount2 和 lpCount1 分别是第一次和第二次系统记数结果;1 000是时间系数,将时间单位换算为毫秒。
通过这种记时方式,测试软件资源占用低,记时精度高,满足了产品测试要求。
3 应用效果
通过对定时方法的修改,数字式随动系统大角度调转指标测量精度得到很大程度的提高,在实际产品调试和交验中得到总体单位和军方的认可。其分辨精度可达到微秒,而测量误差在包含串行通信延时和串口中断响应时间的情况下在20 ms以内,其中还包括随动控制器对到位的判断时间。与用示波器测量的速度曲线比较,有一个 50~100 ms固定的时间差,从实际系统控制原理上是可以解释的。数字式随动系统大角度0~180°和180~0°的调转测试数据如表1。
表1 调转时间指标测试
4 结论
通过对WINDOWS定时器的定时精度、原理和机理分析,并结合数字式随动系统大角度调转时间测量方式和精度要求,设计出一种对数字式随动系统大角度调转时间进行准确测量的机制,实践证明,采用该机制设计出的软件运行稳定,定时精度高,适应性好,能够满足火炮数字式随动系统的产品调试以及交验的需要。
[1] 刘春凤,田延岭.Windows操作系统下的软件定时器的设计与应用[J].机电一体化,2004(5):38-41.
[2] 杨紫千,张继永,岳阳.Windows消息机制及其在软件系统设计中的应用[J].舰船电子工程,2004(5):81-85.
[3] 周绿漪,秦卫仕,柴力,等.MS Windows定时器性能分析及在定时-计数系统设计中的应用[J].核电子学与探测技术,2003(5):433-436.
[4] 刘钦彦,李勇.一种高精度定时器的设计及其应用[J].电测与仪表,2001(9):32-34.
[5] 张志明,孙广清,王磊.Windows下高精度定时的研究与实现[J].微型机与应用,2003(1):55-57.
[6] 杨洋,李钟慎,范伟.高精度数据采集系统定时器的仿真分析[J].华侨大学学报:自然科学版,2013(6):610-612.
(责任编辑 杨继森)
Application of High Precision Timer in Digital Servo System Test
YUAN Jiang-hua, SHENG Xiao-bo, LIU Hong
(Chongqing Wangjiang Industial Co., Ltd, Chongqing 400071, China)
Aiming at that the common timer timing precision in WINDOWS system is low and cannot be accurately measured with the characteristics of digital dynamic system switch time, using measure mechanism to have timing trigger of serial events and combined with high precision time function of Windows, we designed a mechanism for measuring the digital servo system of large angle maneuver time, and solved the problem of big error and incorrect timing generated by traditional timer, which improves the test precision of pneumatic system index.
timer; digital servo system; large angle maneuver; test accuracy
2015-01-15
袁江华(1978—),男,高级工程师,主要从事武器装备理论与技术研究。
10.11809/scbgxb2015.08.027
袁江华,盛小波,刘虹.高精度定时器在数字式随动系统测试中的应用[J].四川兵工学报,2015(8):109-111.
format:YUAN Jiang-hua, SHENG Xiao-bo, LIU Hong.Application of High Precision Timer in Digital Servo System Test [J].Journal of Sichuan Ordnance,2015(8):109-111.
TP311.1
A
1006-0707(2015)08-0109-03