袁江華,盛小波,劉 虹
(重慶望江工業(yè)有限公司,重慶 400071)
【信息科學(xué)與控制工程】
高精度定時器在數(shù)字式隨動系統(tǒng)測試中的應(yīng)用
袁江華,盛小波,劉 虹
(重慶望江工業(yè)有限公司,重慶 400071)
針對WINDOWS系統(tǒng)中的普通定時器定時精度低,不能準確測量數(shù)字式隨動系統(tǒng)調(diào)轉(zhuǎn)時間的特點,利用串口事件進行定時觸發(fā)的測量機制,結(jié)合 Windows 高精度時間函數(shù),設(shè)計出一種測量數(shù)字式隨動系統(tǒng)大角度調(diào)轉(zhuǎn)時間的機制,解決了用傳統(tǒng)定時器所產(chǎn)生的記時不準和誤差較大的問題,提高了隨動系統(tǒng)指標的測試精度。
定時器;數(shù)字式隨動系統(tǒng);大角度調(diào)轉(zhuǎn);測試精度
在火炮數(shù)字式隨動系統(tǒng)的生產(chǎn)調(diào)試過程中,通常需要用 PC 機作為調(diào)試設(shè)備,通過在 PC 機上運行專用的調(diào)試軟件,來實現(xiàn)對系統(tǒng)通信協(xié)議的驗證,對隨動指標的測試,并對測試數(shù)據(jù)進行后處理,繪出火炮相應(yīng)指標測試的位置、速度及誤差曲線。由于基于離散采樣,因此對采樣周期的準確性的要求很高,如在火炮隨動系統(tǒng)的各項指標測量中,大角度調(diào)轉(zhuǎn)(如調(diào)轉(zhuǎn)角度為 180°)的時間指標就直接與時間精度有關(guān)。而一般Windows 程序中采用的普通定時器,定時精度在1/18 s(55 ms)[1],達不到隨動系統(tǒng)指標測試所要求的時間精度,造成了較大的測量誤差。因此,需要一種更精確的定時方法。
Windows 是基于消息機制的系統(tǒng),任何事件的執(zhí)行都是通過發(fā)送和接收消息來完成的[2]。這樣就會帶來一些問題,一旦計算機的 CPU 被某個進程占用或系統(tǒng)資源緊張時,發(fā)送到消息隊列中的消息就暫時被掛起得不到實時處理。因此不能簡單地通過 Windows 消息引發(fā)一個對定時要求嚴格的事件。由于在 Windows 中已經(jīng)封裝了計算機底層硬件的訪問,所以,要想通過直接利用訪問硬件來完成精確定時是比較困難的[3]。定時器是 WINDOWS 系統(tǒng)中非常寶貴的資源,它的精度越高,越占用系統(tǒng)資源。因而在使用定時器時應(yīng)根據(jù)實際需要,設(shè)定合適的定時精度。
在 WINDOWS 系統(tǒng)中,定時器的用法概括起來有以下幾種,下面介紹各種定時器的用法以及每種定時方案的精度指標。
最常用的定時器是 SetTimer(),它可以實現(xiàn)周期性的函數(shù)調(diào)用[2]。首先調(diào)用函數(shù) SetTimer()設(shè)置定時間隔,然后在應(yīng)用程序中增加定時響應(yīng)函數(shù) OnTimer(),并在該函數(shù)中添加響應(yīng)的處理語句,用來完成到達定時時間的操作。它的主要特點是使用簡單,定時精度很低,不小于 55 ms,系統(tǒng)資源占用低。定時器消息在多任務(wù)操作系統(tǒng)中的優(yōu)先級很低,得不到及時響應(yīng),不能滿足實時控制環(huán)境下的應(yīng)用,只可以用在對定時精度要求不高的場合。
在定時精度要求較高的情況下,可以使用多媒體定時器 timeSetEvent[4],該函數(shù)可以實現(xiàn)周期性的函數(shù)調(diào)用,下面的代碼說明了相關(guān)函數(shù)的用法。
MMRESULT timeGetDevCaps(LPTIMECAPS ptc,UINT cbtc); //獲取系統(tǒng)的時間分辯率。
timeBeginPeriod(resolution) ; //設(shè)置定時精度, 起動定時器, 單位:毫秒。timeEndPeriod(resolution);//清除定時精度,停止定時器,要求它必須和 timeBeginPeriod()匹配成對使用。
MMRESULT timeSetEvent ( UINT uDelay,UINT uResolution,LPTIMECALLBACKlpTimeProc,WORD dwUser,UINT fuEvent )//函數(shù)調(diào)用成功后返回事件的標識符代碼,否則返回 NULL。
具體應(yīng)用時,可以通過調(diào)用 timeSetEvent()函數(shù),將需要周期性執(zhí)行的任務(wù)定義在LpTimeProc 回調(diào)函數(shù)中(如:定時采樣、控制等),從而完成所需處理的事件。需要注意的是,在定時器使用完畢后, 應(yīng)及時調(diào)用 timeKillEvent()將之釋放。 多媒體定時器定時的特點是精度高,理論上可以達到毫秒級,任務(wù)處理的時間不能大于周期間隔時間,當(dāng)精度設(shè)置較高時,系統(tǒng)資源占用也比較高,使用相對較為復(fù)雜[5]。
對于精確度要求更高的定時操作, 則使用QueryPerformanceFrequency() 和QueryPerformanceCounter()函數(shù)[4]。 這兩個函數(shù)是 VC 提供的僅供 Windows 95 及其后續(xù)版本使用的精確時間函數(shù),并要求計算機從硬件上支持精確定時器,QueryPerformanceFrequency()函數(shù)和 QueryPerformanceCounter()函數(shù)的原型如下:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount)。
數(shù)據(jù)類型 ARGE_INTEGER 既可以是一個 8 字節(jié)長的整型數(shù), 也可以是兩個 4 字節(jié)長的整型數(shù)的聯(lián)合結(jié)構(gòu),其具體用法根據(jù)編譯器是否支持 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 字節(jié)整型數(shù)
LONG HighPart;// 4 字節(jié)整型數(shù)
};
LONGLONG QuadPart ;// 8 字節(jié)整型數(shù)
}LARGE_INTEGER。
在進行定時之前,先調(diào)用 QueryPerformanceFrequency()函數(shù)獲得機器內(nèi)部定時器的時鐘頻率, 然后在需要嚴格定時的事件發(fā)生之前和發(fā)生之后分別調(diào)用 QueryPerformanceCounter()函數(shù),利用兩次獲得的計數(shù)之差及時鐘頻率,計算出事件經(jīng)歷的精確時間。
在隨動指標的測試中,針對實際測試情況,采用了 Windows 高精度時間函數(shù),并利用串口事件進行定時觸發(fā)的測量機制。 在測試軟件初始化時, 先利用QueryPerformanceFrequency()函數(shù)獲得機器內(nèi)部定時器的時鐘頻率,當(dāng)上機位測試軟件發(fā)出調(diào)轉(zhuǎn)命令后,記下系統(tǒng)時間記數(shù)值,同時隨動系統(tǒng)開始調(diào)轉(zhuǎn),當(dāng)隨動系統(tǒng)調(diào)轉(zhuǎn)到位后,再次記下系統(tǒng)時間記數(shù)值,最后把兩次系統(tǒng)記數(shù)值相減,得到記數(shù)差值。再測出計時頻率,根據(jù)下面的公式就可以計算出隨動系統(tǒng)的調(diào)轉(zhuǎn)時間
T=lCount/dfFreq
其中,T為時間(s);lCount 為兩次系統(tǒng)記數(shù)之差;dfFreg為處理器頻率。
下面是說明測試軟件的設(shè)計過程以及部分代碼。
進入測試軟件時,調(diào)用 QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)函數(shù),將系統(tǒng)頻率存儲在變量在 lpFrequency 中,其中,系統(tǒng)頻率是與硬件相關(guān)的。當(dāng)用戶按隨動 調(diào) 轉(zhuǎn) 按 鍵 時, 測 試 軟 件 發(fā) 出 隨 動 調(diào) 轉(zhuǎn) 命 令, 程 序 調(diào) 用QueryPerformanceCounter(LARGE_INTEGER *lpCount1),將系統(tǒng)計數(shù)值存儲在 lpCount1 變量中,隨動系統(tǒng)開始調(diào)轉(zhuǎn),不斷回傳當(dāng)前位置數(shù)據(jù),對接收到的隨動數(shù)據(jù)進行分析,如果發(fā)現(xiàn)回傳當(dāng)前位置數(shù)據(jù)跟目標位置一致(通常存在允許的系統(tǒng)誤差),就認為隨動系統(tǒng)調(diào)轉(zhuǎn)到位了?,F(xiàn)在再次調(diào)用 QueryPerformanceCounter(LARGE_INTEGER *lpCount2),將系統(tǒng)記數(shù)存儲在lpCount2 中,根據(jù)下面的公式,隨動系統(tǒng)的調(diào)轉(zhuǎn)時間
T= (lpCount2- lpCount1)/ lpFrequency×1 000
T為兩次記數(shù)之間所經(jīng)過的時間。
其中,lpCount2 和 lpCount1 分別是第一次和第二次系統(tǒng)記數(shù)結(jié)果;1 000是時間系數(shù),將時間單位換算為毫秒。
通過這種記時方式,測試軟件資源占用低,記時精度高,滿足了產(chǎn)品測試要求。
通過對定時方法的修改,數(shù)字式隨動系統(tǒng)大角度調(diào)轉(zhuǎn)指標測量精度得到很大程度的提高,在實際產(chǎn)品調(diào)試和交驗中得到總體單位和軍方的認可。其分辨精度可達到微秒,而測量誤差在包含串行通信延時和串口中斷響應(yīng)時間的情況下在20 ms以內(nèi),其中還包括隨動控制器對到位的判斷時間。與用示波器測量的速度曲線比較,有一個 50~100 ms固定的時間差,從實際系統(tǒng)控制原理上是可以解釋的。數(shù)字式隨動系統(tǒng)大角度0~180°和180~0°的調(diào)轉(zhuǎn)測試數(shù)據(jù)如表1。
表1 調(diào)轉(zhuǎn)時間指標測試
通過對WINDOWS定時器的定時精度、原理和機理分析,并結(jié)合數(shù)字式隨動系統(tǒng)大角度調(diào)轉(zhuǎn)時間測量方式和精度要求,設(shè)計出一種對數(shù)字式隨動系統(tǒng)大角度調(diào)轉(zhuǎn)時間進行準確測量的機制,實踐證明,采用該機制設(shè)計出的軟件運行穩(wěn)定,定時精度高,適應(yīng)性好,能夠滿足火炮數(shù)字式隨動系統(tǒng)的產(chǎn)品調(diào)試以及交驗的需要。
[1] 劉春鳳,田延嶺.Windows操作系統(tǒng)下的軟件定時器的設(shè)計與應(yīng)用[J].機電一體化,2004(5):38-41.
[2] 楊紫千,張繼永,岳陽.Windows消息機制及其在軟件系統(tǒng)設(shè)計中的應(yīng)用[J].艦船電子工程,2004(5):81-85.
[3] 周綠漪,秦衛(wèi)仕,柴力,等.MS Windows定時器性能分析及在定時-計數(shù)系統(tǒng)設(shè)計中的應(yīng)用[J].核電子學(xué)與探測技術(shù),2003(5):433-436.
[4] 劉欽彥,李勇.一種高精度定時器的設(shè)計及其應(yīng)用[J].電測與儀表,2001(9):32-34.
[5] 張志明,孫廣清,王磊.Windows下高精度定時的研究與實現(xiàn)[J].微型機與應(yīng)用,2003(1):55-57.
[6] 楊洋,李鐘慎,范偉.高精度數(shù)據(jù)采集系統(tǒng)定時器的仿真分析[J].華僑大學(xué)學(xué)報:自然科學(xué)版,2013(6):610-612.
(責(zé)任編輯 楊繼森)
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—),男,高級工程師,主要從事武器裝備理論與技術(shù)研究。
10.11809/scbgxb2015.08.027
袁江華,盛小波,劉虹.高精度定時器在數(shù)字式隨動系統(tǒng)測試中的應(yīng)用[J].四川兵工學(xué)報,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