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