STM32 TIM輸入捕獲 測量頻率

輸入捕獲簡介:

????????IC(Input Capture)輸入捕獲

????????輸入捕獲模式下,當通道輸入引腳出現指定電平跳變時,當前CNT的值將被鎖存到CCR中,可用于測量PWM波形的頻率、占空比、脈沖間隔、電平持續時間等參數

????????每個高級定時器和通用定時器都擁有4個輸入捕獲通道

????????可配置為PWMI模式,同時測量頻率和占空比

????????可配合主從觸發模式,實現硬件全自動測量

頻率測量:

輸入捕獲基本結構

主從觸發模式:

接線圖:

代碼配置:

實現功能在屏幕上顯示頻率,頻率通過ARR與PSC共同控制,而ARR也涉及到占空比的改變,所以我們選擇更改PSC,在初始化后單獨寫一個函數更改PSC

需要調用到這個函數,單獨用來寫入PSC的函數

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
void pWM_SetPrescaler(uint16_t Prescaler)
{TIM_PrescalerConfig(TIM2, Prescaler,  TIM_PSCReloadMode_Immediate);}

函數介紹:

用結構體配置輸入捕獲單元的函數

注意:輸入捕獲與輸出比較都有4個通道,OCInit,4個通道每個通道各占一個函數,而ICInit,4個通道是共用一個函數的,在結構體里會有一個參數,來配置具體哪個通道,因為可能有交叉通道的配置,所以函數合在一起比較方便

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

這個函數與上一個函數類似,都是用于初始化輸入捕獲單元的,但是上一個函數只是單一的配置一個通道,這個函數可以快速配置兩個通道

void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

這個函數可以給輸入捕獲結構體賦一個初始值

void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);

下面三個對應主從觸發模式:

選擇輸入觸發源TRGI

void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

選擇輸出觸發源TRGO

void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);

選擇從模式

void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);

下面四個函數,分別單獨配置通道1、2、3、4的分頻器

void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);

分別讀取4個通道的CCR,這4個函數和SetCompare1、2、3、4是對應的,輸出比較模式下,CCR是只寫的,要用SetCompare寫入,輸入捕獲模式下,CCR是只讀的,要用GetCapture讀出

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);

輸入捕獲代碼配置

????????根據結構圖配置

1.定義結構體變量

定義GPIO、TimeBase時基單元、IC輸入捕獲單元結構體變量

//定義結構體變量
GPIO_InitTypeDef GPIO_InitStructure;//定義GPIO結構體變量
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定義時基單元結構體變量
TIM_ICInitTypeDef TIM_ICInitStructure;    //定義IC結構體變量

2.RCC開啟時鐘

把GPIO和TIM的時鐘打開

//RCC開啟時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//開啟GPIO A族時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//開啟TIM3時鐘

3.GPIO初始化

把GPIO配置成輸入模式,一般選擇上拉輸入或者浮空輸入模式,這里選擇TIM3_CH1通道,根據引腳圖為PA6,所以這次配置這個引腳,模式選擇上拉輸入

//配置GPIOGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//配置引腳
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);

4.配置時基單元

讓CNT計數器在內部時鐘的驅動下自增運行,這里的周期給到最大,PSC的值給72 - 1,這樣標準頻率就是72M / 72 = 1MHz 方便計算。

//配置時基單元TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//選擇向上計數
TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;							 //ARR周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;							 //預分頻器PSC的值
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;					 //重復計數器的值TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);

5.配置輸入捕獲單元

包括濾波器、極性、直連通道還是交叉通道、分頻器這些參數

//配置輸入捕獲單元TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//選擇通道  我們這里選擇的是TIM3的CH1
TIM_ICInitStructure.TIM_ICFilter = 0xF;//選擇輸入捕獲的濾波器
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//邊沿檢測極性選擇 選擇上升沿觸發
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分頻器
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//選擇觸發信號從那個引腳輸入TIM_ICInit(TIM3, &TIM_ICInitStructure);

6.選擇從模式的觸發源

觸發源選擇為TI1FP1,這里調用一個庫函數,給一個參數就行

//配置主從模式觸發源
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//配置TRIG的觸發源

7.選擇觸發之后執行的操作

執行Reset操作,這里也是調用一個庫函數就行了

TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//配置從模式為Reset

最后調用TIM_CMD函數開啟定時器,當我們需要讀取最新一個周期的頻率時,直接讀取CCR寄存器,然后按照fc/N,計算一下就行了。

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

整體代碼:

void IC_Init(void)
{//定義結構體變量GPIO_InitTypeDef GPIO_InitStructure;//定義GPIO結構體變量TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定義時基單元結構體變量TIM_ICInitTypeDef TIM_ICInitStructure;    //定義IC結構體變量//RCC開啟時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//開啟GPIO A族時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//開啟TIM3時鐘//配置GPIOGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//配置引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置時基單元TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//選擇向上計數TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;							 //ARR周期的值TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;							 //預分頻器PSC的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;					 //重復計數器的值TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//配置輸入捕獲單元TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//選擇通道  我們這里選擇的是TIM3的CH1TIM_ICInitStructure.TIM_ICFilter = 0xF;//選擇輸入捕獲的濾波器TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//邊沿檢測極性選擇 選擇上升沿觸發TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分頻器TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//選擇觸發信號從那個引腳輸入TIM_ICInit(TIM3, &TIM_ICInitStructure);//配置主從模式觸發源TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//配置TRIG的觸發源TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//配置從模式為Reset//啟動定時器TIM_Cmd(TIM3,ENABLE);}

功能代碼:

????????測量頻率,在頻幕上顯示

uint32_t IC_GetFreg(void)
{return 1000000 / (TIM_GetCapture1(TIM3) + 1);}

主函數:

#include "IC.h"
int main(void)
{LED_Init();OLED_Init();PWM_Init();IC_Init();pWM_SetPrescaler(720 - 1);        //Freg = 72M  / (PSC + 1) / 100PWM_SetComPer(50);								//Duty = CCR / 100OLED_ShowString(1, 1, "Freg:00000Hz");while(1){OLED_ShowNum(1, 6, IC_GetFreg(), 5);}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67513.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

21.3-啟動流程、編碼風格(了解) 第21章-FreeRTOS項目實戰--基礎知識之新建任務、啟動流程、編碼風格、系統配置 文件組成和編碼風格(了解)

21.3-啟動流程、編碼風格(了解) 啟動流程 第一種啟動流程(我們就使用這個): 在main函數中將硬件初始化、RTOS系統初始化,同時創建所有任務,再啟動RTOS調度器。 第二種啟動流程: 在main函數中將硬件初始化、RTOS系統初始化,只…

【AI非常道】二零二五年一月(二),AI非常道

經常在社區看到一些非常有啟發或者有收獲的話語,但是,往往看過就成為過眼云煙,有時再想去找又找不到。索性,今年開始,看到好的言語,就記錄下來,一月一發布,亦供大家參考。 有關AI非…

Mac Electron 應用簽名(signature)和公證(notarization)

在MacOS 10.14.5之后,如果應用沒有在蘋果官方平臺進行公證notarization(我們可以理解為安裝包需要審核,來判斷是否存在病毒),那么就不能被安裝。當然現在很多人的解決方案都是使用sudo spctl --master-disable,取消驗證模式&#…

1、開始簡單使用rag

文章目錄 前言數據存放申請api開始代碼安裝依賴從文件夾中讀取文檔文檔切塊將分割嵌入并存儲在向量庫中檢索部分代碼構造用戶接口演示提示 整體代碼 前言 本章只是簡單使用rag的一個示例,為了引出以后的學習,將整個rag的流程串起來 數據存放 一個示例…

C 標準庫 - `<errno.h>`

C 標準庫 - <errno.h> 引言 在C語言編程中,正確處理錯誤是保證程序穩定性和可靠性的關鍵。C標準庫中的<errno.h>頭文件提供了錯誤碼定義和宏,使得開發者能夠更好地管理和處理程序運行過程中可能出現的錯誤。本文將詳細介紹<errno.h>頭文件的作用、常用錯…

愛書愛考平臺說明

最近我開發了一個綜合性的考試平臺&#xff0c;內容包括但不限于職業資格證考試、成人教育、國家公務員考試等內容。目前1.0版本已經開發完成&#xff0c;其他的功能陸續完善中。 微信小程序搜索"愛書愛考" 微信小程序圖標如下圖: 目前維護了java相關的面試題的考題…

ZZNUOJ(C/C++)基礎練習1011——1020(詳解版)

目錄 1011 : 圓柱體表面積 C語言版 C版 1012 : 求絕對值 C語言版 C版 1013 : 求兩點間距離 C語言版 C版 1014 : 求三角形的面積 C語言版 C版 1015 : 二次方程的實根 C語言版 C版 1016 : 銀行利率 C語言版 C版 1017 : 表面積和體積 C語言版 C版 代碼邏輯…

Java面試題2025-設計模式

1.說一下開發中需要遵守的設計原則&#xff1f; 設計模式中主要有六大設計原則&#xff0c;簡稱為SOLID &#xff0c;是由于各個原則的首字母簡稱合并的來(兩個L算一個,solid 穩定的)&#xff0c;六大設計原則分別如下&#xff1a; 1、單一職責原則 單一職責原則的定義描述非…

認識小程序的基本組成結構

1.基本組成結構 2.頁面的組成部分 3.json配置文件 4.app.json文件(全局配置文件&#xff09; 5.project.config.json文件 6.sitemap.json文件 7.頁面的.json配置文件 通過window節點可以控制小程序的外觀

git中有關old mode 100644、new mode 10075的問題解決小結

在 Git 版本控制系統中&#xff0c;文件權限變更是一種常見情況。當你看到類似 old mode 100644 和 new mode 100755 的信息時&#xff0c;這通常表示文件的權限發生了變化。本文將詳細解析這種情況&#xff0c;并提供解決方法和注意事項。 問題背景 在 Git 中&#xff0c;文…

20個整流電路及仿真實驗匯總

0、 前言 以下是關于“20個整流電路及仿真實驗匯總”的前言部分: 在現代電力電子技術領域,整流電路作為將交流電(AC)轉換為直流電(DC)的關鍵電路,廣泛應用于各類電源設計、信號處理以及電力電子設備中。整流電路不僅能夠為電子設備提供穩定的直流電源,還在電力傳輸、…

截取窗口的完整矩形不包括陰影區域(含邊框和標題欄)

在Windows編程中&#xff0c;GetWindowRect 函數用于獲取窗口的矩形區域&#xff0c;包括窗口的邊框和標題欄。如果你希望獲取窗口的客戶區&#xff08;不包含窗口邊框、標題欄和陰影區域&#xff09;&#xff0c;可以使用 GetClientRect 函數。 區別 GetWindowRect&#xff1…

第30章 測試驅動開發中的設計模式解析(Python 版)

寫在前面 這本書是我們老板推薦過的&#xff0c;我在《價值心法》的推薦書單里也看到了它。用了一段時間 Cursor 軟件后&#xff0c;我突然思考&#xff0c;對于測試開發工程師來說&#xff0c;什么才更有價值呢&#xff1f;如何讓 AI 工具更好地輔助自己寫代碼&#xff0c;或許…

2025美賽復盤總結反思(論文手)

充實的經歷&收獲 美賽這個過程&#xff0c;確實逼著自己學了不少東西&#xff0c;excel本身&#xff0c;以及發現Ai確實能幫忙處理不少的了&#xff0c;也第一次發現原來自己熬通宵也能很精神&#xff08;當然確實是傷身體的&#xff09; 好的經驗&#xff1a; 積極搜索…

從0開始使用面對對象C語言搭建一個基于OLED的圖形顯示框架(協議層封裝)

目錄 協議層設計&#xff0c;以IIC為例子 關于軟硬件IIC 設計的一些原則 完成協議層的抽象 刨析我們的原理 如何完成我們的抽象 插入幾個C語言小技巧 完成軟件IIC通信 開始我們的IIC通信 結束我們的IIC通信 發送一個字節 &#xff08;重要&#xff09;完成命令傳遞和…

舉例說明python單利模式的必要性

單例模式的核心目的是確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取這個實例。這種設計模式在某些場景下非常必要&#xff0c;尤其是在需要嚴格控制資源訪問、共享狀態或配置管理的場景中。下面通過幾個具體的例子來說明Python中單例模式的必要性。 1. 數據庫…

【騰訊云】騰訊云docker搭建單機hadoop

這里寫目錄標題 下載jdk hadoop修改hadoop配置編寫Dockerfile構建鏡像運行鏡像創建客戶端 下載jdk hadoop wget --no-check-certificate https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz wget --no-check-certificate https://repo.huaweicloud.…

設計模式 - 行為模式_Template Method Pattern模板方法模式在數據處理中的應用

文章目錄 概述1. 核心思想2. 結構3. 示例代碼4. 優點5. 缺點6. 適用場景7. 案例&#xff1a;模板方法模式在數據處理中的應用案例背景UML搭建抽象基類 - 數據處理的 “總指揮”子類定制 - 適配不同供應商供應商 A 的數據處理器供應商 B 的數據處理器 在業務代碼中整合運用 8. 總…

HTML5+SVG+CSS3實現雪中點亮的圣誕樹動畫效果源碼

源碼介紹 這是一款基于HTML5SVGCSS3實現雪中點亮的圣誕樹動畫效果源碼。畫面中的圣誕樹矗立在雪地中&#xff0c;天上飄落著雪花。當鼠標滑過圣誕樹時&#xff0c;可見到圣誕樹上的燈光閃爍&#xff0c;同時左下角探出雪怪模樣的半個腦袋&#xff0c;四處張望著。整體畫面栩栩…

C基礎寒假練習(3)

一、求數組中的第二大值 #include <stdio.h> int main() {int arr[] {12, 35, 1, 10, 34, 1};int size sizeof(arr) / sizeof(arr[0]);if (size < 2) {printf("數組元素不足兩個\n");return 0;}int first -2147483648, second -2147483648; // 使用IN…