找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1906|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

不使用定時(shí)器T的頻率測(cè)量程序(基于stc32g12k128單片機(jī))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
    學(xué)習(xí)時(shí)發(fā)現(xiàn),stc32g12k128單片機(jī)的功能蠻強(qiáng)大的,這里給出了一個(gè)不使用定時(shí)器T的頻率測(cè)量方法,所謂不使用定時(shí)器T,一方面可以理解為省出了定時(shí)器T。方便給其它任務(wù)使用,另一方面可以理解為,這個(gè)程序里沒(méi)有定時(shí)。它采用的是頻率比較法測(cè)定脈沖信號(hào)的頻率,就是把一個(gè)被測(cè)信號(hào)與一個(gè)已知頻率的信號(hào)做比較,從而測(cè)出其頻率。就是對(duì)已知頻率信號(hào)和被測(cè)信號(hào)同時(shí)進(jìn)行計(jì)數(shù),在適當(dāng)?shù)臅r(shí)侯(非定時(shí))同時(shí)停止計(jì)數(shù),比較兩個(gè)計(jì)數(shù)的結(jié)果,計(jì)算出被測(cè)信號(hào)的頻率。這個(gè)已知頻率的信號(hào)由pwmb時(shí)鐘給出,并且可以通過(guò)調(diào)整其頻率,改變系統(tǒng)的測(cè)量范圍,其中向下擴(kuò)展范圍還是挺有用的。為方便使用,程序中加入了兩個(gè)測(cè)量范圍擴(kuò)展常數(shù),通過(guò)設(shè)定常數(shù)可以分別獲得測(cè)量范圍向上或向下的擴(kuò)展。其中向上擴(kuò)展要受芯片IO口速度和系統(tǒng)運(yùn)行速度的影響。擴(kuò)展空間不是太大。另外注意不要同時(shí)使用兩個(gè)擴(kuò)展常數(shù),否則不僅作用會(huì)抵消一些,而且影響精度。做為一般測(cè)量,這個(gè)程序還是比較方便的,但對(duì)精度要求很高時(shí),建議對(duì)程序中的數(shù)學(xué)計(jì)算公式進(jìn)行優(yōu)化,否則,會(huì)由于mcu在計(jì)算時(shí)對(duì)小數(shù)部分的切割,產(chǎn)生不少誤差。頻率擴(kuò)展常數(shù)在頭文件mcu_initial.h中設(shè)置。
    筆者是個(gè)新人,不當(dāng)之處,歡迎各位大神批評(píng)指正。
本程序是基于stc32g12k128的頻率測(cè)量程序。在降龍棍核心板和屠龍刀核心板驗(yàn)證通過(guò)。

    下面給出主程序,完整程序在附件中。本程序使用的是jlxlcd12864單色液晶屏,使用其它屏的朋友需要自己更換驅(qū)動(dòng)函數(shù)。

mcu_initial.h
#ifndef _mcu_initial_h_
#define _mcu_initial_h_
#define sysclk0 33177600//系統(tǒng)時(shí)鐘
//未擴(kuò)展前基礎(chǔ)測(cè)量范圍是2000HZ——2.7MHZ,不要同時(shí)向兩個(gè)方向擴(kuò)展,效果會(huì)抵消不說(shuō),還要影響測(cè)量精度,另外,對(duì)精度要求高時(shí)應(yīng)對(duì)相應(yīng)的計(jì)算公式做優(yōu)化,可減少由MCU計(jì)算產(chǎn)生的誤差(計(jì)算誤差主要在最終計(jì)算公式中由于小數(shù)被切除而產(chǎn)生)
#define up_freq 1//向上擴(kuò)展測(cè)量范圍倍數(shù)
#define down_freq 200//向下擴(kuò)展測(cè)量范圍比例,基礎(chǔ)是1
void mcu_initial(void);
        #endif


main.c
#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=1;//程序走向控制參數(shù),初值不影響測(cè)量結(jié)果
void main(void)
{
        unsigned int N,M;
        mcu_initial();
        initial_lcd();
        clear_screen();
transfer_chine_word(1,0,pin);
transfer_chine_word(1,16,lu);
N=up_freq-1;
M=down_freq-1;
PWMA_PSCRH=0;
PWMB_PSCRH=0;
        PWMB_PSCRL=M;//向下擴(kuò)展分頻器
        PWMA_PSCRL=N;//向上擴(kuò)展分頻器
//        cnt3=PWMA_PSCRL+1;
        PWMB_CR1=0x00;//關(guān)PWMB計(jì)數(shù)
        PWMB_SR1=0;//中斷標(biāo)志位清零
        PWMA_SR1=0;//中斷標(biāo)志位清零
        
        PWMA_CR1|=0x01; //使能計(jì)數(shù)器
        PWMA_IER=0x02;//開(kāi)捕獲中斷,用于捕獲第一次中斷
        while (1)
{        
        digit6_display(1,32,(cnt1*up_freq*((sysclk0*10)/(cnt2*down_freq+1)))/10);//輸出頻率單位HZ
        digit6_display(3,32,cnt1);//顯示捕獲計(jì)數(shù),正常測(cè)量下限,該值不能小于2,就是說(shuō),真正的測(cè)量下限捕獲計(jì)數(shù)是2
        digit6_display(5,32,cnt2);//顯示基準(zhǔn)信號(hào)計(jì)數(shù)值,要大于65535才是正常的

}
}
void PWMB_ISR() interrupt 27//開(kāi)捕獲中斷
{
                        PWMB_SR1=0;//中斷標(biāo)志位清零
        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)
{
        PWMA_CR1=0x00;//停止計(jì)數(shù)
        PWMB_CR1=0x00;//停止計(jì)數(shù)
        cnt2=(PWMB_CNTRH<<8)+PWMB_CNTRL;//讀計(jì)時(shí)器
        cnt2=cnt2+65535;
        cnt1=(PWMA_CCR1H<<8)+PWMA_CCR1L; //CCp1 捕獲值輸出
        //下一次測(cè)量的初始化
        PWMB_EGR|=0x01;//產(chǎn)生一次更新事件,可用來(lái)使計(jì)數(shù)器初始化,硬件自動(dòng)清零
        PWMA_EGR|=0x01;//產(chǎn)生一次更新事件,可用來(lái)使計(jì)數(shù)器初始化,硬件自動(dòng)清零
        PWMB_SR1=0;//中斷標(biāo)志位清零
        PWMA_SR1=0;//中斷標(biāo)志位清零
        PWMA_CR1|=0x01; //使能計(jì)數(shù)器
        PWMA_IER=0x02;//開(kāi)捕獲中斷,用于捕獲第一次中斷

}
else
{
        
        PWMB_CR1|=0x01; //使能計(jì)數(shù)器
        //PWMA_SR1=0;//中斷標(biāo)志位清零
        PWMA_IER=0;//關(guān)捕獲中斷
}
}


10HZ測(cè)量結(jié)果.png (3.82 MB, 下載次數(shù): 78)

10Hz測(cè)量結(jié)果,向下擴(kuò)展200時(shí)

10Hz測(cè)量結(jié)果,向下擴(kuò)展200時(shí)

Keil代碼.7z

26.56 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1039438 發(fā)表于 2022-10-15 08:14 | 只看該作者
對(duì)三個(gè)語(yǔ)句的注釋部分做了修改,之前誤用了舊程序的注釋?zhuān)浮?/td>
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表