0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

頻率測量方法及STM32微控制器代碼示例介紹

玩轉(zhuǎn)單片機(jī)與嵌入式 ? 來源:玩轉(zhuǎn)單片機(jī)與嵌入式 ? 2023-11-04 14:24 ? 次閱讀

頻率測量是在電子通信領(lǐng)域中非常重要的任務(wù),用于確定信號的周期性和事件的發(fā)生率。

在本文中,我們將介紹兩種常用的頻率測量方法:計數(shù)法和周期法,并提供與STM32微控制器的示例代碼,以幫助你在實(shí)際應(yīng)用中進(jìn)行頻率測量。

計數(shù)法

計數(shù)法是最簡單的頻率測量方法之一,它通過直接計數(shù)事件發(fā)生的次數(shù),并與時間相關(guān)聯(lián)來計算頻率。

其原理如下: 首先,我們選擇一個時間窗口,通常使用計時器來測量。

時間窗口可以是任意合適的時間段,例如1秒。 在這個時間窗口內(nèi),我們記錄事件發(fā)生的次數(shù),這可以通過外部事件觸發(fā)器、傳感器或計數(shù)器來實(shí)現(xiàn)。

最后,我們使用以下公式計算頻率: 計數(shù)法的優(yōu)點(diǎn)是簡單易懂,適用于大多數(shù)應(yīng)用場景。對于STM32微控制器,你可以使用內(nèi)部計時器來實(shí)現(xiàn)計數(shù)法。

以下是一個基本的STM32代碼示例,用于頻率測量:

#include "stm32f4xx.h"


int main() {
    // 初始化時鐘和計時器
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    TIM_InitStruct.TIM_Prescaler = 84 - 1; // 設(shè)置預(yù)分頻器,使計時器頻率為1 MHz
    TIM_InitStruct.TIM_Period = 1000000 - 1; // 設(shè)置定時器周期為1秒
    TIM_TimeBaseInit(TIM2, &TIM_InitStruct);


    // 啟動計時器
    TIM_Cmd(TIM2, ENABLE);


    // 初始化事件計數(shù)器
    uint32_t eventCount = 0;


    while (1) {
        if (/*檢測事件發(fā)生*/) {
            eventCount++;
        }


        if (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update)) {
            // 時間窗口結(jié)束,計算頻率
            float frequency = (float)eventCount / 1.0;
            // 重置計數(shù)器和標(biāo)志
            eventCount = 0;
            TIM_ClearFlag(TIM2, TIM_FLAG_Update);
        }
    }
}

周期法

周期法是另一種常用的頻率測量方法,特別適用于周期性信號的測量。

其原理如下: 我們首先測量一個完整的信號周期所需的時間。這可以通過檢測信號的上升沿或下降沿來實(shí)現(xiàn)。

然后,使用以下公式來計算頻率: 周期法對于周期性信號非常有效,因為它提供了更高的測量精度。

在STM32中,你可以使用外部中斷或捕獲模式來實(shí)現(xiàn)周期法。

以下是一個簡單的STM32代碼示例,用于周期法測量:

#include "stm32f4xx.h"


// 定義全局變量來存儲周期時間
uint32_t periodTime = 0;


// 外部中斷初始化函數(shù)
void EXTI_Config(void) {
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;


    // 使能外部中斷線
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // 使用GPIOA引腳0


    // 配置外部中斷線0
    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 可以根據(jù)信號的邊沿配置
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStruct);


    // 配置外部中斷中斷向量
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}


// 外部中斷中斷處理函數(shù)
void EXTI0_IRQHandler(void) {
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
        static uint32_t startTime = 0;
        uint32_t endTime = 0;


        if (startTime == 0) {
            startTime = TIM_GetCounter(TIM2);
        } else {
            endTime = TIM_GetCounter(TIM2);
            periodTime = endTime - startTime;
            startTime = endTime;
        }


        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}


int main() {
    // 初始化時鐘和定時器
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    TIM_InitStruct.TIM_Prescaler = 84 - 1; // 設(shè)置預(yù)分頻器,使計時器頻率為1 MHz
    TIM_InitStruct.TIM_Period = 0xFFFFFFFF; // 最大定時器周期
    TIM_TimeBaseInit(TIM2, &TIM_InitStruct);


    // 啟動定時器
    TIM_Cmd(TIM2, ENABLE);


    // 初始化外部中斷
    EXTI_Config();


    while (1) {
        // 在外部中斷中測量一個完整信號周期的時間


        // 計算頻率
        float frequency = 1000000.0 / (float)periodTime; // 1秒 = 1000000微秒
    }
}



無論你選擇計數(shù)法還是周期法,都可以根據(jù)你的應(yīng)用需求來選擇最適合的方法。

在STM32微控制器中,你可以根據(jù)不同的外部硬件和引腳配置來實(shí)現(xiàn)頻率測量。








審核編輯:劉清
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7399

    瀏覽量

    150675
  • 傳感器
    +關(guān)注

    關(guān)注

    2542

    文章

    50310

    瀏覽量

    750325
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10849

    瀏覽量

    353896
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    1992

    瀏覽量

    60983
  • 頻率測量
    +關(guān)注

    關(guān)注

    1

    文章

    35

    瀏覽量

    12441

原文標(biāo)題:頻率測量方法及 STM32 代碼示例

文章出處:【微信號:玩轉(zhuǎn)單片機(jī)與嵌入式,微信公眾號:玩轉(zhuǎn)單片機(jī)與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    無刷控制器好壞的測量方法

    對無刷控制器好壞的測量方法一、 斷電檢測(用二極管檔)1、 檢測控制器電源輸入正負(fù)極早否短路2、 檢測控制器繞組線參數(shù):A、 用黑表筆接電源正極,用紅表筆分別接觸黃、綠、蘭三根繞阻線,
    發(fā)表于 10-24 22:36

    基于微控制器的功率控制器示例

    使用MIC5013 MOSFET預(yù)驅(qū)動設(shè)計和構(gòu)建的基于微控制器的功率控制器示例
    發(fā)表于 05-22 09:06

    如何通過STM32微控制器測量IDD?

    以上,而在數(shù)據(jù)表中我看到 MCU 應(yīng)該在 STOP2 模式下支持 1uA 左右。 在關(guān)于 IDD 測量的電路板數(shù)據(jù)表 UM2206 Rev 3 中寫道:IDD 測量用于測量 STM32
    發(fā)表于 12-27 06:08

    ADC測量微控制器內(nèi)部溫度傳感示例

    應(yīng)用:ADC測量微控制器內(nèi)部溫度傳感示例碼 BSP 版本: M051系列 BSP CMSIS v3.01.001 硬件:Nutini-EVB-M051_V3.0
    發(fā)表于 08-23 06:21

    ADC測量微控制器內(nèi)部溫度傳感示例

    應(yīng)用:ADC測量微控制器內(nèi)部溫度傳感示例碼 BSP 版本: M051系列 BSP CMSIS v3.01.001 硬件:Nutini-EVB-M051_V3.0
    發(fā)表于 08-30 06:15

    頻率測量方法的改進(jìn)

    頻率測量方法的改進(jìn)
    發(fā)表于 10-14 16:41 ?20次下載
    <b class='flag-5'>頻率</b><b class='flag-5'>測量方法</b>的改進(jìn)

    基于ST公司的STM32微控制器系列在音頻方面的應(yīng)用源代碼

    基于ST公司的STM32微控制器系列在音頻方面的應(yīng)用源代碼。
    發(fā)表于 05-20 16:29 ?7次下載

    《振南電子STM32視頻教程》第一講:ARM處理STM32微控制器

    [第1講] ARM處理STM32微控制器,由何強(qiáng)主講。本課主要講解:(1).ARM處理家族;(2).ARM Cortex-M3的應(yīng)用介紹
    發(fā)表于 10-09 15:32 ?2209次閱讀

    如何用微控制器測量電容

    微控制器廣泛用于測量各種物理變量。測量中涉及的技術(shù)對于單個變量類型可能有所不同,并且主要基于要測量的變量的特性。本教程介紹了一些使用
    的頭像 發(fā)表于 12-06 14:54 ?2866次閱讀
    如何用<b class='flag-5'>微控制器</b><b class='flag-5'>測量</b>電容

    液位開關(guān)控制器測試測量方法

    液位開關(guān)控制器測試測量方法:在工業(yè)生產(chǎn)過程中,常常需要測量兩種介質(zhì)的分界面的高度,如氣-----液分界面(統(tǒng)稱液位),夜-------液分界面的告訴(統(tǒng)稱界面),氣--------固分界面的高度(統(tǒng)稱料物)等,統(tǒng)稱為物位
    發(fā)表于 06-11 10:12 ?2080次閱讀

    如何使用微控制器測量電容

    微控制器已不是新興事物,對于微控制器,大家或許都有所了解。在往期文章中,小編對微控制器做過一定介紹。為進(jìn)一步增進(jìn)大家對微控制器的了解,本文將
    的頭像 發(fā)表于 06-27 16:04 ?3408次閱讀
    如何使用<b class='flag-5'>微控制器</b><b class='flag-5'>測量</b>電容

    AN4246_STM32L1 微控制器上的專有代碼讀取保護(hù)

    AN4246_STM32L1 微控制器上的專有代碼讀取保護(hù)
    發(fā)表于 11-21 08:11 ?0次下載
    AN4246_<b class='flag-5'>STM32</b>L1 <b class='flag-5'>微控制器</b>上的專有<b class='flag-5'>代碼</b>讀取保護(hù)

    AN5347_ STM32WB系列微控制器的指令示例

    AN5347_ STM32WB系列微控制器的指令示例
    發(fā)表于 11-21 08:11 ?0次下載
    AN5347_ <b class='flag-5'>STM32</b>WB系列<b class='flag-5'>微控制器</b>的指令<b class='flag-5'>示例</b>

    AN5379_ STM32WB系列微控制器的指令示例

    AN5379_ STM32WB系列微控制器的指令示例
    發(fā)表于 11-21 08:11 ?2次下載
    AN5379_ <b class='flag-5'>STM32</b>WB系列<b class='flag-5'>微控制器</b>的指令<b class='flag-5'>示例</b>

    AN4758_STM32L4xx微控制器上的專有代碼讀保護(hù)

    AN4758_STM32L4xx微控制器上的專有代碼讀保護(hù)
    發(fā)表于 11-21 08:11 ?0次下載
    AN4758_<b class='flag-5'>STM32</b>L4xx<b class='flag-5'>微控制器</b>上的專有<b class='flag-5'>代碼</b>讀保護(hù)