|
使用mcu對(duì)脈沖頻率進(jìn)行測(cè)量有多種方法,最基本的是定時(shí)長(zhǎng)脈沖計(jì)數(shù)法和周期測(cè)量法。其中定時(shí)長(zhǎng)計(jì)數(shù)法適合高頻脈沖測(cè)量,其測(cè)量能力和精度由Mcu的端口速度和系統(tǒng)時(shí)鐘限定。周期測(cè)量法適合低頻端脈沖測(cè)量。這兩種方式在中間頻率上都存在明顯的誤差。
本例程給出了一種基于stc32g12k128的頻率測(cè)量方法。采用系統(tǒng)時(shí)鐘11059200HZ時(shí)適合頻率是200HZ——900KHZ。根據(jù)需要可以向高端或低端擴(kuò)展,是一種簡(jiǎn)單的寬頻率范圍的測(cè)量程序。
本例程在提高測(cè)量精度方面是從三個(gè)角度著手。一是兩端對(duì)齊,就像用尺子測(cè)量棍子時(shí)所做的,把棍子兩端與尺子的刻度對(duì)齊,方能測(cè)量準(zhǔn)確。在測(cè)量時(shí)把脈沖信號(hào)與時(shí)鐘信號(hào)正確對(duì)齊,來(lái)提高測(cè)量精度。二是采用雙精度時(shí)鐘,這與游標(biāo)卡尺的原理相似,一個(gè)大刻度尺子粗測(cè),一個(gè)小刻度尺子用來(lái)精測(cè)。三是增加測(cè)量時(shí)間長(zhǎng)度。取較長(zhǎng)的時(shí)間測(cè)量,可以使誤差相對(duì)去減小。
例程中使用PWMA的ccp1通道的外時(shí)鐘模式一對(duì)脈沖信號(hào)進(jìn)行計(jì)數(shù),信號(hào)輸入在P1.0口,定時(shí)器T0做主時(shí)間定時(shí),使用12T模式,初值為0,以獲得更多測(cè)量時(shí)長(zhǎng)。定時(shí)器T1進(jìn)行精測(cè)計(jì)時(shí),采用1T模式,以提高測(cè)量精度。利用PWMA的上升沿中斷來(lái)啟動(dòng)和結(jié)束計(jì)數(shù)和計(jì)時(shí),獲得好的對(duì)齊效果。
在需要向高頻端擴(kuò)展時(shí),可以提高系統(tǒng)時(shí)鐘頻率(如改為33177600)和對(duì)被測(cè)信號(hào)進(jìn)行分頻(當(dāng)前未開(kāi)分頻,可以分頻值為2—8分頻),把測(cè)量頻率的上限擴(kuò)展到20M以上,這時(shí)的限制在于mcu端口本身的速度。需要向低頻端擴(kuò)展時(shí),可以把T1定時(shí)器改為12T模式,測(cè)量頻率下限則為15HZ。
擴(kuò)展時(shí)還需要修改程序內(nèi)的兩個(gè)計(jì)算常數(shù)。如果想同時(shí)向兩個(gè)方向擴(kuò)展,則需要修改程序流程,增加頻段選擇的相關(guān)操作。
如果想進(jìn)一步提高測(cè)量精度,則需要采用外置高精度高穩(wěn)定度晶振。并對(duì)程序中影響測(cè)量精度的語(yǔ)句進(jìn)行補(bǔ)償(給T1定時(shí)器設(shè)一個(gè)初值)。相信該例程本身能夠滿足專業(yè)測(cè)量頻率的需要。
下面給出例程主體,包括主程序和配置程序。未列出的程序包括顯示屏的驅(qū)動(dòng)程序和各種頭文件。在附件中有完整程序供初學(xué)者參考和使用。
附圖中顯示屏上的第二行為被測(cè)頻率的計(jì)數(shù)值,第三行為兩個(gè)定時(shí)器的計(jì)數(shù)值之和。被測(cè)頻率的計(jì)數(shù)值會(huì)出現(xiàn)正負(fù)一個(gè)數(shù)的變動(dòng),定時(shí)器測(cè)量值也會(huì)隨之變動(dòng),但測(cè)結(jié)果不受影響。
單片機(jī)源程序如下:
#include "STC32G.H"
#include "stc32_12864driver.h"
#include "mcu_initial.h"
#include "initial_lcd.h"
#include "chinese_zhouqi.h"
unsigned long int cnt1=10,cnt2,cnt3;//cnt1的初值是為指示程序是否進(jìn)入測(cè)量狀態(tài)。cnt2,cnt3是調(diào)試時(shí)用到的參數(shù)
bit first=0;//程序走向控制參數(shù),初值不影響測(cè)量結(jié)果
void main(void)
{
mcu_initial();
initial_lcd();
clear_screen();
transfer_chine_word(1,0,pin);
transfer_chine_word(1,16,lu);
PWMA_SR1=0;//中斷標(biāo)志位清零
PWMA_CR1|=0x01; //使能計(jì)數(shù)器
PWMA_IER=0x02;//開(kāi)捕獲中斷,用于捕獲第一次中斷
while (1)
{
digit6_display(1,32,(cnt1*(1105920000/(cnt3+1)))/100);//輸出頻率
digit6_display(3,32,cnt1);//顯示精確捕獲計(jì)數(shù)
digit6_display(5,32,cnt3);//顯示總計(jì)時(shí)器值,該值以1T的精度顯示超過(guò)12T的定時(shí)計(jì)數(shù)值
}
}
void t0_isr() interrupt 1 //定時(shí)
{
TR1=1;
TR0=0;
PWMA_SR1=0;//中斷標(biāo)志位清零
PWMA_IER=0x02;//開(kāi)捕獲中斷,用于捕獲第二次中斷
}
void PWMA_isr() interrupt 26//用來(lái)啟動(dòng)和停止計(jì)數(shù)器,輸出測(cè)量數(shù)值
{
first=!first;
if(first)
{
TR1=0;//停定時(shí)器
cnt1=(PWMA_CCR1H<<8)+PWMA_CCR1L; //CCp1 捕獲值輸出
cnt2=(TH1<<8)+TL1;//讀計(jì)時(shí)器
/*
cnt2=TH1;
cnt2=(cnt2<<8);
cnt2=cnt2+TL1;
*/
cnt3=cnt2+(65535*12); //兩個(gè)定時(shí)器的計(jì)時(shí)值之和
//下一次測(cè)量的初始化
TL1 = 0x00; //設(shè)置定時(shí)初始值
TH1 = 0x00; //設(shè)置定時(shí)初始值
TL0 = 0x00; //設(shè)置定時(shí)初始值
TH0 = 0x00; //設(shè)置定時(shí)初始值
PWMA_EGR|=0x01;//產(chǎn)生一次更新事件,可用來(lái)使計(jì)數(shù)器初始化,硬件自動(dòng)清零
PWMA_SR1=0;//中斷標(biāo)志位清零
PWMA_IER=0x02;//開(kāi)捕獲中斷,用于捕獲第一次中斷
PWMA_CR1|=0x01; //使能計(jì)數(shù)器
}
else
{
TR0=1;//開(kāi)T0定時(shí)器
PWMA_SR1=0;//中斷標(biāo)志位清零
PWMA_IER=0;//關(guān)捕獲中斷
}
}
#include "mcu_initial.h"
#include "STC32G.H"
void mcu_initial(void)
{
P_SW1=0x04;//選擇P2.2,2.4,2.4.2.5輸出SPI
EAXFR = 1; //使能訪問(wèn) XFR
CKCON = 0x00; //設(shè)置外部數(shù)據(jù)總線速度為最快
WTST = 0x00; //設(shè)置程序代碼等待參數(shù),
P1M0=0x00; //P1配置為高阻,其中的P1.6為雙向。P1.0輸入被檢測(cè)脈沖
P1M1=0xbf;
P2M0=0xFF;//P2為推挽,其實(shí)雙向模式也可
P2M1=0x00;
P3M1|=0x04;
P3M0&=0xfb;//把P3.2設(shè)置為高阻端,用于外部模式二輸入被測(cè)信號(hào),本程序中沒(méi)用到
AUXR &= 0x7F; //定時(shí)器0時(shí)鐘12T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0; //設(shè)置定時(shí)初始值
TH0 = 0; //設(shè)置定時(shí)初始值4ms,11M
TF0 = 0; //清除TF0標(biāo)志
AUXR |= 0x40; //定時(shí)器1時(shí)鐘1T模式
TMOD &= 0x0F; //設(shè)置定時(shí)器T1模式
TL1 = 0x00; //設(shè)置定時(shí)初始值
TH1 = 0x00; //設(shè)置定時(shí)初始值
TF1 = 0; //清除TF1標(biāo)志
HSSPI_CFG2=0X20;//開(kāi)高速SPI模式,方便使用33M時(shí)鐘
SPSTAT=0x00;
SPCTL=0xd3;
MCLKOCR=0x82;//P1.6輸出2分頻系統(tǒng)時(shí)鐘,提供一個(gè)方便的測(cè)試信號(hào)源
//外部模式一
PWMA_PS=0x00;//選擇P1.0輸入外部信號(hào)
PWMA_CCER1=0x00;//關(guān)cc1通道,準(zhǔn)備寫(xiě)CCMR1
PWMA_CCMR1=0x01;//PWMA_CCMR1.CC1S=01//IC1映射在TI1FP1上。設(shè)置為輸入模式,關(guān)濾波,關(guān)預(yù)分頻器
PWMA_CCER1=0X01;//選擇cc1p上升沿極性.使能cc1p
PWMA_SMCR=0x57;//選中外部觸發(fā)輸入。上升沿觸發(fā),復(fù)位模式,輸入通道在TI1FP1,資料參考值為0x57
PWMA_SR1=0;//中斷標(biāo)志位清零
PWMA_SR2=0;//重復(fù)捕獲中斷標(biāo)志位清零
EA=1;
ET0=1;
}
|
-
8400HZ.jpg
(296.3 KB, 下載次數(shù): 115)
下載附件
2022-10-9 16:28 上傳
信號(hào)源設(shè)置8400HZ顯示
-
8400.png
(19.75 KB, 下載次數(shù): 112)
下載附件
2022-10-9 16:28 上傳
信號(hào)源設(shè)置8400HZ示波器顯示
-
3Whz.jpg
(435.5 KB, 下載次數(shù): 117)
下載附件
2022-10-9 16:31 上傳
信號(hào)源設(shè)置3萬(wàn)HZ顯示
-
3W.jpg
(5.04 MB, 下載次數(shù): 112)
下載附件
2022-10-9 16:32 上傳
信號(hào)源設(shè)置3萬(wàn)HZ示波器顯示
-
30W.jpg
(355.44 KB, 下載次數(shù): 111)
下載附件
2022-10-9 16:34 上傳
30萬(wàn)測(cè)量顯示
-
240HZ.jpg
(448.83 KB, 下載次數(shù): 126)
下載附件
2022-10-9 16:35 上傳
240HZ測(cè)量顯示
-
-
Keil代碼.7z
2022-10-9 19:30 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
49.02 KB, 下載次數(shù): 26, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|