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