TIM輸入捕獲---STM

一、簡介

IC輸入捕獲

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

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

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

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

二、工程代碼

項目一:

程序現象:自己“測”自己;輸入捕獲模式測頻率

配置流程:

? ? ? ? 1.RCC開啟時鐘

? ? ? ? 2.GPIO初始化,配置為輸入模式

? ? ? ? 3.配置時基單元

? ? ? ? 4.配置輸入捕獲單元(捕獲通道、捕獲方式、輸入捕獲預分頻器)

? ? ? ? 5.選擇從模式觸發源

? ? ? ? 6.觸發之后進行的操作

? ? ? ? 7.開始定時器

接線:一根杜邦線一端接在單片機的PA6,另一端接在PA0

?這個是輸入捕獲的代碼,輸出波形的代碼在在我之前寫的TIM輸出比較的文章里面pwm_led.c里面;

pwm_ic.c

#include "stm32f10x.h"  // STM32F10x外設庫頭文件
#include "pwm_ic.h"     // PWM控制相關頭文件
#include "delay.h"       // 延時函數頭文件// 按鍵初始化函數
void PWM_IC_Init(void)
{// 定義定時器基礎結構體和輸出比較結構體TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure;  // GPIO初始化結構體TIM_ICInitTypeDef TIM_ICInitStruct;   // 定時器輸入捕獲初始化結構體// 使能TIM3和GPIOA的時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  // 使能定時器TIM3時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 使能GPIOA時鐘// 配置GPIOA的引腳6為定時器的輸入引腳(PWM輸入)GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;           // 配置GPIOA的Pin6GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    // 配置引腳的速度為50MHzGPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPD;       // 配置為輸入下拉模式GPIO_Init(GPIOA, &GPIO_InitStructure);               // 初始化GPIOA的Pin6引腳/* 配置時鐘源 */TIM_InternalClockConfig(TIM3);  // 選擇TIM3為內部時鐘源,若不調用此函數,TIM默認也是內部時鐘// 配置定時器基本參數TIM_TimeBaseStructure.TIM_Period = 65535 - 1;              // 自動重載值,定時器的計數周期為65535,即計數從0到65534,周期為65535個時鐘周期TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;              // 預分頻器值,定時器時鐘源被分頻為72MHz / 72 = 1000000Hz,即定時器時鐘頻率為1MHzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    // 時鐘分割設置為1,表示不進行時鐘分割,保持時鐘完整性TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 計數模式設置為向上計數模式,從0計數到自動重載值(65535)TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;           // 重復計數器設置為0,不啟用重復計數器,定時器只進行單次計數TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);            // 初始化定時器TIM3,應用上述配置// 配置定時器輸入捕獲參數TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;               	// 使用TIM3的通道1TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;  // 選擇直接連接到TI1的輸入信號TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;            // 輸入捕獲預分頻器為1TIM_ICInitStruct.TIM_ICFilter = 0xF;                           // 輸入濾波器設置為最大濾波值TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;      // 上升沿觸發輸入捕獲TIM_ICInit(TIM3, &TIM_ICInitStruct);                          // 初始化輸入捕獲// 配置觸發器TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);  // 選擇輸入觸發器為TIM3通道1的輸入(TI1)TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 配置為復位模式,作為從設備// 啟動定時器TIM3TIM_Cmd(TIM3, ENABLE);  // 啟動TIM3,使其開始計數并處理輸入捕獲}// 獲取PWM頻率的函數
u32 IC_GetFreq(void)
{// 計算PWM頻率(單位為Hz),根據捕獲到的輸入信號周期return 1000000 / (TIM_GetCapture1(TIM3) + 1);  // 以微秒為單位進行計算
}

pwm_ic.h

#ifndef __PWM_IC_H
#define __PWM_IC_H#include "stm32f10x.h"                  
#include "sys.h"void PWM_IC_Init(void);
u32	IC_GetFreq(void);#endif

main.c


#include "stm32f10x.h"  // 設備相關頭文件
#include "pwm_ic.h"     // PWM控制相關頭文件
#include "delay.h"       // 延時相關頭文件int main(){PWM_IC_Init();      // 初始化PWMdelay_init();    // 初始化延時函數/*使用PWM模塊提供輸入捕獲的測試信號*/PWM_SetPrescaler(720 - 1);					//PWM頻率Freq = 72M / (PSC + 1) / 100//這兩個函數在之前輸出比較文章中pwm_led.c里面PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100while(1){   IC_GetFreq(); }
}

項目二:

程序現象:PWMI模式測頻率占空比

pwmi_ic.c

#include "stm32f10x.h"  // STM32F10x外設庫頭文件
#include "pwmi_ic.h"     // PWM控制相關頭文件
#include "delay.h"       // 延時函數頭文件// 按鍵初始化函數
void PWMI_IC_Init(void)
{// 定義定時器基礎結構體和輸出比較結構體TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure;  // GPIO初始化結構體TIM_ICInitTypeDef TIM_ICInitStruct;   // 定時器輸入捕獲初始化結構體// 使能TIM3和GPIOA的時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  	// 使能定時器TIM3時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  	// 使能GPIOA時鐘// 配置GPIOA的引腳6為定時器的輸入引腳(PWM輸入)GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;           		// 配置GPIOA的Pin6GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    		// 配置引腳的速度為50MHzGPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPD;       		// 配置為輸入下拉模式GPIO_Init(GPIOA, &GPIO_InitStructure);               		// 初始化GPIOA的Pin6引腳/* 配置時鐘源 */TIM_InternalClockConfig(TIM3);  															// 選擇TIM3為內部時鐘源,若不調用此函數,TIM默認也是內部時鐘// 配置定時器基本參數TIM_TimeBaseStructure.TIM_Period = 65535 - 1;              		// 自動重載值,定時器的計數周期為65535,即計數從0到65534,周期為65535個時鐘周期TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;              		// 預分頻器值,定時器時鐘源被分頻為72MHz / 72 = 1000000Hz,即定時器時鐘頻率為1MHzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    		// 時鐘分割設置為1,表示不進行時鐘分割,保持時鐘完整性TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  	// 計數模式設置為向上計數模式,從0計數到自動重載值(65535)TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;           		// 重復計數器設置為0,不啟用重復計數器,定時器只進行單次計數TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);            		// 初始化定時器TIM3,應用上述配置// 配置定時器輸入捕獲參數TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;               		// 使用TIM3的通道1TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;  	// 選擇直接連接到TI1的輸入信號TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;            	// 輸入捕獲預分頻器為1TIM_ICInitStruct.TIM_ICFilter = 0xF;                          	// 輸入濾波器設置為最大濾波值TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;      	// 上升沿觸發輸入捕獲TIM_ICInit(TIM3, &TIM_ICInitStruct);                          	// 初始化輸入捕獲//		    // 配置定時器輸入捕獲參數
//    TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;               		// 使用TIM3的通道2
//    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;  // 選擇交叉輸入到TI1的輸入信號
//    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;            	// 輸入捕獲預分頻器為1
//    TIM_ICInitStruct.TIM_ICFilter = 0xF;                           	// 輸入濾波器設置為最大濾波值
//    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;      	// 下降沿觸發輸入捕獲
//    TIM_ICInit(TIM3, &TIM_ICInitStruct);  TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);// 配置觸發器TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); 								 			// 選擇輸入觸發器為TIM3通道1的輸入(TI1)TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); 									// 配置為復位模式,作為從設備// 啟動定時器TIM3TIM_Cmd(TIM3, ENABLE); 																						 // 啟動TIM3,使其開始計數并處理輸入捕獲}// 獲取PWM頻率的函數
u32 IC_GetFreq(void)
{// 計算PWM頻率(單位為Hz),根據捕獲到的輸入信號周期return 1000000 / (TIM_GetCapture1(TIM3) + 1);  // 以微秒為單位進行計算
}u32	IC_GetDuty(void)
{return (TIM_GetCapture2(TIM3) + 1)* 100 / (TIM_GetCapture1(TIM3) + 1);
}

pwmi_ic.h

#ifndef __PWMI_IC_H
#define __PWMI_IC_H#include "stm32f10x.h"                  
#include "sys.h"void PWMI_IC_Init(void);
u32	IC_GetFreq(void);
u32	IC_GetDuty(void);#endif

main.c

#include "stm32f10x.h"  // 設備相關頭文件
#include "pwmi_ic.h"     // PWM控制相關頭文件
#include "delay.h"       // 延時相關頭文件int main(){PWMI_IC_Init();                              // 初始化PWMdelay_init();                               // 初始化延時函數/*使用PWM模塊提供輸入捕獲的測試信號*/PWM_SetPrescaler(720 - 1);					//PWM頻率Freq = 72M / (PSC + 1) / 100PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100while(1){   IC_GetFreq(); IC_GetDuty();}
}

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

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

相關文章

【Android Studio】學習——網絡連接

實驗:Android網絡連接 文章目錄 實驗:Android網絡連接[toc]實驗目標和實驗內容:1、掌握Android聯網的基本概念;2、能夠使用URL connection實現網絡連接;3、掌握第三方庫的基本概念4、需實現的具體功能 實驗結果功能說明…

ROS學習筆記二:ROS環境搭建

安裝ubuntu安裝ROS 參考趙虛左老師教程:ROS安裝ROS 快速上手體驗 -使用命令來實現 –創建工作空間: mkdir -p ros_learn_ws/src// ros_learn_ws為自定義空間 cd ros_learn_ws catkin_make –創建ROS功能包并添加依賴 cd src catkin_create_pkg demo_01 r…

5G中什么是ATG網絡?

有人問Air to Ground Networks for NR是怎么回事?這個是R18 NR才引入的。 ATG很多部分和NTN類似中的內容類似。比較明顯不同的是,NTN的RF內容有TS 38.101-5單獨去講,而ATG則會和地面網絡共用某些band,ATG可以工作在N1/N3/N34/N39…

基礎算法--雙指針

兩數之和 點擊:題目鏈接 解法一:暴力解法 時間復雜度:O(N^2) 算法思路:兩層for循環即可列出所有兩個數字的組合,判斷是否等于目標值 算法流程: 兩層 for 循環: 外層 for 循環依次枚舉第?個…

什么是Linux系統架構?

? Linux系統架構是指Linux操作系統的整體結構和工作層次,它定義了系統組件如何交互、如何管理硬件資源,以及用戶如何通過不同的層次與系統進行交互。Linux架構通常有兩種劃分方法:系統層次架構和功能層次架構,兩者都可以很好地描…

spring6:4、原理-手寫IoC

目錄 4、原理-手寫IoC4.1、回顧Java反射4.2、實現Spring的IoC 4、原理-手寫IoC 我們都知道,Spring框架的IOC是基于Java反射機制實現的,下面我們先回顧一下java反射。 4.1、回顧Java反射 Java反射機制是在運行狀態中,對于任意一個類&#x…

不是“我應該做什么”,而是“我想做什么”

1. 識別內心的渴望 首先,我們需要識別自己真正的愿望和激情所在。這可能需要一些時間和自我反思。問自己:在沒有任何外界壓力的情況下,我真正想做的是什么?是賺錢、生活、旅行、追星,還是其他什么?識別這些…

30天學會Go--第7天 GO語言 Redis 學習與實踐

30天學會Go–第7天 GO語言 Redis 學習與實踐 文章目錄 30天學會Go--第7天 GO語言 Redis 學習與實踐前言一、Redis 基礎知識1.1 Redis 的核心特性1.2 Redis 常見使用場景 二、安裝 Redis2.1 在 Linux 上安裝2.2 在 Windows 上安裝2.3 使用 Docker 安裝 Redis 三、Redis 常用命令…

Vue項目開發 如何實現父組件與子組件數據間的雙向綁定?

在 Vue.js 中,實現父組件與子組件數據之間的雙向綁定,可以通過以下幾種方式。下面我將介紹幾種常見的方法,并解釋它們的實現原理和適用場景。 1. 使用 v-model 實現雙向綁定 v-model 是 Vue.js 中最常見的雙向綁定方式,它可以使…

React第十七章(useRef)

useRef 當你在React中需要處理DOM元素或需要在組件渲染之間保持持久性數據時,便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 訪問ref的值 類似于vue的ref,Vue的ref是.value,其次就是vu…

【C++】內存分布、new、delete、 operator new、operator delete

內存分布 在C語言和C中,程序內存被劃分成六個部分: 內核空間、棧、內存映射段、堆、數據段、代碼段 棧:又稱堆棧,主要為非靜態局部變量、函數參數、返回值等,棧的生長方向是向下生長的 內存映射段:高效的…

代碼隨想錄算法訓練營day37|動態規劃part5

今天的幾道題目都比較簡單,思路也比較相似,都是利用完全背包。完全背包和01背包的不同點在于完全背包每個元素可以取多次,而01背包只能取1次,所以在dp一維數組遍歷時,完全背包仍然要從前往后遍歷,并且無論是…

混合云策略在安全領域受到青睞

Genetec 發布了《2025 年物理安全狀況報告》,該報告根據超過 5,600 名該領域領導者(其中包括 100 多名來自澳大利亞和新西蘭的領導者)的回應,揭示了物理安全運營的趨勢。 報告發現,澳大利亞和新西蘭的組織采用混合云策…

FastAPI解決跨域報錯net::ERR_FAILED 200 (OK)

目錄 一、跨域問題的本質 二、FastAPI中的CORS處理 1. 安裝FastAPI和CORS中間件 2. 配置CORS中間件 3. 運行FastAPI應用 三、解決跨域報錯的步驟 四、案例:解決Vue.js與FastAPI的跨域問題 1. Vue.js前端應用 2. FastAPI后端API 3. 配置CORS中間件 4. 運行和測試 五…

為什么 JavaScript 中的 `new` 運算符報錯?

在 JavaScript 中,new 運算符通常用于創建一個新對象并調用構造函數來初始化對象。然而,new 運算符可能會引發一些錯誤,通常是由于以下原因導致的: 構造函數沒有正確的定義: 如果使用 new 運算符調用的函數沒有正確地定…

霍爾效應電流傳感器

適用于大電流,低功耗的電流檢測: TVS選型: RS232的隔離電路: 單片機采集200伏高壓 如何做隔離電路: 采用線性光電耦合器HCNR200實現高壓直流母線電壓的精確采樣。還是用電阻分壓,只是在ADC檢測階段加上隔離芯片:

如何設置Java爬蟲的異常處理?

在Java爬蟲中設置異常處理是非常重要的,因為網絡請求可能會遇到各種問題,如連接超時、服務器錯誤、網絡中斷等。通過合理的異常處理,可以確保爬蟲的穩定性和健壯性。以下是如何在Java爬蟲中設置異常處理的步驟和最佳實踐: 1. 使用…

ceph /etc/ceph-csi-config/config.json: no such file or directory

環境 rook-ceph 部署的 ceph。 問題 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…

【計網筆記】習題

物理層 不屬于物理層接口規范定義范疇的是(C) A. 接口形狀 B. 引腳功能 C. 物理地址 D. 信號電平 【2023-912】光網絡只能通過導向型介質傳播。() 【2017-408】若信道在無噪聲情況下的極限數據傳輸速率不小于信噪比為30dB條件下的…

最新 AI 編程工具全面對比:v0、Bolt.new、Cursor、Windsurf

隨著人工智能的快速發展,越來越多的 AI 驅動的開發工具應運而生,旨在提升開發效率、優化開發流程,并減輕開發者的工作負擔。在這個背景下,四款新興的 AI 編程工具:v0、Bolt.new、Cursor 和 Windsurf,各具特…