潘 宇
(白城師范學(xué)院 物理學(xué)院, 吉林 白城 137000)
基于FPGA和STM32的脈寬頻率測(cè)量方法
潘 宇
(白城師范學(xué)院 物理學(xué)院, 吉林 白城 137000)
為準(zhǔn)確測(cè)量高頻信號(hào)的頻率,克服STM32F103輸入捕獲模式下測(cè)得頻率最高為80 kHz的缺點(diǎn)。提出用FPGA對(duì)高頻信號(hào)進(jìn)行分頻,用軟件編程調(diào)整分頻因子,將輸入高頻信號(hào)分頻到80 kHz以下,然后輸入給STM32F103,采用脈寬測(cè)量法測(cè)得頻率。為提高測(cè)量精度,采用多次采集,并冒泡排序,去掉部分最大、最小值,用剩余值取均值的濾波算法提高測(cè)量頻率的精度。最后將測(cè)量值與FPGA的分頻倍數(shù)相乘即可得到實(shí)際頻率。測(cè)試結(jié)果表明:該方法實(shí)現(xiàn)簡(jiǎn)單、測(cè)量精度高、頻率高,有一定的實(shí)用價(jià)值。
頻率測(cè)量; 脈寬測(cè)量法; 均值濾波算法; 分頻
在儀器儀表應(yīng)用中,經(jīng)常要檢測(cè)信號(hào)的頻率。目前,常用的檢測(cè)方法有以下幾種:① 閘門法,即1 s內(nèi)測(cè)得的信號(hào)跳變的次數(shù),由于毛刺等干擾信號(hào),會(huì)存在一定的誤差。② 等精度測(cè)量法,設(shè)置2個(gè)同步閥門,同時(shí)對(duì)測(cè)量信號(hào)和基準(zhǔn)信號(hào)進(jìn)行測(cè)量,其計(jì)數(shù)比就是頻率比。因?yàn)榛鶞?zhǔn)信號(hào)頻率已知,所以乘以頻率比就是測(cè)量信號(hào)的頻率。該方法對(duì)硬件電路設(shè)計(jì)要求較高,要求嚴(yán)格同步。③ 測(cè)量正脈寬方法,要求正脈寬的占空比已知,一般為50%。測(cè)得正脈寬的寬度后乘以2就是周期,對(duì)周期取倒數(shù),就可得到頻率[1-3]。
以上方法都要用到計(jì)數(shù)器,計(jì)數(shù)器的頻率與處理器的主頻相關(guān)。比如STM32F103,其主頻達(dá)到72 MHz,通過實(shí)驗(yàn)測(cè)試可知,用捕獲正脈寬的方法測(cè)試輸入信號(hào)的頻率時(shí),最高只能達(dá)到80 kHz。用其他處理器也會(huì)遇到這個(gè)問題。因此,為了有效提高測(cè)量信號(hào)的頻率,采用對(duì)高頻信號(hào)分頻的方法來降低頻率,通過FPGA的軟件編程實(shí)現(xiàn)任意分頻。又因?yàn)镕PGA技術(shù)發(fā)展迅速,主頻最高可以到GHz。因此將FPGA與STM32相結(jié)合,可使測(cè)量的頻率范圍大大提高,可達(dá)到幾十MHz甚至上百M(fèi)Hz。 為了進(jìn)一步提高測(cè)量的精確度,加入均值濾波算法,連續(xù)采集100次,然后冒泡排序,將最大值和最小值各去掉20個(gè),用剩余的60個(gè)取平均值。這樣就可有效去除干擾,大大提高測(cè)量頻率的精度。
1.1 設(shè)計(jì)框圖
系統(tǒng)設(shè)計(jì)框圖如圖1所示。圖中首先對(duì)輸入的信號(hào)分頻,分頻因子用VHDL編程語言實(shí)現(xiàn)。將分頻后得到的低頻信號(hào)輸入處理器STM32F103RBT6,采用正脈寬測(cè)量法和改進(jìn)的均值濾波算法測(cè)得該信號(hào)的頻率,將其通過串口送到電腦上顯示[4-8]。
圖1 系統(tǒng)框圖
1.2 FPGA分頻軟件設(shè)計(jì)
將要檢測(cè)的信號(hào)作為輸入信號(hào)輸入FPGA。分頻器就是將高頻信號(hào)進(jìn)行分頻,得到較低頻率的信號(hào)。分頻系數(shù)為
(1)
式中:Fin為輸入信號(hào)頻率;Fout為輸出信號(hào)頻率[9-12]。
在VHDL語言程序設(shè)計(jì)時(shí),定義一個(gè)N位的計(jì)數(shù)器,對(duì)輸入的時(shí)鐘脈沖進(jìn)行計(jì)數(shù),計(jì)數(shù)結(jié)果的第N-1位就是對(duì)輸入時(shí)鐘的2的N次冪分頻。將相應(yīng)的位數(shù)取出即可得到分頻時(shí)鐘。在VHDL下編寫的程序代碼如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY test IS
PORT (clk : IN STD_LOGIC;
clk_div2 : OUT STD_LOGIC;
clk_div4 : OUT STD_LOGIC;
clk_div8 : OUT STD_LOGIC;
clk_div16 : OUT STD_LOGIC);
END test;
ARCHITECTURE rtl OF test IS
SIGNAL count:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk)
BEGIN
IF (clk'event AND clk='1') THEN
IF(count="1111") THEN
Count <= (OTHERS =>'0');
ELSE
Count <= count +1;
END IF ;
END IF ;
END PROCESS;
clk_div2 <= count(0);
clk_div4 <= count(1);
clk_div8 <= count(2);
clk_div16 <= count(3);
END rtl;
上述代碼可實(shí)現(xiàn)2、4、8、16分頻。若想實(shí)現(xiàn)更高分頻,只需要適當(dāng)?shù)男薷膮?shù)即可。
1.3 STM32F103軟件設(shè)計(jì)流程圖
主控采用STM32F103RBT6,基于Cortex-M3內(nèi)核,是32位的微處理器。主頻為72 MHz,有TIM2、TIM3、TIM4、TIM5共4個(gè)通用定時(shí)器。每個(gè)定時(shí)器都有4個(gè)獨(dú)立的通道,這些通道都可以用來作為輸入捕獲通道使用。在軟件編程時(shí)使用TIM2的通道1作為檢測(cè)信號(hào)輸入端。串口與電腦相互連接,將測(cè)得的數(shù)值傳送到電腦上顯示。
軟件設(shè)計(jì)流程圖如圖2所示, 圖中將經(jīng)過FPGA分頻的檢測(cè)信號(hào)接入STM32的TIM2的通道1,首先初始化串口為460800,N,8,1.然后初始化定時(shí)器TIM2為輸入捕獲模式,采用1 MHz的頻率計(jì)數(shù),測(cè)到的計(jì)數(shù)初值剛好對(duì)應(yīng)的是1 μs,如果測(cè)到計(jì)數(shù)值是10,則為10 μs。當(dāng)檢測(cè)到上升沿時(shí)啟動(dòng)定時(shí)器計(jì)數(shù);當(dāng)捕獲到下降沿時(shí),停止計(jì)數(shù)。
圖2 軟件設(shè)計(jì)流程圖
1.4 初始化代碼
串口初始化代碼如下:
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整數(shù)部分
fraction=(temp-mantissa)*16; mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口時(shí)鐘
RCC->APB2ENR|=1<<14; //使能串口時(shí)鐘
GPIOA->CRH&=0XFFFFF00F;//IO狀態(tài)設(shè)置
GPIOA->CRH|=0X000008B0;//IO狀態(tài)設(shè)置
RCC->APB2RSTR|=1<<14; //復(fù)位串口1
RCC->APB2RSTR&=~(1<<14);//停止復(fù)位 USART1->BRR=mantissa; // 波特率設(shè)置
USART1->CR1|=0X200C; //1位停止,無校驗(yàn)位.
if EN_USART1_RX //如果使能了接收
USART1->CR1|=1<<5; //接收中斷使能 MY_NVIC_Init(3,3,USART1_IRQn,2);//設(shè)置中斷優(yōu)先級(jí)
endif
}
定時(shí)器2輸入捕獲初始化程序:
void TIM2_Cap_Set(u16 arr,u16 psc,u8 ch)
{
RCC->APB1ENR|=1<<0; //TIM2 時(shí)鐘使能
RCC->APB2ENR|=1<<2; //使能PORTA時(shí)鐘
TIM2->ARR=arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值
TIM2->PSC=psc; //預(yù)分頻器
switch (ch)
{
case 1: //select PA0 GPIOA->CRL&=0XFFFFFFF0; GPIOA->CRL|=0X00000008;
GPIOA->ODR|=0<<0;//PA0 下拉
TIM2->CCMR1|=1<<0;//CC1S=01 TIM2->CCMR1|=1<<4;
TIM2->CCMR1|=0<<2;
TIM2->CCER|=0<<1; /CC1P=0 BIT1=0 上升沿捕獲 BIT1=1 下降沿捕獲
TIM2->CCER|=1<<0; TIM2->DIER|=1<<1; //允許捕獲中斷CC1IE:BIT1=1 允許捕獲/比較1中斷 break;
}
TIM2->DIER|=1<<0; //允許更新中斷TIM2->CR1|=0x01; //使能定時(shí)器2
MY_NVIC_Init(2,0,TIM2_IRQn,2);
}
捕獲部分關(guān)鍵代碼:
if(TIM2CH1_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
{temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536;
temp+=TIM2CH1_CAPTURE_VAL;//得到總的高電平時(shí)間
printf("HIGH:%d us ",temp/72);//打印總的高點(diǎn)平時(shí)間
TIM2CH1_CAPTURE_STA=0;//開啟下一次捕獲
}
對(duì)上述代碼重復(fù)調(diào)用100次,得到100次的值,然后冒泡排序,去掉最大值和最小值各20個(gè),用剩余的值求均值,就可得到被測(cè)信號(hào)的周期,將其乘2取倒數(shù),就可得到頻率[13]。
2.1 FGPA分頻測(cè)試結(jié)果
在Quartus8.0下,用VHDL編程,并設(shè)置好相應(yīng)的參數(shù)后,仿真運(yùn)行,可得到如圖3所示[14-16]波形。在圖中,對(duì)輸入信號(hào)CLK分別實(shí)現(xiàn)了2、4、8和16分頻。
圖3 分頻圖
圖4所示是經(jīng)16分頻后輸入給STM32的80 kHz波形。用示波器測(cè)得的頻率是80 kHz,由于示波器誤差,占空比測(cè)得是50.4%,而實(shí)際是50%。
圖4 分頻后產(chǎn)生的80 kHz波形
2.2 頻率測(cè)試結(jié)果
在Keil下用C語言編程,將80 kHz的方波輸入給STM32的PA0,對(duì)PA0輸入信號(hào)進(jìn)行脈寬測(cè)量,并經(jīng)過改進(jìn)的均值濾波算法得到的頻率,通過串口助手顯示結(jié)果如圖5所示。從圖中可以看出,基本上沒有誤差。實(shí)際信號(hào)的頻率是:80×16=1 280 kHz。
圖5 串口顯示的測(cè)量頻率
本文提出了一種頻率檢測(cè)的新方法,為有效提高檢測(cè)頻率的范圍,采用高速FPGA軟件編程分頻的方法,將高頻信號(hào)頻率降低為低頻信號(hào)。輸入給STM32,利用STM32定時(shí)器的捕獲功能測(cè)量正脈寬的寬度,以此得到信號(hào)的周期,對(duì)其求倒數(shù)及得到頻率。為有效提高測(cè)量的精度,采用改進(jìn)的均值濾波算法,經(jīng)多次測(cè)量排序,并去除干擾比較大的數(shù)值后求均值,提高了測(cè)量的精度。經(jīng)測(cè)試,該方法能夠有效提高測(cè)量頻率的范圍,可測(cè)量較高的頻率,并且精度較高,有一定的實(shí)用價(jià)值。
[1] 應(yīng)毓海. FPGA 高精度測(cè)量頻率研究[J].低溫與超導(dǎo),2014,42(3):79-82.
[2] 陳壽法,王中鵬. 等精度頻率測(cè)量的同步門電路改進(jìn)設(shè)計(jì)[J]. 電測(cè)與儀表,2015,52(18): 90-95.
[3] 張?zhí)旌悖~ 偉. 基于SOPC的便攜式高精度頻率儀設(shè)計(jì)[J].儀表技術(shù)與傳感器,2015(5):34-37.
[4] 江 修,經(jīng)亞枝,張煥春.用等精度測(cè)頻方法實(shí)現(xiàn)振弦式傳感器頻率測(cè)量[J].傳感器技術(shù),2001,20(6):53-55.
[5] 黃國剛,陳 明,張 朋.聲表面波CO氣體傳感器高精度頻率測(cè)量研究[J]. 計(jì)算機(jī)測(cè)量與控制,2009,17(6):1033-1038.
[6] 沈 偉,王軍政,汪正軍.一種基于信號(hào)補(bǔ)償?shù)念l率測(cè)量方法[J].儀器儀表學(xué)報(bào),2010,31(10):2192-2197.
[7] 劉 婭, 李孝輝, 王玉蘭. 一種基于數(shù)字技術(shù)的多通道頻率測(cè)量系統(tǒng)[J]. 儀器儀表學(xué)報(bào),2009,30(9):1963-1968.
[8] 汪正軍,潘 磊,紀(jì)國瑞. 基于離散相位差檢測(cè)的頻率測(cè)量方法[J]. 儀器儀表學(xué)報(bào),2013,34(5):994-999.
[9] 梁文海,麥 文,張 健,等. 一種高精度頻率測(cè)量的研究與實(shí)現(xiàn)[J]. 四川師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2008,31(3): 376-378.
[10] 牟龍華,邢錦磊. 基于傅里葉變換的精確頻率測(cè)量算法[J].電力系統(tǒng)自動(dòng)化,2008, 32(23):67-70.
[11] 杜玉環(huán),郭迎清.基于LabVIEW的FFT光纖渦輪流量測(cè)量系統(tǒng)研究[J].儀表技術(shù)與傳感器,2015(11):56-58.
[12] 閆 珺, 王淑紅. 一種基于軟件鎖相環(huán)的電網(wǎng)頻率動(dòng)態(tài)檢測(cè)方法[J]. 電測(cè)與儀表,2015,52(24): 56-59.
[13] 李月琴,裴 麗.多級(jí)高精度可調(diào)諧的瞬時(shí)頻率測(cè)量方法[J].中國激光,2015,52(24): 1-8.
[14] 孟 卓,溫 和. 基于復(fù)化梯形的準(zhǔn)同步采樣頻率測(cè)量算法[J]. 中國電機(jī)工程學(xué)報(bào),2015,35(10): 2445-2453.
[15] 易 藝,岳慶英.基于FPGA的便攜式課外實(shí)驗(yàn)儀設(shè)計(jì)與實(shí)現(xiàn)[J]. 實(shí)驗(yàn)技術(shù)與管理,2016,33(1): 86-90.
[16] 薛海東, 郭迎清.基于DSP的高精度測(cè)頻方法與軟件設(shè)計(jì)[J]. 傳感器與微系統(tǒng),2016,35(1): 117-120.
Pulse Width Frequency Measurement Method Based on FPGA and STM32
PANYu
(Department of Physics, Baicheng Normal College, Baicheng 137000, Jilin, China)
In order to accurately measure the frequency of high frequency signals, overcome the shortcomings of the highest measured frequency is 80 kHz under the STM32F103 input capture mode. The paper proposed to use FPGA to divide the high frequency signal, and use software to adjust the factor of frequency division, the input high frequency signal can be divided and every component is below 80 kHz, then STM32F103 can measure them. In order to improve the measurement precision, we apply the repeated acquisition and bubble sorting, and then remove the maximum and minimum values, and take the average for the remaining values. The method improves the accuracy of frequency measurement. Finally, the measured value can be multiplied with the frequency division of FPGA to get the actual frequency. The test results show that the method is simple and has high precision and high frequency, it has certain practical value.
frequency measure; pulse width measurement; average filtering algorithm; frequency division
2016-05-12
潘 宇 (1982-), 男, 吉林白城人,碩士,講師, 主要研究方向:電子信息工程。
Tel.:15590795511; E-mail: 82048492@qq.com
TP 216
A
1006-7167(2017)02-0083-04