一種脈沖輸入頻率測量方法
【專利摘要】本發明公開一種脈沖輸入頻率測量方法,用單片機接收到外部輸入的脈沖信號,讀取單位時間的脈沖個數N1,根據脈沖個數N1的多少自動調整捕捉脈沖頻率的周期時間,并根據輸入脈沖個數N1的不同采用不同長度的有效數組長度L1,從而能精確捕捉脈沖輸入的頻率。本發明可很好解決單片機資源緊張且CPU資源占用率較高的局限,采用本方法不用進入脈沖捕捉的中斷,很好的避免高速脈沖頻繁進入脈沖捕捉中斷的問題。本方法應用于變頻器的脈沖輸入頻率的調速功能,實際應用效果穩定可靠,精度高,很好的滿足應用要求。
【專利說明】一種脈沖輸入頻率測量方法
【技術領域】
[0001]本發明涉及工業測控【技術領域】,具體涉及一種基于單片機的脈沖輸入頻率測量方法。
【背景技術】
[0002]在工控系統中,經常需要測量各種脈沖輸入信號的頻率,例如通過測定變頻器的脈沖輸入頻率來實現調速功能。目前,單片機常用的脈沖輸入頻率測量方法有測頻法、測周法、多周期同步法等。測頻法相對測量時間較長,主要適用于高頻測量;測周相對測量速度快,主要應用于低頻測量,但其存在一個測量時鐘周期的固有誤差,影響測試精度;多周期同步法測試精度相對較高,但是測試實時性隨之降低。近年來,借助于嵌入式技術的不斷發展,模擬內插值法、游標法、相位補償法等測量方法不斷涌現,使測試精度不斷提高,但很多測量方法的測試原理實現復雜且占用系統資源較高。行業內迫切需要對現有脈沖輸入頻率測量方法進行革新,以實現更高效、更精確的測控。
【發明內容】
[0003]針對現有脈沖輸入頻率測量方法存在的上述缺陷,本發明提供一種精度高、占用系統硬件資源少、系統軟件利用率高、并能很好兼顧高頻和低頻的脈沖輸入頻率測量方法。
[0004]本發明的技術方案如下:
[0005]一種脈沖輸入頻率測量方法,包括以下步驟:
[0006]步驟一:將測定的輸入脈沖頻率范圍劃分多個連續的頻率區間,將這些頻率區間按照頻率從高到低的順序設為區間1`,區間2,…,區間η ;為所述每一頻率區間設定相應的周期時間,將這些周期時間以單片機內部定時器的基準時間的計數個數表示,對應設為計數個數tl,計數個數t2,…,計數個數tn ;根據所述頻率區間及周期時間,計算得到每一頻率區間在對應周期時間內的脈沖計數個數的范圍,將這些脈沖計數個數的范圍對應設為范圍1,范圍2,...,范圍η ;
[0007]步驟二:設定單片機的定時器,用外部脈沖輸入作為該定時器計數時鐘源,采集輸入脈沖的個數,在中斷優先級較高的定時器中斷中計時;當到達計數個數tl時,讀取捕捉到的脈沖的個數,如果讀取到的脈沖個數在范圍I內,則將讀取的計數個數和脈沖個數分別保存在、和NI中,并將頻率更新標志置起;如果讀取到的脈沖個數不在范圍I內,則將讀取的周期時間延長為計數個數t2 ;當到達計數個數t2時,讀取采集到的脈沖的個數,并以上述同樣的方式通過判斷脈沖個數的多少決定是否延長讀取的周期時間至計數個數t3 ;如不延長,則將讀取的計數個數和脈沖個數分別保存在、和NI中,并將頻率更新標志置起;否則,繼續延長讀取的周期時間;依次類推,直至讀取的周期時間延長至計數個數tn ;
[0008]步驟三:定義Nl_befor為當前NI的前一次的NI值;定義LI為Nl=Nl_befor時有效數組長度;定義f為輸入脈沖頻率值;定義Pluse_Array[]為用來存儲捕捉到脈沖個數NI的數組;定義Ll_sit為當前NI將要存放在數組Pluse_Array 口中的位置;定義Ll_sit%Ll為最早存儲NI數據的位置;定義flag=l為Ll_sit>Ll時的標志;定義sum為當前有效長度為LI長度內元素之和;定義有效數組長度Ll=4000/tN ;
[0009]若Nl=Nl_befor,且 Ll_sit>Ll 時,flag 為 I,否則 flag=0 ;當 flag 為 O 時,直接計算脈沖輸入的頻率f=(4000/tN)*Nl,并保存當前NI到Pluse_Array [Ll_sit]處^flag為I,計算當前數組LI長度內的元素之和sum, sum=當前數組內LI個元素之和sum+Nl值_L1_sit%Ll位置的值,并將當前NI值保存在Pluse_Array[Ll_sit%Ll]處,覆蓋原來的Pluse_Array [Ll_sit%Ll]的值,運算之后的sum值即是當前I秒內捕捉到輸入脈沖的個數,即輸入脈沖的頻率值f。
[0010]本發明的有益技術效果是:
[0011]一、本發明捕捉到的脈沖頻率的精度高,實際用信號發生器作為外部脈沖信號源,300KHZ誤差脈沖個數只有I個。
[0012]二、本發明占用的系統硬件資源少,輸入脈沖的捕捉只需要一個定時器。
[0013]三、本發明的系統軟件利用率高,不用因為脈沖的輸入捕捉而進中斷。
[0014]四、本發明計時的定時器通常不用單獨設定一個定時器,只用在優先級最高的定時器中斷中判斷間隔時間tl。
[0015]五、本發明能很好兼顧測量高頻和低頻的脈沖信號,捕捉脈沖頻寬高,實測最高頻率遠大于300KHz (且精度很好)。
【專利附圖】
【附圖說明】
[0016]圖1是脈沖輸入捕捉`時間根據脈沖頻率調整的流程圖。
[0017]圖2是根據計數個數tN和脈沖個數NI計算出對應脈沖頻率的流程圖。
【具體實施方式】
[0018]下面結合附圖對本發明的【具體實施方式】做進一步說明。
[0019]本發明用單片機接收到外部輸入的脈沖信號,讀取單位時間的脈沖個數NI,根據脈沖個數NI的多少自動調整捕捉脈沖頻率的周期時間,并根據輸入脈沖個數NI的不同采用不同長度的有效數組長度LI,從而能精確捕捉脈沖輸入的頻率。具體流程如下:
[0020](I)將測定的輸入脈沖頻率范圍劃分多個連續的頻率區間,將這些頻率區間按照頻率從高到低的順序設為區間1,區間2,…,區間η ;為每一頻率區間設定相應的周期時間,將這些周期時間以單片機內部定時器的基準時間的計數個數表示,對應設為計數個數tl,計數個數t2,…,計數個數tn ;根據頻率區間及周期時間,計算得到每一頻率區間在對應周期時間內的脈沖計數個數的范圍,將這些脈沖計數個數的范圍對應設為范圍1,范圍2,...,范圍η ;
[0021](2)設定單片機的一個定時器,用外部脈沖輸入作為該定時器計數時鐘源(通常單片機的計數時鐘源設定外部晶振時鐘經過PLL電路后作為時鐘源,而經過PLL電路后頻率一般非常高,可到幾十M到幾百ΜΗζ),用來采集輸入脈沖的個數,在中斷優先級較高的定時器中斷中計時,當到達計數個數tl時,讀取捕捉脈沖的個數,如果讀取到的脈沖個數在范圍I內,說明輸入的脈沖頻率比較高,則保存此讀取的計數個數tN和脈沖個數NI。如果讀取到的脈沖個數不在范圍I內,說明輸入的脈沖的頻率比較低,則讀取脈沖個數的周期時間延長為計數個數t2,當計數個數t2時間到時,再讀取脈沖個數判斷并判斷個數的多少,再決定是否延長讀取時間至計數個數t3,如不延長,則將讀取的計數個數和脈沖個數分別保存在、和附中,并將頻率更新標志置起,并清除計數個數。否則,繼續延長讀取的周期時間,直至延長至計數個數tn。在后續計算脈沖頻率流程中,根據、和NI值計算出輸入脈沖的頻率,從而能有效的精確測量到高速和低速脈沖的頻率。
[0022](3)在由周期內的計數個數、和周期內的脈沖個數NI轉換為脈沖頻率值時,也根據不同的情況采用不同的脈沖頻率換算方式,其具體流程為:
[0023]定義:
[0024]1:定義Nl_befor為當前NI的前一次的NI值。
[0025]2:定義LI為Nl=Nl_befor時有效數組長度。
[0026]3:定義f為輸入脈沖頻率值。
[0027]4:定義Pluse_Array[]為用來存儲捕捉到脈沖個數NI的數組。
[0028]5:定義Ll_sit為當前NI將要存放在數組Pluse_Array 口中的位置。
[0029]6:定義Ll_sit%Ll為最早存儲NI數據的位置。
[0030]7:定義 flag=l 為 Ll_sit>Ll 時的標志。
[0031]8:定義sum為當前有效長度為LI長度內元素之和。
[0032]有效數組長度Ll=4000/tN。當tN較小時(對應的脈沖輸入頻率較高),其對應的有效數組長度LI就長;當tN較大時(對應的脈沖輸入頻率較低),其對應的有效數組長度LI就短。
[0033]若Nl=Nl_befor,且 Ll_sit>Ll 時,flag 為 I,否則 flag=0。當 flag 為 O 時,直接計算脈沖輸入的頻率f=(4000/tN)*Nl,并保存當前NI到Pluse_Array [Ll_sit]處。若flag為1,計算當前數組LI長度內的元素之和sum,其sum=當前數組內LI個元素之和sum+Nl值-(Ll_sit%Ll位置的值),并將當前NI值保存在Pluse_Array[Ll_sit%Ll]處,覆蓋原來的Pluse_Array [Ll_sit%Ll]的值,此處運算之后的sum值即是當前I秒內捕捉到輸入脈沖的個數,即輸入脈沖的頻率值f。
[0034]圖1示出了上述步驟(2)的流程。如圖1所示,設定當輸入脈沖頻率為IkHz?32kHz時,為IOOms更新一次;當輸入脈沖頻率為IOHz?IkHz時,為500ms更新一次;當輸入脈沖頻率為O?IOHz時,為Is更新一次。
[0035]圖2示出了上述步驟(3)的流程。如圖2所示,根據脈沖計數周期時間的計數個數tN和脈沖個數NI計算出對應頻率值。
[0036]如圖1、圖2所示,運行方式為:在圖1中,設定定時器Tl的計數時鐘為外部輸入作為定時器Tl的計數時鐘,選取程序的中斷優先級最高的定時器250US中斷里面計數,當計數到計數個數tl=400時,表示計數周期時間到,周期時間為250us*400=100ms, IOOms時讀取定時器捕捉的脈沖個數,如果所采集的個數比較多,就保存當前的脈沖個數至NI和計數個數至tN,并在脈沖頻率計算的程序中由NI和tN的值根據相應的計算方式轉換為輸入脈沖的頻率值;當輸入脈沖頻率比較低時,在IOOms里面就會發現采集的脈沖個數比較少,就繼續計時,等到時間延長至計數個數t2=2000時(周期時間為250us*2000=500ms),再讀取采集的脈沖個數,保存輸入脈沖個數至NI和計數個數至tN。同理,當在500ms周期時間里面發現采集的脈沖個數比較小,就延長時間為計數個數t3=4000時(周期時間為250us*4000=ls)來讀取采集到的脈沖個數。在圖2中,在轉換為頻率時,根據不同的采集周期時間的計數個數tN采用不同的方式轉換為頻率值。每次保存脈沖個數NI和計數個數tN后,都將脈沖個數寄存器和250us的計數周期的計數個數寄存器清O,以便下次的判斷和脈沖個數的采集。
[0037]以下通過一個實施例對本發明的運行方式進行詳細說明:
[0038]在該實施例中,設測定輸入脈沖頻率范圍為Ohz~32Khz,則設定OHz~IOHz為每Is保存一次脈沖個數(對應250us個數計數值為4000),設定IOHz~IkHz為每500ms保存一次脈沖個數(對應250us個數計數值為2000),設定IkHz~32KHz為每IOOms保存一次脈沖個數(對應250us個數計數值為400),如表1所示。上述設定僅為參考,在其他實施例中,可根據實際應用,考量脈沖個數采集的周期時間。
[0039]表1:
[0040]
【權利要求】
1.一種脈沖輸入頻率測量方法,其特征在于,包括以下步驟: 步驟一:將測定的輸入脈沖頻率范圍劃分多個連續的頻率區間,將這些頻率區間按照頻率從高到低的順序設為區間1,區間2,…,區間η ;為所述每一頻率區間設定相應的周期時間,將這些周期時間以單片機內部定時器的基準時間的計數個數表示,對應設為計數個數tl,計數個數t2,…,計數個數tn ;根據所述頻率區間及周期時間,計算得到每一頻率區間在對應周期時間內的脈沖計數個數的范圍,將這些脈沖計數個數的范圍對應設為范圍1,范圍2,...,范圍η ; 步驟二:設定單片機的定時器,用外部脈沖輸入作為該定時器計數時鐘源,采集輸入脈沖的個數,在中斷優先級較高的定時器中斷中計時;當到達計數個數tl時,讀取捕捉到的脈沖的個數,如果讀取到的脈沖個數在范圍I內,則將讀取的計數個數和脈沖個數分別保存在、和NI中,并將頻率更新標志置起;如果讀取到的脈沖個數不在范圍I內,則將讀取的周期時間延長為計數個數t2 ;當到達計數個數t2時,讀取采集到的脈沖的個數,并以上述同樣的方式通過判斷脈沖個數的多少決定是否延長讀取的周期時間至計數個數t3 ;如不延長,則將讀取的計數個數和脈沖個數分別保存在、和附中,并將頻率更新標志置起;否則,繼續延長讀取的周期時間;依次類推,直至讀取的周期時間延長至計數個數tn ; 步驟三:定義Nl_befor為當前NI的前一次的NI值;定義LI為Nl=Nl_befor時有效數組長度;定義f為輸入脈沖頻率值;定義Pluse_Array[]為用來存儲捕捉到脈沖個數NI的數組;定義Ll_sit為當前NI將要存放在數組Pluse_Array 口中的位置;定義Ll_sit%Ll為最早存儲NI數據的位置;定義flag=l為Ll_sit>Ll時的標志;定義sum為當前有效長度為LI長度內元素之和;定義有效數組長度Ll=4000/tN ; 若Nl=Nl_befor,且Ll_sit>Ll時,flag為I,否則f Iag=O ;當flag為O時,直接計算脈沖輸入的頻率f=(4000/tN)*Nl,并保存當前NI到Pluse_Array[Ll_sit]處;若flag為1,計算當前數組LI長度內的元素之和sum, sum=當前數組內LI個元素之和sum+Nl值_L1_sit%Ll位置的值,并將當前NI值保存在Pluse_Array[Ll_sit%Ll]處,覆蓋原來的Pluse_Array [Ll_sit%Ll]的值,運算之后的sum值即是當前I秒內捕捉到輸入脈沖的個數,即輸入脈沖的頻率值f。
【文檔編號】G01R23/02GK103558454SQ201310545870
【公開日】2014年2月5日 申請日期:2013年11月6日 優先權日:2013年11月6日
【發明者】龔俊先, 葉志鈞, 任夢蕊 申請人:臺安科技(無錫)有限公司