STM32F103_LL庫+寄存器學習筆記23 - PWM波形輸出及軟件方式調整周期與占空比

導言


脈寬調制(PWM)是 STM32 定時器最常用的輸出模式之一,廣泛應用于電機驅動、LED 調光、伺服控制和功率管理等場景。本篇文章將以 TIM5 為例,從寄存器層面深入剖析 PWM 輸出的原理與實現步驟。通過本篇博客,你不僅能掌握 CubeMX 及 LL 庫的調用,更能從底層寄存器視角構建完整的 PWM 輸出思維,為后續復雜控制奠定堅實基礎。
本章節使用TIM5生成周期為1ms的PWM波形,占空比50%。并介紹如何通過軟件方式改變PWM波形的周期與占空比。

如圖所示,PWM的頻率是1kHz(周期1ms),占空比500us(50%)。
在這里插入圖片描述
項目地址:
github:

  • LL庫: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library23_TIM_Generate_PWM
  • 寄存器方式: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_reg_library23_TIM_Generate_PWM

gitee(國內):

  • LL庫: https://gitee.com/wallace89/MCU_Develop/tree/main/stm32f103_ll_library23_TIM_Generate_PWM
  • 寄存器方式: https://gitee.com/wallace89/MCU_Develop/tree/main/stm32f103_reg_library23_TIM_Generate_PWM

一、LL庫


1.1、CubeMX

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

1.2、tim.c

在這里插入圖片描述
CubeMX 根據上述配置,自動生成了相應初始化代碼。

1.3、main.c

在這里插入圖片描述

1.4、編譯、調試

在這里插入圖片描述
編譯通過。

1.5、修改PWM波形的周期與占空比

在這里插入圖片描述
如上所示:

  1. 函數LL_TIM_OC_SetCompareCH1()修改CH1的占空比,即TIM5_CCR1的值。
  2. 函數LL_TIM_SetAutoReload()修改TIM5_ARR的值,改變TIM5的PWM周期。
    在這里插入圖片描述
    如上所示,PWM的周期從原來的1ms變成2ms,占空比500us變成100us。所以,占空比 = 100us / 2000us = 5%。

二、寄存器方式


2.1、TIM5PWMOutput_reg.c

#include "TIM5PWMOutput/TIM5PWMOutput_reg.h"/*** @brief  啟動 TIM5 通道1 的 PWM 輸出* @retval 無*/
void TIM5_PWM_Start(void)
{/* 使能 CC1 輸出 */TIM5->CCER |= TIM_CCER_CC1E;/* 使能定時器計數 */TIM5->CR1 |= TIM_CR1_CEN;/* 立即生效:觸發更新事件,加載預裝載寄存器 */TIM5->EGR |= TIM_EGR_UG;
}/*** @brief  停止 TIM5 通道1 的 PWM 輸出* @retval 無*/
void TIM5_PWM_Stop(void)
{/* 禁用定時器計數 */TIM5->CR1 &= ~TIM_CR1_CEN;/* 禁用 CC1 輸出 */TIM5->CCER &= ~TIM_CCER_CC1E;
}/*** @brief  設置 PWM 占空比(通道1)* @param  ccr: 比較寄存器值,范圍 0 ~ (ARR+1)* @retval 無*/
void TIM5_PWM_SetDuty(uint16_t ccr)
{TIM5->CCR1 = ccr;/* 若需立即生效,可取消注釋觸發更新事件 */// TIM5->EGR |= TIM_EGR_UG;
}/*** @brief  設置 PWM 周期(自動重裝載寄存器)* @param  arr: 自動重裝載寄存器值(周期 - 1)* @retval 無*/
void TIM5_PWM_SetPeriod(uint16_t arr)
{TIM5->ARR = arr;/* 若已使能 ARR 預裝載,則需要觸發更新事件 */TIM5->EGR |= TIM_EGR_UG;
}/*** @brief  配置并初始化 TIM5 通道1 PWM 輸出(PA0 = TIM5_CH1)* @param  arr: 自動重裝載寄存器值(周期 - 1)* @param  psc: 預分頻器值* @retval 無*/
void TIM5_PWM_Init(uint16_t psc, uint16_t arr, uint16_t ccr)
{/* 1. 使能時鐘:TIM5(APB1), GPIOA(APB2) */RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;/* 2. 配置 PA0 為復用推挽輸出 */GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0);GPIOA->CRL |=  (GPIO_CRL_MODE0_0   /* 輸出模式,10 MHz */| GPIO_CRL_CNF0_1);  /* 復用推挽 *//* 3. 配置 TIM5 基礎計數 */TIM5->PSC  = psc;    /* 預分頻 */TIM5->ARR  = arr;    /* 自動重裝載 *//* 使能 ARR 預裝載 */TIM5->CR1 |= TIM_CR1_ARPE;/* 4. 配置通道1 為 PWM1 模式 */TIM5->CCMR1 &= ~TIM_CCMR1_OC1M;TIM5->CCMR1 |=  (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1); /* PWM 模式1 *//* 使能 CCR1 預裝載 */TIM5->CCMR1 |= TIM_CCMR1_OC1PE;/* 默認占空比 0 */TIM5->CCR1 = ccr;/* 5. 設置極性(高電平有效)并暫時禁用輸出 */TIM5->CCER &= ~TIM_CCER_CC1P;TIM5->CCER &= ~TIM_CCER_CC1E;
}

2.2、TIM5PWMOutput_reg.h

/*** @file    TIM5PWMOutput_reg.h* @brief   基于寄存器的 TIM5 驅動接口與寄存器定義** 本文件提供 STM32F1 系列 MCU 的 TIM5 基礎定時器底層寄存器訪問定義、* 配置參數以及初始化和控制函數原型。通過直接操作寄存器,實現對 TIM5* 外設的高效、精細化控制。** @note* - 該驅動不依賴 HAL/LL 庫,完全通過寄存器位操作完成時鐘使能、*   預分頻、計數器模式等配置。** @version 1.0.0* @date    2025-05-13* @author  Wallace.zhang** @copyright* (C) 2025 Wallace.zhang。保留所有權利。** @license SPDX-License-Identifier: MIT*/
#ifndef __TIM5PWMOUTPUT_REG_H
#define __TIM5PWMOUTPUT_REG_H#ifdef __cplusplus
extern "C" {
#endif#include "main.h"void TIM5_PWM_Start(void);
void TIM5_PWM_Stop(void);
void TIM5_PWM_SetDuty(uint16_t ccr);
void TIM5_PWM_SetPeriod(uint16_t arr);
void TIM5_PWM_Init(uint16_t psc, uint16_t arr, uint16_t ccr);#ifdef __cplusplus
}
#endif#endif /* __TIM5PWMOUTPUT_REG_H */

2.2、main.c

在這里插入圖片描述
如上所示,在main()函數里依次調用兩個函數即可。

2.4、編譯、調試

在這里插入圖片描述
將代碼燒錄進去,效果跟LL庫一樣。

三、梳理寄存器


3.1、TIMx_CCMR1捕獲/比較模式寄存器1

在這里插入圖片描述
在這里插入圖片描述
如上所示,設置PWM模式1將OC1M設置110。

/* 4. 配置通道1 為 PWM1 模式 */
TIM5->CCMR1 &= ~TIM_CCMR1_OC1M; // 清0
TIM5->CCMR1 |=  (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1); /* PWM 模式1 */

另外,將OC1PE設置1,使能CCR1的預裝載。

/* 使能 CCR1 預裝載 */
TIM5->CCMR1 |= TIM_CCMR1_OC1PE;

3.2、TIMx_CCER捕獲/比較使能寄存器

在這里插入圖片描述

/* 5. 設置極性(高電平有效)并暫時禁用輸出 */
TIM5->CCER &= ~TIM_CCER_CC1P; // 高電平有效
TIM5->CCER &= ~TIM_CCER_CC1E; // 禁用輸出

3.3、TIMx_EGR事件產生寄存器

在這里插入圖片描述

/* 6. 觸發更新事件,立即加載預裝載寄存器 */
TIM5->EGR |= TIM_EGR_UG;

四、細節補充


4.1、PWM波形的啟動與關閉

在這里插入圖片描述
如上所示,從寄存器代碼看來,啟動與關閉PWM輸出有兩個開關。分別是CHx的開關(CC1E)與定時器的開關(CEN)。

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

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

相關文章

堆(Heap)

1. 堆(Heap) 1.1. Python實現堆的插入、堆頂刪除和排序 class MaxHeap:def __init__(self):# 初始化空堆,使用列表表示self.heap []def insert(self, val):# 插入元素并執行上浮self.heap.append(val)self._sift_up(len(self.heap) - 1)de…

Spring類

BeanDefinition BeanDefinition表示Bean定義,BeanDefinition中存在很多屬性用來描述一個Bean的特點。比如: class,表示Bean類型scope,表示Bean作用域,單例或原型等lazyInit:表示Bean是否是懶加載initMeth…

在vue中this.$emit有哪些作用,事件監控具體含義,以及這些子組件能封裝哪些功能組件

this.$emit 的作用 this.$emit 的作用是觸發一個自定義事件,并將數據傳遞給父組件。父組件可以通過 v-on(或 )監聽這個事件,并在事件觸發時執行相應的處理函數。 this.content 的作用 this.content 是子組件的 props&#xff0…

前端流行框架Vue3教程:16. 組件事件配合`v-model`使用

組件事件配合v-model使用 如果是用戶輸入,我們希望在獲取數據的同時發送數據配合v-model 來使用,幫助理解組件間的通信和數據綁定。 🧩 第一步:創建子組件(SearchComponent.vue) 這個組件用于處理用戶的搜…

《Navicat之外的新選擇:實測支持國產數據庫的SQLynx核心功能解析》

數據庫工具生態的新變量 在數據庫管理工具領域,Navicat長期占據開發者心智。但隨著國產數據庫崛起和技術信創需求,開發者對工具的兼容性、輕量化和本土化適配提出了更高要求。近期體驗了一款名為SQLynx的國產數據庫管理工具(麥聰旗下產品&am…

AgenticSeek開源的完全本地的 Manus AI。無需 API,享受一個自主代理,它可以思考、瀏覽 Web 和編碼,只需支付電費。

?一、軟件介紹 文末提供程序和源碼下載 AgenticSeek開源的完全本地的 Manus AI。無需 API,享受一個自主代理,它可以思考、瀏覽 Web 和編碼,只需支付電費。這款支持語音的 AI 助手是 Manus AI 的 100% 本地替代品 ,可自主瀏覽網頁…

vue3.0的name屬性插件——vite-plugin-vue-setup-extend

安裝 這個由于是在開發環境下的一個插件 幫助我們支持name屬性 所以需要是-D npm i vite-plugin-vue-setup-extend -D在pasckjson中無法注釋每個插件的用處 可以在vscode中下載一個JsonComments這樣可以在json中添加注釋方便日后維護和查閱API 引入 在vite.config.js中 im…

Linux基礎 -- 在內存中使用chroot修復eMMC

Linux基礎 – 在內存中使用chroot修復eMMC 概述 本教程將介紹如何在Linux系統中,使用chroot在內存中構建一個臨時系統,并在不依賴原有系統的情況下修復eMMC(如/dev/mmcblk2)磁盤。該方法適用于嵌入式系統修復、磁盤清理以及離線…

人工智能、深度學習、機器學習的聯系與區別

定義 人工智能(AI - Artificial Intelligence) :是研究、開發用于模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。它旨在讓計算機能夠像人類一樣思考、學習和決策,涉及到諸如計算機視覺、自然語言處理…

web第二次課后作業--設計一個注冊登錄系統

一、頁面展示 登錄頁面 提交頁面 二、代碼 2.1 登錄頁面 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><html> <head><meta http-equiv"Content-Type" content"…

電腦桌面便簽哪個好?2025年電腦免費用的便簽軟件推薦

我們都知道&#xff0c;一個優秀的桌面便簽軟件可以成為提高效率的得力助手。無論是記錄臨時靈感、管理待辦事項&#xff0c;還是提醒重要日程&#xff0c;合適的便簽工具都能讓您的數字生活更加有序。本文將為您介紹2025年最值得推薦的免費電腦桌面便簽軟件&#xff0c;從Wind…

【SPIN】用Promela驗證順序程序:從斷言到SPIN實戰(SPIN學習系列--2)

你寫了一段自認為“天衣無縫”的程序&#xff0c;但如何確保它真的沒有bug&#xff1f;靠手動測試&#xff1f;可能漏掉邊界情況&#xff1b;靠直覺&#xff1f;更不靠譜&#xff01;這時候&#xff0c;Promela SPIN組合就像程序的“顯微鏡”——用形式化驗證技術&#xff0c;…

LabVIEW中樣條插值實現及應用

在 LabVIEW 編程環境下&#xff0c;B - 樣條插值是處理數據擬合與曲線平滑的重要工具。它憑借靈活的特性和良好的數學性質&#xff0c;在眾多工程領域中發揮著關鍵作用&#xff0c;能夠高效地根據離散數據點生成平滑連續的曲線&#xff0c;為數據分析和處理提供了有力支持。 一…

【油藏地球物理正演軟件ColchisFM】基于數據驅動的油藏參數疊前地震反演研究進展

科吉思基于油藏地球物理參數的正演軟件ColchisFM&#xff0c;有機融合了巖石物理正演與地震正演&#xff0c;具有良好的適用性和便捷性&#xff0c;在業內已經廣泛使用。當用戶在做正演模擬的同時&#xff0c;自然會聯想到是否可以直接開展油藏地球物理參數反演呢&#xff1f;答…

互聯網大廠Java求職面試:AI與大模型集成的云原生架構設計

互聯網大廠Java求職面試&#xff1a;AI與大模型集成的云原生架構設計 引言 在現代互聯網企業中&#xff0c;AI與大模型技術的應用已經成為不可或缺的一部分。特別是在短視頻平臺、電商平臺和金融科技等領域&#xff0c;如何高效地將大模型集成到現有的云原生架構中是一個巨大…

Web GIS可視化地圖框架Leaflet、OpenLayers、Mapbox、Cesium、ArcGis for JavaScript

Mapbox、OpenLayers、Leaflet、ArcGIS for JavaScript和Cesium是五種常用的Web GIS地圖框架&#xff0c;它們各有優缺點&#xff0c;適用于不同的場景。還有常見的3d庫和高德地圖、百度地圖。 1. Mapbox 官網Mapbox Gl JS案列&#xff1a;https://docs.mapbox.com/mapbox-gl-…

專項智能練習(加強題型)-DA-02

2. 單選題 近年來&#xff0c;“斜杠青年”成為很多人的時尚追求。它指的是一群不再滿足“專一職業”生活方式&#xff0c;而選擇擁有多重職業和身份的多元生活人群。對此&#xff0c;有人認為&#xff0c;新產業新技術新業態不斷更迭&#xff0c;激烈的競爭促使青年人不斷進行…

使用gitbook 工具編寫接口文檔或博客

步驟一&#xff1a;在項目目錄中初始化一個 GitBook 項目 mkdir mybook && cd mybook git init npm init -y步驟二&#xff1a;添加書籍結構&#xff08;如 book.json, README.md&#xff09; echo "# 我的書" > README.md echo "{}" > bo…

Malformed input or input contains unmappable characters解決

JDK 17 文件上傳編碼異常解決方案技術文檔 1. 問題背景 在 JDK 17 環境下&#xff0c;文件上傳過程中可能拋出 Malformed input or input contains unmappable characters 錯誤。此問題通常由以下原因觸發&#xff1a; 文件路徑/名稱包含非 ASCII 字符&#xff08;如中文、日…

MyBatis 的分頁插件 c

前言 大型項目的數據體量很大&#xff0c;在前端界面展示時為保障展示效果&#xff0c;會要求接口快速返回&#xff0c;這時候后端會選擇分頁獲取數據&#xff0c;只傳遞要查詢的頁碼數據。這就避免了大多問題&#xff0c;達到快速返回的效果。 常用的分頁有2種&#xff1a; …