在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何利用外部中斷和定時器測量信號頻率?

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2021-03-29 14:19 ? 次閱讀

摘要:利用定時器產生PWM波。然后利用32的外部中斷和定時器來測量32輸出的波形硬件:STM32F103C8T6核心板、示波器、串口調試助手所用到的的引腳為PA8和PA0。測量方案:在第一次外部中斷(上升沿觸發)到之時,開啟定時器,同時計數器清零。然后等待第二次中斷到來,在第二次外部中斷(上升沿觸發)到之時,獲取計數器的計數值,同時關閉計數器。因為知道了計數器計數一個數的時間,所以在第二次外部中斷(上升沿觸發)到之時,獲取計數器的計數值,通過這個值就知道一個脈沖的時間周期。時間周期的倒數就是外部信號的頻率。

一、利用TIM1的CH1產生PWM波pwm.c

#include “pwm.h” void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外設時鐘使能 //設置該引腳為復用輸出功能,輸出TIM1 CH1的PWM脈沖波形

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; //輸出PWM的頻率為200 000/100=2 000 HZ=2K 實際示波器測量

2.00055K TIM_TimeBaseStructure.TIM_Prescaler =psc; //驅動(單片機提供給)計數器的時鐘是72 000 000/36 0=200kHZ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能 TIM_OCInitStructure.TIM_Pulse = 3600; //設置待裝入捕獲比較寄存器的脈沖值 這個值要為arr:自動重裝值的一半,占空比才為50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高 TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根據TIM_OCInitStruct中指定的參數初始化外設TIMx

TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主輸出使能 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1預裝載使能 TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的預裝載寄存器 TIM_Cmd(TIM1, ENABLE); //使能TIM1 }pwm.h

#ifndef __PWM_H #define __PWM_H #include “sys.h” void TIM1_PWM_Init(u16 arr,u16 psc); #endifmain.c

#include “delay.h” #include “sys.h” #include “pwm.h” int main(void) { delay_init(); //延時函數初始化 //10k 7199 //20k 3599 //8k 8999 TIM1_PWM_Init(7199,0); //不分頻,輸出PWM頻率=72000K/(7199+1)=10Khz while(1) { } }定時器1的通道1對應的是PA8引腳,連接示波器可以測出波形

二、將PA8與PA0相連接這里利用PA8輸出的PWM波形讓PA0外部中斷引腳測量。

三、外部中斷和定時器測量頻率在配置定時器時最重要的就是配置定時器的預分頻系數和重裝載值。定時器的本質就是一個計數器,計數到我們設定的值后就會溢出,也就是重新從0開始開始計數。設置預分頻系數就是設置計數器的頻率,假設為71,F1的系統時鐘為72M,經過72分頻,給計數器的時鐘頻率就是1M,周期就是1/1M=1us。也是就1us計一個數。那么計幾個數呢?這就要看重裝載值ARR,這里我們設置為0XFFFF,也就是計數65536個數,就是計滿整個寄存器的值。為什么要分頻系數為72,重裝載值為0XFFFF?這里給出詳細的分析過程。

1 為什么要分頻系數為72F1的系統時鐘為72M,F1的系統時鐘為72M,如果不分頻的話,提供給定時器的時鐘就直接是72MHZ。72MHz是個什么概念?72MHz它對應的周期就是(1/72000000)秒,也就是計數器從0計數到最大值65535,只需要花費(65535/72000000)秒≈1ms。這句話的意思就是如果你不分頻,計數器最大只能定時1ms。那么你的定時器每隔1ms就會溢出一次。如果經過72分頻,給計數器的時鐘頻率就是1M,周期就是1/1M=1us,也是就1us計一個數。換句話就是可以采樣的波形頻率為1M,提高了采樣頻率。另一方面也是容易計算,計一個數1us,計count個數就是count個us,頻率就是1000000/count(HZ)。

2 為什么要重裝載值為0XFFFF最大采樣間隔是跟定時器的中斷間隔相關的,定時器產生溢出中斷后計數值CNT會自動清0,定時器的中斷間隔由分頻系數Prescaler和自動重裝載寄存器Period決定,分頻系數前面已經確定,那最大采樣間隔只需要考慮自動重裝載寄存器Period的設置,比如頻分析系數71,自動重裝寄存器值65535,則中斷間隔=65536/72000000/72=65.536ms,即最大采樣間隔65.536ms,如果65.536ms內沒有檢測到一個脈沖,則這么設定間隔是不合理的,必須想辦法犧牲最小的采樣時間1us(擴大分頻系數)或者擴大自動重裝寄存器值(16位《65535)來增加定時器中斷間隔,也可以編寫自己的應用函數來計算溢出的定時時間。一般來說我們使用外部中斷是不需要用到定時器的,看原子和野火的外部中斷實驗也沒有用到外部中斷。但是現在不是利用外部中斷簡單的處理一件事,而是利用外部中斷測量頻率,而測頻率就涉及到時間,而只要涉及到時間,就需要用到定時器了。測量外部信號的頻率,就是測量PWM波對吧!如果我們測量到一個周期的時間,那么不就知道了信號的頻率了嗎?

測量方案:在第一次外部中斷(上升沿觸發)到之時,開啟定時器,同時計數器清零。然后等待第二次中斷到來,在第二次外部中斷(上升沿觸發)到之時,獲取計數器的計數值,關閉計數器。因為我們知道了計數器計數一個數的時間,所以我們到在第二次外部中斷(上升沿觸發)到之時,獲取計數器的計數值,通過這個值就知道一個脈沖的時間周期。時間周期的倒數就是外部信號的頻率。

具體代碼如下:

void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)!= RESET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI0線路掛起位 if(CaptureNumber == 0)//第1次上升沿觸發 { TIM_Cmd(TIM2,ENABLE);//使能定時器2 TIM_SetCounter(TIM2,0); //清零計數器的值,因為一開始就開始計數了 CaptureNumber++; }

else if(CaptureNumber==1)//第2次上升沿觸發 { TimeCntValue = TIM_GetCounter(TIM2); Capture = TimeCntValue; CaptureNumber = 0; TIM_Cmd(TIM2,DISABLE);//使能定時器2 } } } int main(void) { float x; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(); uart_init(115200); TIM2_Init(); TIM1_PWM_Init(7199,0); //不分頻,輸出PWM頻率=72000K/(7199+1)=10Khz EXTIA0_Init(); while(1) { printf(“Fre=%.2f kHz ”,1000000/Capture); delay_ms(1000); } }當然你可能覺得這只是測量信號的一個周期脈沖不夠準確,那么也可以測量100次脈沖的時間再除以100,就是一個脈沖的時間,然后再取倒數就可以算出頻率,這種方法也是可以的。具體代碼如下:

void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)!= RESET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI0線路掛起位 if(CaptureNumber == 0)//第1次上升沿觸發 { TIM_Cmd(TIM2,ENABLE);//使能定時器2 TIM_SetCounter(TIM2,0); //清零計數器的值,因為一開始就開始計數了 CaptureNumber++; } else if(CaptureNumber》0&& CaptureNumber《100) { TimeCntValue0 = TIM_GetCounter(TIM2); CaptureNumber++; } else if(CaptureNumber==100)//第100次上升沿觸發 { TimeCntValue = TIM_GetCounter(TIM2); Capture = TimeCntValue/100; CaptureNumber = 0; TIM_Cmd(TIM2,DISABLE);//使能定時器2 } } }

int main(void) { float x; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(); uart_init(115200); TIM2_Init(); TIM1_PWM_Init(7199,0); //不分頻,輸出PWM頻率=72000K/(7199+1)=10Khz EXTIA0_Init(); while(1) { printf(“Fre=%.2f kHz ”,1000000/Capture); delay_ms(1000); } }程序流程圖

26aa9646-8ecc-11eb-8b86-12bb97331649.png

當然測量信號頻率的方法可以直接利用TIM的輸入捕獲的方法就可以實現。用外部中斷只是另一種測量方案,具體用哪一種還要看具體情況。

原文標題:利用外部中斷和定時器測量信號頻率

文章出處:【微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2290

    文章

    11018

    瀏覽量

    362700
  • 定時器
    +關注

    關注

    23

    文章

    3289

    瀏覽量

    117354

原文標題:利用外部中斷和定時器測量信號頻率

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    第十二章 SysTick——系統定時器

    本章介紹了W55MH32的SysTick系統定時器,它是24位遞減計數,含4個寄存,可配置定時中斷,用于產生時基 等。
    的頭像 發表于 05-22 17:16 ?343次閱讀
    第十二章 SysTick——系統<b class='flag-5'>定時器</b>

    MCU定時器/計數

    RISC-V核低功耗MCU通過靈活的定時器架構、低功耗模式適配及硬件級中斷優化,在工業控制、智能家居等場景中實現高精度計時與能耗控制的協同設計,滿足復雜任務調度與實時響應的雙重需求?。 一、?硬件
    的頭像 發表于 04-27 13:54 ?189次閱讀

    STM32G474HRTIM使用HRTIM配置了主定時器中斷,為啥調試的跳轉到硬件中斷,進不去定時器中斷,為什么?

    各位大佬,我使用HRTIM配置了主定時器中斷,為啥調試的跳轉到硬件中斷,進不去定時器中斷 下面是我的初始化代碼
    發表于 03-13 08:17

    串口中斷是內部中斷還是外部中斷,串口中斷是怎么觸發的

    串口中斷通常被視為外部中斷。雖然串口控制(如USART、UART等)可能集成在微控制或處理
    的頭像 發表于 01-29 15:03 ?1516次閱讀

    AN-644:在微型轉換上使用定時器2進行頻率測量(uC013)

    電子發燒友網站提供《AN-644:在微型轉換上使用定時器2進行頻率測量(uC013).pdf》資料免費下載
    發表于 01-13 17:31 ?0次下載
    AN-644:在微型轉換<b class='flag-5'>器</b>上使用<b class='flag-5'>定時器</b>2進行<b class='flag-5'>頻率</b><b class='flag-5'>測量</b>(uC013)

    是德KEYSIGHT53200A 系列射頻/通用頻率計數器/定時器

    是德KEYSIGHT53200A系列射頻/通用頻率計數器/定時器 53200A頻率計數器能在研發和制造中進行快速、精確頻率和時間間隔測量
    的頭像 發表于 12-01 22:52 ?572次閱讀

    基于555電路的頻率發生

    RS觸發,配合外部的電阻和電容,可以構成多諧振蕩,從而產生方波信號。通過調整外部電阻和電容的值,可以改變輸出方波的
    的頭像 發表于 11-12 10:35 ?1300次閱讀

    定時器自動控制開關怎么設置

    的工作原理 定時器自動控制開關的工作原理基于時間控制。它通過內部的計時來跟蹤時間,當達到預設的時間點時,定時器會發送信號給控制電路,從而驅動開關動作。這個過程可以分為以下幾個步驟:
    的頭像 發表于 09-19 16:19 ?3624次閱讀

    定時器的基本組成和工作模式

    定時器是計算機或電子設備中常見的一個硬件或軟件組件,其主要功能是測量和控制時間的流逝。它在各種應用中起著至關重要的作用,如操作系統調度、多媒體播放、網絡通信、工業自動化控制以及家電設備的定時功能等。
    的頭像 發表于 08-19 18:28 ?2515次閱讀

    定時器的工作方式介紹

    或實現周期性事件的硬件模塊。它可以用于實現各種定時任務,如定時中斷、PWM(脈沖寬度調制)輸出、頻率測量等。定時器通常由一個計數
    的頭像 發表于 07-12 10:29 ?1768次閱讀

    定時器相關的寄存有哪些類型

    在微控制編程中,定時器是一種非常常見的功能模塊,用于實現各種定時和計數功能。定時器的工作原理是通過內部的計數來跟蹤時間的流逝,當計數
    的頭像 發表于 07-12 10:25 ?1581次閱讀

    鴻蒙開發系統基礎能力:Timer定時器

    設置一個定時器,該定時器定時器到期后執行一個函數。
    的頭像 發表于 06-28 11:33 ?1388次閱讀
    鴻蒙開發系統基礎能力:Timer<b class='flag-5'>定時器</b>

    三菱plc定時器范圍怎么設置

    定時器的設置范圍直接影響到程序的執行效率和控制精度。本文將詳細介紹三菱PLC定時器的設置范圍及其設置方法。 定時器的基本概念 定時器是一種用于測量
    的頭像 發表于 06-20 11:04 ?4458次閱讀

    三菱plc定時器最大設定值

    定時器是一種非常重要的功能,用于實現時間控制和延時控制。 一、三菱PLC定時器的基本概念 定時器的定義 定時器是一種用于測量時間間隔的設備
    的頭像 發表于 06-20 11:03 ?3283次閱讀

    三菱plc編程定時器編程咋輸入

    三菱PLC定時器的編程方法和應用場景。 1. 定時器的基本概念 定時器是一種用于測量時間間隔的設備,它可以在PLC程序中實現延時、計時等功能。三菱PLC中的
    的頭像 發表于 06-20 11:01 ?2723次閱讀
    主站蜘蛛池模板: 最新版天堂资源官网 | 日本a级特黄三级三级三级 日本边添边爱边摸边做边爱 | 色四虎| 亚洲一区二区三区免费观看 | 日韩精品免费一级视频 | xxxx日本69xxxxx| 色偷偷91久久综合噜噜噜 | vvvv98国产成人综合青青 | 看黄网站免费 | 久久精品免费观看久久 | 婷婷综合影院 | 深夜视频在线免费观看 | 一级特一级特色生活片 | 小说老卫陈红张敏陈法蓉 | 老司机深夜影院入口aaaa | 来啊mm影院亚洲mm影院 | 在线视频你懂得 | 国产www色 | 久久丁香视频 | 立即播放免费毛片一级 | 欧美一区二区三区在线观看免费 | 日本www免费 | 日本免费网站在线观看 | 日本黄色大片在线观看 | 日韩三级免费看 | 影院成人区精品一区二区婷婷丽春院影视 | 中文字幕婷婷 | 国产亚洲美女精品久久久久狼 | 九色97| 国产精品视频久久久久 | 亚洲一区欧美二区 | 国产午夜不卡在线观看视频666 | 久久久午夜影院 | 国产美女精品视频免费观看 | 亚洲视频入口 | 一级特黄aaa大片在线观看视频 | 亚洲成成品网站有线 | 欧美一级艳片视频免费观看 | 成年人毛片网站 | 亚州色图欧美色图 | 狠狠操亚洲|