STM32 定時器(PWM輸入捕獲)

以下是基于STM32標準庫(以STM32F103為例)實現PWM輸入模式(自動雙沿捕獲)的完整代碼,通過配置定時器的PWM輸入模式,可自動捕獲外部PWM信號的周期(頻率)?占空比,無需手動切換邊沿。


🛠 ?完整代碼實現?

1. 硬件配置
  • ?引腳?:PA6(TIM3_CH1,支持PWM輸入模式)
  • ?定時器?:TIM3(支持從模式復位)
  • ?功能?:自動捕獲上升沿(周期)和下降沿(占空比)
#include "stm32f10x.h"// 全局變量存儲PWM參數
volatile uint32_t PWM_Period = 0;    // 周期值(頻率計算用)
volatile uint32_t PWM_Duty = 0;      // 占空比值// 初始化函數
void PWM_Input_Init(void) 
{// 1. 開啟時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 2. 配置PA6為浮空輸入(復用功能)GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;  // 浮空輸入GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// 3. 定時器基礎配置(1MHz計數頻率,72MHz主頻分頻后)TIM_TimeBaseInitTypeDef TIM_BaseStruct;TIM_BaseStruct.TIM_Period = 0xFFFF;                 // ARR = 65535(最大計數)TIM_BaseStruct.TIM_Prescaler = 72 - 1;              // 72分頻 → 1MHz計數TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_BaseStruct);// 4. 配置PWM輸入模式(關鍵!)TIM_ICInitTypeDef TIM_ICStruct;TIM_ICStruct.TIM_Channel = TIM_Channel_1;            // 通道1(PA6)TIM_ICStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿觸發TIM_ICStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接輸入TIM_ICStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;       // 不分頻TIM_ICStruct.TIM_ICFilter = 0x0;                     // 無濾波TIM_PWMIConfig(TIM3, &TIM_ICStruct);                // 自動配置雙通道// 5. 從模式配置(復位模式)TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);       // TI1作為觸發源TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);     // 觸發時復位計數器// 6. 開啟捕獲中斷TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE); // 使能通道1&2中斷// 7. 配置NVICNVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);// 8. 啟動定時器TIM_Cmd(TIM3, ENABLE);
}// 中斷服務函數
void TIM3_IRQHandler(void) 
{if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) {   // 通道1中斷(周期捕獲)PWM_Period = TIM_GetCapture1(TIM3);             // 讀取周期值(上升沿時間)TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);        // 清除標志}if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) {   // 通道2中斷(占空比捕獲)PWM_Duty = TIM_GetCapture2(TIM3);               // 讀取占空比值(下降沿時間)TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);}
}// 計算頻率(Hz)和占空比(%)
float PWM_Get_Frequency(void) 
{return 1000000.0f / (PWM_Period );  // 1MHz計數 → 單位:Hz
}float PWM_Get_DutyCycle(void) 
{return (PWM_Duty + 0.0f) / (PWM_Period + 0.0f) * 100.0f; // 占空比百分比
}

?? ?工作原理?

  1. ?PWM輸入模式?

    • 使用?TIM_PWMIConfig()?自動配置兩個通道:
      • ?通道1(直接輸入)??:捕獲上升沿 → ?周期值存入CCR1。
      • ?通道2(間接輸入)??:捕獲下降沿 → ?占空比值存入CCR2。
    • 無需手動切換極性,硬件自動完成雙沿捕獲。
  2. ?從模式復位?

    • 觸發源設為?TI1FP1(通道1的濾波后信號)。
    • 從模式設為?Reset:上升沿時復位計數器,確保每次捕獲的周期值準確。
  3. ?參數計算?

    • ?頻率?:Freq = 1MHz / (CCR1 + 1)
    • ?占空比?:Duty = (CCR2 + 1) / (CCR1 + 1) * 100%

?? ?關鍵注意事項?

  1. ?引腳復用?
    • 確保PA6映射到TIM3_CH1(參考芯片手冊)。
  2. ?時鐘配置?
    • 默認使用72MHz系統時鐘,需在?SystemInit()?中正確配置。
  3. ?抗干擾設計?
    • 若信號抖動大,增加?TIM_ICStruct.TIM_ICFilter(0-15)濾波。
  4. ?測量范圍?
    • 最大頻率受限于定時器計數頻率(1MHz下最高約500kHz)。

🔍 ?擴展應用?

  • ?多通道捕獲?:若需同時捕獲多路PWM,使用不同定時器(如TIM2/TIM4)。
  • ?高精度需求?:減少預分頻值(如?TIM_Prescaler = 0)可提升計時分辨率。
  • ?實時處理?:在中斷中直接計算頻率/占空比,避免全局變量延遲。

此代碼通過STM32硬件自動完成雙沿捕獲,顯著降低CPU負載,適用于電機控制、遙控信號解析等場景。實際使用時需根據信號特性調整濾波參數,并注意定時器溢出處理(如信號周期 > 65ms)

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

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

相關文章

Web安全開發指導規范文檔V1.0

一、背景 團隊最近頻繁遭受網絡攻擊,引起了部門技術負責人的重視,筆者在團隊中相對來說更懂安全,因此花了點時間編輯了一份安全開發自檢清單,覺得應該也有不少讀者有需要,所以將其分享出來。 二、編碼安全 2.1 輸入驗證 說明 檢查項 概述 任何來自客戶端的數據,如URL和…

在Godot中為您的游戲添加并控制游戲角色的完整技術指南

這是一個在Godot中為您的游戲添加并控制玩家角色的完整技術指南。這個過程分為三大步:?準備資源、構建場景、編寫控制腳本。道可道,非常道,名可名,非常名!第一步:準備資源(建模與動畫&#xff…

Flink 狀態 RocksDBListState(寫入時的Merge優化)

RocksDBListState<K, N, V> RocksDBListState 繼承自 AbstractRocksDBState<K, N, List<V>>&#xff0c;并實現了 InternalListState<K, N, V> 接口。繼承 AbstractRocksDBState: 這意味著它天然獲得了與 RocksDB 交互的底層能力&#xff0c;包括&…

zookeeper-保姆級配置說明

一. 基本配置&#xff1a;clientPort&#xff1a; 客戶端連接的服務器所監聽的tcp端口&#xff0c;默認2181dataDir&#xff1a;內存數據庫保存的數據路徑。myid也存放在這個目錄下&#xff0c;數據以異步方式寫入。dataLogDir&#xff1a;事務日志存放路徑。服務在確認一個事務…

半小時打造七夕傳統文化網站:Qoder AI編程實戰記錄

背景 最近七夕到了&#xff0c;恰逢Qoder上線&#xff0c;萌生了一個想法&#xff0c;寫一個以中國傳統七夕為主題的網站。 七夕中國傳統情人節 Qoder 介紹 Qoder 是阿里巴巴推出的一款旨在提升開發效率的 AI 編程平臺。它通過上下文工程技術和智能體輔助&#xff0c;幫助開…

常見的 Loader 和 Plugin?

Loader: babel-loader&#xff1a;將ES6的代碼轉換成ES5的代碼。css-loader&#xff1a;解析CSS文件&#xff0c;并處理CSS中的依賴關系。style-loader&#xff1a;將CSS代碼注入到HTML文檔中。file-loader&#xff1a;解析文件路徑&#xff0c;將文件賦值到輸出目錄&#xff0…

設計模式學習筆記-----抽象策略模式

抽象策略模式由五個核心組件組成策略接口定義所有策略的統一規范&#xff0c;是策略模式的 "契約"mark()&#xff1a;策略的唯一標識&#xff08;類似字典的 key&#xff09;&#xff0c;默認返回 null&#xff0c;需具體策略實現類重寫&#xff08;如InterviewSubje…

RabbitMQ面試精講 Day 30:RabbitMQ面試真題解析與答題技巧

【RabbitMQ面試精講 Day 30】RabbitMQ面試真題解析與答題技巧 開篇&#xff1a;系列收官之作&#xff0c;直擊面試核心 今天是“RabbitMQ面試精講”系列的第30天&#xff0c;也是本系列的收官之作。經過前29天對RabbitMQ核心概念、高級特性、集群架構、性能調優與開發運維的系…

Coze Studio開源版:AI Agent開發平臺的深度技術解析- 入門篇

Coze Studio開源版&#xff1a;AI Agent開發平臺的深度技術解析 引言 在人工智能快速發展的今天&#xff0c;AI Agent&#xff08;智能體&#xff09;已成為連接大語言模型與實際應用場景的重要橋梁。然而&#xff0c;構建一個功能完整、性能穩定的AI Agent開發平臺并非易事&am…

一文了解 DeepSeek 系列模型的演進與創新

近年來&#xff0c;DeepSeek 團隊在大語言模型&#xff08;LLM&#xff09;領域持續發力&#xff0c;圍繞模型架構、專家路由、推理效率、訓練方法等方面不斷優化&#xff0c;推出了一系列性能強勁的開源模型。本文對 DeepSeek 系列的關鍵論文進行了梳理&#xff0c;幫助大家快…

開源大模型本地部署

一、大模型 T5\BERT\GPT → Transformer的兒子→自注意力機制神經網絡 大模型&#xff0c; Large Model&#xff0c;是指參數規模龐大、訓練數據量巨大、具有強泛化能力的人工智能模型&#xff0c;典型代表如GPT、BERT、PaLM等。它們通常基于深度神經網絡&#xff0c;特別是T…

DAY 57 經典時序預測模型1

知識點回顧 序列數據的處理&#xff1a; 處理非平穩性&#xff1a;n階差分處理季節性&#xff1a;季節性差分自回歸性無需處理 模型的選擇 AR(p) 自回歸模型&#xff1a;當前值受到過去p個值的影響MA(q) 移動平均模型&#xff1a;當前值收到短期沖擊的影響&#xff0c;且沖擊影…

貪吃蛇游戲(純HTML)

一、游戲截圖二、源碼 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>離譜貪吃蛇</title>…

InnoDB詳解2

InnoDB詳解2一.行結構1.結構圖2.InnoDB支持的數據行格式1&#xff09;查看當前數據庫或表的行格式2&#xff09;指定行格式3&#xff09;DYNAMIC 格式的組成3.數據區存儲真實數據方式4.行的額外(管理)信息區5.頭信息區域1&#xff09;刪除一行記錄時在InnoDB內部執行的操作6.Nu…

Rust系統編程實戰:駕馭內存安全、無畏并發與WASM跨平臺開發

簡介本文深入探討Rust在系統編程領域的核心實戰應用&#xff0c;通過代碼示例解析其所有權機制如何保障內存安全&#xff0c;如何利用 fearless concurrency 構建高性能并發應用&#xff0c;并實踐如何將Rust代碼編譯為WebAssembly&#xff08;WASM&#xff09;以突破性能瓶頸。…

JavaScript 基礎入門:從概念解析到流程控制

文章目錄1. JavaScript 核心認知1.1 瀏覽器與 JavaScript 的關系1.2 JavaScript 的三大核心組成1.3 JavaScript 引入1.3.1 內聯腳本&#xff08;事件屬性綁定&#xff09;1.3.2 內部腳本&#xff08;<script> 標簽嵌入&#xff09;1.3.3 外部腳本&#xff08;獨立 .js 文…

WebSocket簡單了解

WebSocket 是一種計算機網絡通信協議&#xff0c;它在客戶端和服務器之間建立一個持久的、雙向的通信通道。與傳統的 HTTP 請求-響應模型不同&#xff0c;WebSocket 允許數據在客戶端和服務器之間實時雙向傳輸&#xff0c;因此非常適合需要即時交互的應用&#xff0c;如實時聊天…

【實時Linux實戰系列】基于實時Linux的生物識別系統

在當今數字化時代&#xff0c;生物識別技術因其高安全性和便捷性而被廣泛應用。生物識別系統通過識別個人的生物特征&#xff08;如面部、指紋等&#xff09;來驗證身份&#xff0c;廣泛應用于安全門禁、移動支付、智能設備解鎖等領域。這些系統不僅提高了安全性&#xff0c;還…

匯智煥彩,聚勢創新 - openKylin 2.0 SP2正式發布!

OpenAtom openKylin&#xff08;簡稱 “openKylin”&#xff09; 2.0 SP2版本正式發布&#xff01;本次版本更新在底層核心能力上&#xff0c;持續維護 6.6 穩定版內核&#xff0c;深度適配海光、飛騰、兆芯、龍芯等國產主流芯片&#xff0c;并積極推動 RISC-V 開放指令集架構生…

怎么評估高精度組合慣導的慣性導航價格?

內容概要高精度組合慣導系統的價格評估是一個需要綜合考量多個關鍵因素的復雜過程。理解其成本構成&#xff0c;對于制定合理的采購預算和優化決策至關重要。評估的核心首先聚焦于IMU傳感器價格&#xff0c;這是整個系統成本中最主要的組成部分之一。同時&#xff0c;選擇可靠且…