【STM32F407 PWM配置和應用指南 】

PWM基本概念

PWM(脈沖寬度調制)是一種通過快速開關數字信號來控制模擬電路的技術,通過改變脈沖的占空比來控制平均電壓。STM32F407的定時器外設可以生成PWM信號。

STM32F407 PWM配置步驟

1. 定時器時鐘使能

首先需要使能定時器的時鐘:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 對于TIM3
// 或者
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 對于高級定時器如TIM1

2. GPIO配置

配置用于PWM輸出的GPIO引腳:

GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // 例如TIM3_CH1在PC6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);// 配置引腳復用功能
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);

3. 定時器基本配置

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 8399; // 自動重裝載值
TIM_TimeBaseStructure.TIM_Prescaler = 0; // 預分頻器
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

4. PWM輸出通道配置

TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

5. 使能定時器

TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能ARR預裝載
TIM_Cmd(TIM3, ENABLE); // 使能定時器// 對于高級定時器(如TIM1)還需要以下代碼
TIM_CtrlPWMOutputs(TIM1, ENABLE);

PWM頻率和占空比計算

PWM頻率計算

PWM頻率由以下公式決定:

PWM頻率 = 定時器時鐘頻率 / ((Prescaler + 1) * (Period + 1))

例如,對于84MHz時鐘,Prescaler=0,Period=8399:

PWM頻率 = 84,000,000 / (1 * 8400) = 10,000 Hz (10kHz)

占空比設置

占空比通過改變TIM_Pulse值來設置:

占空比 = (TIM_Pulse + 1) / (Period + 1)

例如,要設置50%占空比:

TIM_SetCompare1(TIM3, 4199); // (8400 / 2) - 1

PWM應用示例

控制LED亮度

void PWM_LED_Init(void)
{// 初始化代碼如上...// 設置PWM頻率為1kHzTIM_TimeBaseStructure.TIM_Period = 83999; // 84MHz/84000 = 1kHzTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// 初始占空比50%TIM_SetCompare1(TIM3, 41999);
}// 改變亮度
void Set_LED_Brightness(uint8_t brightness) // brightness: 0-100
{uint32_t pulse = (brightness * 83999) / 100;TIM_SetCompare1(TIM3, pulse);
}

控制電機速度

void PWM_Motor_Init(void)
{// 初始化代碼...// 設置PWM頻率為20kHzTIM_TimeBaseStructure.TIM_Period = 4199; // 84MHz/4200 = 20kHzTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// 初始速度為0TIM_SetCompare1(TIM3, 0);
}void Set_Motor_Speed(uint8_t speed) // speed: 0-100
{uint32_t pulse = (speed * 4199) / 100;TIM_SetCompare1(TIM3, pulse);
}

使用HAL庫配置PWM

// 1. 定時器句柄聲明
TIM_HandleTypeDef htim3;
TIM_OC_InitTypeDef sConfigOC;// 2. 定時器基本配置
htim3.Instance = TIM3;
htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 8399;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim3);// 3. PWM通道配置
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);// 4. 啟動PWM
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);// 改變占空比
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 4200); // 設置50%占空比

高級應用技巧

互補PWM輸出(用于電機驅動)

// 配置主輸出
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);// 使能死區時間
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = 0x54; // 設置死區時間
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);TIM_CtrlPWMOutputs(TIM1, ENABLE);

多通道PWM同步

// 配置多個通道
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC3Init(TIM3, &TIM_OCInitStructure);// 使用主從模式同步多個定時器
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);

調試技巧

  1. 使用示波器檢查PWM波形是否符合預期
  2. 檢查時鐘配置是否正確
  3. 確保GPIO引腳復用功能配置正確
  4. 驗證預分頻器和自動重裝載值計算是否正確
  5. 檢查是否有其他外設沖突使用同一定時器

通過以上步驟和示例,您可以在STM32F407上成功配置和應用PWM功能。

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

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

相關文章

鴻蒙【HarmonyOS 5】 (React Native)的實戰教程

一、環境配置 ?安裝鴻蒙專屬模板? bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ?配置 ArkTS 模塊路徑? 在 entry/src/main/ets 目錄下創建原生模塊&…

MYSQL MGR高可用

1,MYSQL MGR高可用是什么 簡單來說,MySQL MGR 的核心目標就是:確保數據庫服務在部分節點(服務器)發生故障時,整個數據庫集群依然能夠繼續提供讀寫服務,最大限度地減少停機時間。 2. 核心優勢 v…

(18)混合云架構部署

文章目錄 🚀 混合云架構部署:Java應用的云原生之旅🌩? 混合云架構簡介? Java應用云原生部署五大核心技術1?? 容器化與編排技術2?? 服務網格與API網關3?? CI/CD自動化流水線4?? 多云管理平臺5?? 云原生Java框架與運行時 &#x1f…

虛擬現實教育終端技術方案——基于EFISH-SCB-RK3588的全場景國產化替代

一、VR教育終端技術挑戰與替代價值 ?實時交互性能瓶頸? 賽揚N100/N150僅支持3DOF渲染(延遲>25ms),動態手勢識別幀率≤15FPS,難以滿足6DOF教學場景需求RK3588 Mali-G610 GPU支持6DOF空間渲染(延遲≤12ms&…

pikachu靶場通關筆記14 XSS關卡10-XSS之js輸出(五種方法滲透)

目錄 一、源碼分析 1、進入靶場 2、代碼審計 二、滲透實戰 1、根據提示輸入tmac 2、XSS探測 3、注入Payload1 4、注入Payload2 5、注入Payload3 6、注入Payload4 7、注入Payload5 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關)滲透集合&#x…

PARADISE:用于新生兒缺氧缺血性腦病(HIE)疾病識別與分割的個性化和區域適應性方法|文獻速遞-深度學習醫療AI最新文獻

Title 題目 PARADISE: Personalized and regional adaptation for HIE disease identification and segmentation PARADISE:用于新生兒缺氧缺血性腦病(HIE)疾病識別與分割的個性化和區域適應性方法 1 文獻速遞介紹 缺氧缺血性腦病&…

OpenCV C++ 心形雨動畫

?? OpenCV C 心形雨動畫 ?? 本文將引導你使用 C 和 OpenCV 庫創建一個可愛的心形雨動畫。在這個動畫中,心形會從屏幕頂部的隨機位置落下,模擬下雨的效果。使用opencv定制自己的專屬背景 目錄 簡介先決條件核心概念實現步驟 創建項目定義心形結構…

【記錄】Python|Python支持if 1<a<2、if not a、if a is None這三種寫法

今天讓AI幫我寫代碼&#xff0c;突然發現寫出來一句類似1<a<2&#xff0c;我頓感疑惑&#xff1a;不是只能用and連接嗎&#xff1f; 一試發現真行&#xff0c;那我辛辛苦苦寫了好幾年的 (條件1) and (條件2) 算什么&#xff1f;算我勤快嗎&#xff1f;&#x1f62d; 常…

Matlab | MATLAB 中的插值詳解

MATLAB 中的插值詳解 插值是數值分析中的核心技術,用于在已知數據點之間估計未知點的值。MATLAB 提供了完整的插值函數庫,涵蓋一維到高維數據,支持多種插值方法。以下從基礎到高級全面解析: 一、插值核心概念 1. 數學本質 給定數據點 ( x i , y i ) (x_i, y_i) (<

正則表達式檢測文件類型是否為視頻或圖片

// 配置化文件類型檢測&#xff08;集中管理支持的類型&#xff09; const FILE_TYPE_CONFIG {video: {extensions: [mp4, webm, ogg, quicktime], // 可擴展支持更多格式regex: /^video\/(mp4|webm|ogg|quicktime)$/i // 自動生成正則},image: {extensions: [jpeg, jpg, png,…

Redis最佳實踐——熱點數據緩存詳解

Redis在電商熱點數據緩存中的最佳實踐 一、熱點數據定義與識別 1. 熱點數據特征 高頻訪問&#xff08;QPS > 1000&#xff09;數據規模適中&#xff08;單條 < 10KB&#xff09;數據變化頻率低&#xff08;更新間隔 > 5分鐘&#xff09;業務關鍵性高&#xff08;直接…

8088單板機C語言sprintf()格式化串口輸出---Prj04

#include "tiny_stdarg.h" // 使用自定義可變參數實現#define ADR_273 0x0200 #define ADR_244 0x0400 #define LED_PORT 0x800 #define PC16550_THR 0x1f0 #define PC16550_LSR 0x1f5 / //基本的IO操作函數 / char str[]"Hello World! 20250531 Ve…

【面試】音視頻面試

H.264 與 H.265 有什么區別&#xff1f; 1&#xff09;主要區別 H.265 也稱為高效視頻編碼 (HEVC)&#xff0c;是 H.264 的升級和更高級的版本&#xff1b;H.265 的編碼架構大致上 和 H.264 的架構相似&#xff0c;主要也包含&#xff1a;幀內預測&#xff08;intra predicti…

Windows系統下npm報錯node-gyp configure got “gyp ERR“解決方法

感謝原博主&#xff0c;此文參考網址&#xff1a;https://zhuanlan.zhihu.com/p/398279220 確保已經安裝node.js &#xff08;官方網址&#xff1a;https://nodejs.org/zh-cn/download&#xff09; 首先在命令窗口執行命令安裝windows-build-tools&#xff1a; npm install -…

git stash命令用法

git stash 是 Git 中一個非常有用的命令&#xff0c;它可以臨時保存當前工作區的修改&#xff0c;讓你可以切換到其他分支或者處理其他任務&#xff0c;而不需要提交這些還未完成的修改。 一、基本用法 1. 保存當前修改&#xff08;包括暫存區和工作區的內容&#xff09; git…

【C語言練習】080. 使用C語言實現簡單的數據庫操作

080. 使用C語言實現簡單的數據庫操作 080. 使用C語言實現簡單的數據庫操作使用原生APIODBC接口第三方庫ORM框架文件模擬1. 安裝SQLite2. 示例代碼:使用SQLite創建數據庫、表和插入數據3. 編譯和運行4. 示例運行輸出:5. 注意事項6. 總結080. 使用C語言實現簡單的數據庫操作 在…

2025年目前最新版本Android Studio自定義xml預覽的屏幕分辨率

一、前言 在實際開發項目當中&#xff0c;我們的設備的分辨率可能會比較特殊&#xff0c;AS并沒有自帶這種屏幕分辨率的設備&#xff0c;但是我們又想一邊編寫XML界面&#xff0c;一邊實時看到較為真實的預覽效果&#xff0c;該怎么辦呢&#xff1f;在早期的AS版本中&#xff…

Edge Databases:賦能分布式計算環境

Edge 計算通過將數據處理推向數據源頭徹底改變了傳統計算范式。隨著物聯網設備、移動應用和分布式系統的大規模部署&#xff0c;面向邊緣場景優化的數據庫解決方案已成為關鍵技術需求。這類專用數據庫能夠在算力有限、內存受限且網絡連接不穩定的終端設備上穩定運行&#xff0c…

Pluto論文閱讀筆記

主要還是參考了這一篇論文筆記&#xff1a;https://zhuanlan.zhihu.com/p/18319150220 Pluto主要有三個創新點&#xff1a; 橫向縱向用lane的query來做將軌跡投回柵格化地圖&#xff0c;計算碰撞loss對數據進行正增強和負增強&#xff0c;讓正增強的結果也無增強的結果相近&a…

【計算機網絡】傳輸層UDP協議

&#x1f525;個人主頁&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收錄專欄&#x1f308;&#xff1a;計算機網絡 &#x1f339;往期回顧&#x1f339;&#xff1a; 【計算機網絡】應用層協議Http——構建Http服務服務器 &#x1f516;流水不爭&#xff0c;爭的是滔滔不…