輸入捕獲模式測頻率

前提工作:

PA6、PA0通過跳線相連,PA6測試PA0的輸出頻率

本來只有下列函數,改變占空比 但是我們需要測試頻率,需要動態改變頻率。

void PWM_SetCompare1(uint16_t Compare)
{TIM_SetCompare1(TIM2, Compare);		//設置CCR1的值
}

?改變頻率的函數

/*** 函    數:PWM設置PSC* 參    數:Prescaler 要寫入的PSC的值,范圍:0~65535* 返 回 值:無* 注意事項:PSC和ARR共同決定頻率,此函數僅設置PSC的值,并不直接是頻率*           頻率Freq = CK_PSC / (PSC + 1) / (ARR + 1)*/
void PWM_SetPrescaler(uint16_t Prescaler)
{TIM_PrescalerConfig(TIM2, Prescaler, TIM_PSCReloadMode_Immediate);		//設置PSC的值
}

?輸入捕獲模式測頻率的基本思路

用TIM3_CH1捕獲輸入頻率

輸入捕獲初始化函數

第一步:開始TIM3和GPIO的時鐘

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

第二步:初始化GPIO和時鐘源

/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_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);							//將PA6引腳初始化為上拉輸入/*配置時鐘源*/TIM_InternalClockConfig(TIM3);		//選擇TIM3為內部時鐘,若不調用此函數,TIM默認也為內部時鐘

第三步:時基單元初始化

注意:為了防止計數溢出,ARR值要設置大一點。CNT的取值范圍0~ARR

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定義結構體變量TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //時鐘分頻,選擇不分頻,此參數用于配置濾波器時鐘,不影響時基單元功能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_TimeBaseInit,配置TIM3的時基單元

第四步:輸入捕獲模塊初始化

注意:濾波器不會改變信號的原有頻率,分頻器就是對信號本身進行計次,會改變頻率

TIM_ICPSC_DIV1:1分頻——每次觸發(上升沿/下降沿)都有效

TIM_ICPSC_DIV2:2分頻——每2次觸發(上升沿/下降沿)有效

	TIM_ICInitTypeDef TIM_ICInitStructure;							//定義結構體變量TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//選擇配置定時器通道1TIM_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_ICInit,配置TIM3的輸入捕獲通道

第五步:選擇觸發源及從模式

	/*選擇觸發源及從模式*/TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//觸發源選擇TI1FP1TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//從模式選擇復位//即TI1產生上升沿時,會觸發CNT歸零

第六步:TIM使能

	/*TIM使能*/TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定時器開始運行

獲取輸入捕獲的頻率的函數

上面tim3的psc配置為72,所以標準頻率fc為72000000/72=1Mhz

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);@retval Capture Compare 1 Register value.
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);@retval Capture Compare 2 Register value.
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);


/*** 函    數:獲取輸入捕獲的頻率* 參    數:無* 返 回 值:捕獲得到的頻率*/
uint32_t IC_GetFreq(void)
{return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//測周法得到頻率fx = fc / N,這里不執行+1的操作也可
}

Ic.c完整代碼

#include "stm32f10x.h"                  // Device header/*** 函    數:輸入捕獲初始化* 參    數:無* 返 回 值:無*/
void IC_Init(void)
{/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//開啟TIM3的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//開啟GPIOA的時鐘/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_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);							//將PA6引腳初始化為上拉輸入/*配置時鐘源*/TIM_InternalClockConfig(TIM3);		//選擇TIM3為內部時鐘,若不調用此函數,TIM默認也為內部時鐘/*時基單元初始化*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定義結構體變量TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //時鐘分頻,選擇不分頻,此參數用于配置濾波器時鐘,不影響時基單元功能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_TimeBaseInit,配置TIM3的時基單元/*輸入捕獲初始化*/TIM_ICInitTypeDef TIM_ICInitStructure;							//定義結構體變量TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//選擇配置定時器通道1TIM_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_ICInit,配置TIM3的輸入捕獲通道/*選擇觸發源及從模式*/TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//觸發源選擇TI1FP1TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//從模式選擇復位//即TI1產生上升沿時,會觸發CNT歸零/*TIM使能*/TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定時器開始運行
}/*** 函    數:獲取輸入捕獲的頻率* 參    數:無* 返 回 值:捕獲得到的頻率*/
uint32_t IC_GetFreq(void)
{return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//測周法得到頻率fx = fc / N,這里不執行+1的操作也可
}

?mian.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"int main(void)
{/*模塊初始化*/OLED_Init();		//OLED初始化PWM_Init();			//PWM初始化IC_Init();			//輸入捕獲初始化/*顯示靜態字符串*/OLED_ShowString(1, 1, "Freq:00000Hz");		//1行1列顯示字符串Freq:00000Hz/*使用PWM模塊提供輸入捕獲的測試信號*/PWM_SetPrescaler(720 - 1);					//PWM頻率Freq = 72M / (PSC + 1) / 100PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100while (1){OLED_ShowNum(1, 6, IC_GetFreq(), 5);	//不斷刷新顯示輸入捕獲測得的頻率}
}

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

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

相關文章

通付盾入選蘇州市網絡和數據安全免費體驗目錄,引領企業安全能力躍升

近日,蘇州市網絡安全主管部門正式發布《蘇州市網絡和數據安全免費體驗產品和服務目錄》,通付盾憑借其在數據安全、區塊鏈、AI領域的創新實踐和前沿技術實力,成功入選該目錄。 作為蘇州市網絡安全技術支撐單位,通付盾將通過 “免費…

AI日報 - 2025年04月25日

🌟 今日概覽(60秒速覽) ▎🤖 AGI突破 | OpenAI o3模型展現行動能力,英國發布RepliBench評估AI自主復制風險,DeepMind CEO擔憂AGI協調挑戰。 模型能力向行動和自主性演進,安全與協調成為焦點。 ▎💼 商業動向…

DeepSeek開源引爆AI Agent革命:應用生態迎來“安卓時刻”

開源低成本:AI應用開發進入“全民時代” 2025年初,中國AI領域迎來里程碑事件——DeepSeek開源模型的橫空出世,迅速在全球開發者社區掀起熱潮。其R1和V3模型以超低API成本(僅為GPT-4o的2%-10%)和本地化部署能力&#x…

CDGP|大模型賦能數據治理:實踐案例與深度剖析

隨著大數據技術的飛速發展,數據規模呈爆炸式增長,數據來源也日趨多樣化。在這個背景下,大模型,即具有數十億甚至上百億參數的深度學習模型,逐漸成為數據處理和分析的重要工具。大模型具備處理多任務、理解復雜語言模式…

Ubuntu 一站式部署 RabbitMQ 4 并“徹底”遷移數據目錄的終極實踐

1 安裝前準備 sudo apt update -y sudo apt install -y curl gnupg apt-transport-https lsb-release jq若計劃將數據放到新磁盤(如 /dev/nvme0n1p1): sudo mkfs.xfs /dev/nvme0n1p1 sudo mkdir /data echo /dev/nvme0n1p1 /data xfs defau…

5.2.3 WPF 中 XAML 文件 Converter 使用介紹

Converter(轉換器)在 WPF 數據綁定中扮演著重要角色,用于在源數據和目標屬性之間進行值轉換 舉例來說:我想用一個bool量來控制一個背景,為true時,顯示紅色;為false時背景用默認顏色。因此 Backg…

MySQL 8 自動安裝腳本(CentOS-7 系統)

文章目錄 一、MySQL 8 自動安裝腳本腳本說明📌 使用腳本前提條件1. 操作系統2. 用戶權限3. 網絡要求 📌 腳本的主要功能1. 環境檢查2. MySQL 自動安裝3. 自動配置 MySQL4. 防火墻配置5. 驗證與輸出 📌 適用場景 二、執行sh腳本1. 給予腳本執行…

Python跨平臺桌面應用程序開發

引言 在當今軟件開發領域,跨平臺應用程序開發變得越來越重要。用戶希望無論使用Windows、macOS還是Linux系統,都能獲得一致的應用體驗。Python作為一種高級編程語言,憑借其簡潔的語法和豐富的庫生態系統,成為了跨平臺桌面應用程序…

使用 Docker 安裝 SQL Server 2022 并解決 Navicat 連接問題

在使用 Docker 安裝 SQL Server 時,很多人可能遇到過無法通過 Navicat 等數據庫客戶端連接到容器的情況。尤其是嘗試使用 mcr.microsoft.com/mssql/server:2022-latest 鏡像時,可能會發現 Navicat一直轉圈,無法連接到數據庫。在這篇博客中&am…

2025最新軟件測試面試八股文(答案+文檔+視頻講解)

1、你的測試職業發展是什么? 測試經驗越多,測試能力越高。所以我的職業發展是需要時間積累的,一步步向著高級測試工程師奔去。而且我也有初步的職業規劃,前3年積累測試經驗,按如何做好測試工程師的要點去要求自己&…

理解計算機系統_網絡編程(2)

前言 以<深入理解計算機系統>(以下稱“本書”)內容為基礎&#xff0c;對程序的整個過程進行梳理。本書內容對整個計算機系統做了系統性導引,每部分內容都是單獨的一門課.學習深度根據自己需要來定 引入 接續上一篇理解計算機系統_網絡編程(1)-CSDN博客 國際互聯…

【盈達科技】GEO(生成式引擎優化)底層邏輯

??一、GEO的現狀?? ??技術快速迭代?? 生成式AI&#xff08;如ChatGPT、Claude、Google SGE&#xff09;正在成為用戶獲取信息的核心入口&#xff0c;傳統搜索引擎的流量被分流。主流平臺如Google推出“生成式搜索體驗&#xff08;SGE&#xff09;”&#xff0c;Bing整合…

VS Code 智能代理模式:重塑開發體驗

在編程領域&#xff0c;效率與精準度無疑是開發者們永恒的追求。而如今&#xff0c;VS Code 推出的智能代理模式&#xff08;Agent Mode&#xff09;&#xff0c;正以前所未有的方式&#xff0c;徹底顛覆了傳統開發流程&#xff0c;為程序員們帶來了一場前所未有的效率革命。本…

【回眸】Aurix TC397 IST 以太網 UDP 相關開發

前言 關于移植IST功能至 Infineon TC397上主要涉及到UDP發送報文及接收。IST是安全診斷相關的工作 Nvidia IST介紹 Orin系列芯片會提供一種機制來檢測由系統內測&#xff08;IST&#xff09;所產生的永久的故障&#xff0c;IST 應該在 Orin-x 功能安全系統中使用期間被啟動。…

Mediamtx與FFmpeg遠程與本地推拉流使用

1.本地推拉流 啟服 推流 ffmpeg -re -stream_loop -1 -i ./DJI_0463.MP4 -s 1280x720 -an -c:v h264 -b:v 2000k -maxrate 2500k -minrate 1500k -bufsize 3000k -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 拉流 ffplay -rtsp_transport tcp rtsp://43.136.…

使用QML Tumbler 實現時間日期選擇器

目錄 引言相關閱讀項目結構示例實現與代碼解析示例一&#xff1a;時間選擇器&#xff08;TimePicker&#xff09;示例二&#xff1a;日期時間選擇器&#xff08;DateTimePicker&#xff09; 主窗口整合運行效果總結下載鏈接 引言 在現代應用程序開發中&#xff0c;時間與日期選…

R語言中的常用內置函數

常用的數值函數 常用的字符函數 與概率分布相關的函數 有用的統計函數 數據來源:《數據挖掘與數據分析&#xff1a;基于R語言》王陽 2024年1月出版

org.springframework.core.env.PropertiesPropertySource 類詳解

org.springframework.core.env.PropertiesPropertySource 類詳解 1. 基本概述 類路徑: org.springframework.core.env.PropertiesPropertySource繼承關系: 繼承自 PropertySource<Properties>&#xff0c;實現 PropertySource 接口。作用: 將 Java Properties 對象&…

2025-04-22 李沐深度學習5 —— 線性回歸

文章目錄 1 案例介紹1.1 應用場景&#xff1a;美國房價預測1.2 核心假設1.3 線性回歸與神經網絡的關系1.4 平方損失&#xff08;L2 Loss&#xff09;1.5 訓練模型&#xff1a;最小化損失 2 基礎優化算法2.1 梯度下降2.2 小批量隨機梯度下降&#xff08;Mini-batch SGD&#xff…

你的大模型服務如何壓測:首 Token 延遲、并發與 QPS

寫在前面 大型語言模型(LLM)API,特別是遵循 OpenAI 規范的接口(無論是 OpenAI 官方、Azure OpenAI,還是 DeepSeek、Moonshot 等眾多兼容服務),已成為驅動下一代 AI 應用的核心引擎。然而,隨著應用規模的擴大和用戶量的增長,僅僅關注模型的功能是不夠的,API 的性能表…