該方法通過winapl函數(shù)訪問計算機高速系統(tǒng)計數(shù)器實現(xiàn)級計時,相對當前常用的幾種其他方法來說,此方法具有精度更高、實現(xiàn)更方便、程序更簡單的優(yōu)點。最后,討論了使用高速計時器可能出現(xiàn)的計數(shù)值上跳現(xiàn)象及解決方法。
86:a收穡日期:2002―隨著bbbbbbs2000的普及,使得在win-dow2000平臺上開發(fā)工業(yè)實時控制系統(tǒng)的應用軟件成為大勢所趨。但是,在bbbbbbs2000平臺上開發(fā)工控軟件,常常必須解決高精度計時方面的問題。
目前常用的解決方法為:⑴使用bbbbbbs中提供的常規(guī)定時器timer控件。這種方法相對簡單直接使用bbbbbbs的定應用程序中設(shè)置一個或多個定時時鐘。但是,由于受系統(tǒng)時鐘的限制,這種方法的精度很低,最多能達到55ms.而且,此方法所建立的定時器是由定時器消息wm-timer驅(qū)動的;但wm -timer在串行消息隊列中的優(yōu)先級很低,往往額外造成無法預料的較大定時誤差。因此,此方法弊端較多,在要求高精度或高實時性的工控程序設(shè)計中較少使用。
(2)使用多媒體定時器,調(diào)用用于多媒體定時的bbbbbbsapi函數(shù)來實現(xiàn)。使用bbbbbbs的多媒體擴展庫中的幾個定時函數(shù):(3)編寫驅(qū)動程序?qū)崿F(xiàn)精確計時。這種方法精度較高,但涉及到vxd或wdm方面的專門知識,有較大難度。
還有利用系統(tǒng)定時中斷,利用多線程機制等等方法,這些方法比較復雜,而且精度并未得到較大提高。所以,本文介紹利用bbbbbbs和queryperbbbb―ancecounter兩個函數(shù),方便簡單地實現(xiàn)ms級高精度計時。
1函數(shù)介紹如果計算機硬件支持,queryperbbbbancefie―quency函數(shù)可讀取計算機系統(tǒng)的計時器的頻率。
此頻率值依不同處理器而得到不同值,但在計算機運行時是穩(wěn)定不變的。
率的變量。如果計算機硬件不支持,這個參數(shù)可能值為0.返回值:如果計算機硬件支持,函數(shù)返回值為非0;如果機硬件不支持,函數(shù)返回值為0.如果計算機硬件支持,queryperbbbbancecou―nter函數(shù)讀取計算機系統(tǒng)計數(shù)器中的當前計數(shù)值。
器當前值的變量。如果計算機硬件不支持,這個參數(shù)可能值為0.返回值:如果計算機硬件支持,函數(shù)返回值為非0;如果計算機硬件不支持,函數(shù)返回值為0.函數(shù),這兩個函數(shù)有高得多的計時精度。
2程序設(shè)計這里以一高速電機瞬時轉(zhuǎn)速精確測量為實例,用vc++6.0編寫了一個簡單的應用程序來說明如何在bbbbbbs2000平臺上實現(xiàn)級高精度計時。
高速電機通過變速箱帶動一采樣盤轉(zhuǎn)動,采樣盤一周均勻分布了1000條采樣柵,變速箱速率比為1:10.即電機每轉(zhuǎn)動一周,外圍高速采樣電路就產(chǎn)生10000個計數(shù)脈沖,經(jīng)整形后送至電路上的累加器單元計數(shù)。
應用程序如下,主要給出高精度計時的實現(xiàn)部分,其他部分從簡。
前的計數(shù)值//計時結(jié)束后的計數(shù)值//換算后的計時ms值發(fā)請求命令至外圍采樣電路,將累加器清零并開始計采樣脈沖數(shù)發(fā)請求命令至外圍采樣電路,停止累加器計數(shù)發(fā)請求命令至外圍采樣電路,返回累加器計數(shù)值至變量ntotal //輸出計時結(jié)果//輸出轉(zhuǎn)速結(jié)果cstngstr2;表示從aa處運行到bb處共用時579ms,電機的瞬間轉(zhuǎn)速為5636.8轉(zhuǎn)/min.外圍采樣電路設(shè)計合理且采用高速元件,那么,兩次請求外圍電路的響應延遲時間所引起的計時誤差正負相反,基本可以抵消,總體誤差可以忽略。否則,必須經(jīng)過反復實際測試,得到一個補償常數(shù)e,在程序中對計時加以補償以減少誤差。
請求外圍電路的程序語句最好采用匯編語