STM32快速入門(定時器之輸出PWM波形)

STM32快速入門(定時器之輸出PWM波形)

前言

本節主要講解STM32利用通用定時器,利用CCR和CNT寄存器,輸出指定占空比和頻率的PWM波形。其功能的應用有:實現LED呼吸燈的效果、控制步進電機、控制直流電機轉速等。

導航

圖98 通用定時器框圖:

TimerPWM

圖片引自STM32 F1XX系列的中文參考手冊。在通用定時器章節的定時器架構圖中,本章講解的定時器輸出功能位于右下角的紅色矩形中。

定時器實現PWM輸出的實現細節

參考中文手冊,實現細節圖125如下:

PWM

它內部實現是:輸出模式控制器通過比較TIMx_CCR1(比較捕獲寄存器)和TIMx_CNT(計數器)的值,由輸出模式控制器來確定輸出高(有效)電平,還是低(無效)電平,用戶可以通過改變TIMx_CCR1寄存器的值來改變PWM的占空比。這通常會將輸出模式控制器配置成PWM模式1或PWM模式2,兩種模式就是互為取反的關系,同時這兩種模式也是輸出模式控制器最常用的配置。

對于原理圖125左側的輸出模式控制器:

該部分作用是:控制輸出模式控制器的輸出行為。這里將輸出模式控制器的輸出標記為OC1REF。

輸出模式控制器有7種配置,這些配置是通過操作 TIMx_CCMR1.OC1M[6:4] 實現,7種配置在中文手冊中的描述如下,手冊中的描述可能太晦澀,配合江科的表格會更友好:

TIMx_CCMR1__OC1M2

TIMx_CCMR1__OC1M1

對于原理圖125右側:

右側包括一個極性選擇器和輸出使能電路。

該部分作用是:1、對輸出電壓的極性進行控制。2、控制輸出電路的使能。

我們可以通過配置 TIMx_CCER.CC1P[1] 控制選擇器是直接選擇OC1REF波形(輸出模式控制器的輸出)還是選擇OC1REF的反相波形。也就是說,輸出模式控制器配置成PWM1/WPM2可以實現對OC1REF的反相,配置 TIMx_CCER.CC1P[1] 間接配置選擇器也能實現對OC1REF的反相。通過配置 TIMx_CCER.CC1E[0] 可以實現對輸出電路的使能。

由定時器輸出PWM的原理可以得出調節占空比的公式,PWM頻率就是定時器溢出的周期、占空比就是TIMx_CCR1的值,其計算公式如下:

PWMFrequency

關于定時器的PWM模塊還需提一句的是,有三個寄存器存在緩沖寄存器/影子寄存器的概念的,這三個寄存器分別是:ARR、PSC、CCRx。影子寄存器的存在延續舊值的生命周期,這樣讓舊值繼續該時期的使命。如果用戶提供的新值立馬生效,系統就會出于一種未定義的狀態。有了緩沖寄存器/影子寄存器的概念,在一個更新周期中真正起作用的是影子寄存器,而用戶想要修改預分頻控制寄存器,會先將值寫到緩沖器中,待這個更新周期過去,才會將緩沖器的值給到影子寄存器

下面中文手冊的的兩張時序圖可以很好的說明了:

Shadow

緩沖寄存器 ----> 預分頻控制寄存器

影子寄存器 ----> 預分頻緩沖器

還需注意的是:TIMx_CR1.ARPE[7]TIMx_CCMR1.OC1PE[3]寄存器可以讓用戶選擇ARR、CCRx是否啟用影子寄存器的功能,而PSC寄存器默認必須使用影子寄存器的功能,但是用戶可以通過TIM_PrescalerConfig函數動態配置計數器的預分頻系數,它的第三個參數可以選擇TIM_PSCReloadMode_Immediate,這會讓定時器立即產生一個更新事件,間接實現了立即更新的效果。

定時器實現PWM輸出的步驟

綜上,可以總結出配置定時器輸出部分的套路:

  1. 我們需要把 TIMx_CCMR1.CC1S[1:0] 配置為00,這樣CC1通道就被配置為輸出

  2. 通過配置 TIMx_CCMR1.OC1M[6:4] ,這里將輸出模式控制寄存器配置成PWM1模式。即110。

  3. 配置原理圖右部分是否開啟反相 TIMx_CCER.CC1P[1] ,這里配置為0不反相。

  4. 最后使能 TIMx_CCER.CC1E[0] 位,來使能原理圖右邊的輸出使能電路。

一般的話,我門還會配置 TIMx_CCMR1.OC1PE[3]TIMx_CR1.ARPE[7],分別啟用TIMx_CCR1、TIMx_ARR寄存器的影子功能。

定時器實現PWM輸出的庫函數實現

因為我的開發板LED0被焊在了PB5所以,所以需要將定時器的PWM波形輸出到PB5上。經過查表需要對TIM3_CH2輸出進行一個重映射;此外還要將PB5配置成復用推挽輸出的狀態。

GPIOCfg

IORemap

定時器PWM輸出配置,實例代碼如下:

void LunarInitTIM3() {TIM_TimeBaseInitTypeDef TIM3_Cfg;GPIO_InitTypeDef GPIOB5_Cfg;TIM_OCInitTypeDef TIM3_OCCfg;// 定時器時基配置   BEGIN// 打開TIM3所需要的時鐘 APB1RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_TimeBaseStructInit(&TIM3_Cfg);// 配置使用內部時鐘 72M HzTIM_InternalClockConfig(TIM3);// 這里配置定時器更新頻率是1000HZTIM3_Cfg.TIM_CounterMode = TIM_CounterMode_Up;TIM3_Cfg.TIM_Period = 100 - 1;TIM3_Cfg.TIM_Prescaler = 720 - 1;TIM_TimeBaseInit(TIM3, &TIM3_Cfg);// 因為TIM_TimeBaseInit會置TIMx_EGR.UG[0]為1,手動產生一個更新事件,// 同時會同步影子寄存器的值,而該更新事件又會產生一個多余的中斷,所以,// 我們需要在開啟中斷之前,手動清楚更新事件標志位TIM_ClearFlag(TIM3, TIM_FLAG_Update);// 定時器時基配置   END// 配置GPIO 	BEGIN// 開啟復用時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 部分重映射GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);// 初始化GPIOB5為推挽復用輸出RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIOB5_Cfg.GPIO_Mode = GPIO_Mode_AF_PP;GPIOB5_Cfg.GPIO_Pin = GPIO_Pin_5;GPIOB5_Cfg.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOB, &GPIOB5_Cfg);// 配置GPIO 	END// 配置TIM3的PWM輸出	BEGINTIM_OCStructInit(&TIM3_OCCfg);TIM3_OCCfg.TIM_OCMode = TIM_OCMode_PWM1;TIM3_OCCfg.TIM_OCPolarity = TIM_OCPolarity_High;TIM3_OCCfg.TIM_OutputState = TIM_OutputState_Enable;TIM3_OCCfg.TIM_Pulse = 0;TIM_OC2Init(TIM3, &TIM3_OCCfg);// 配置TIM3的PWM輸出	END// 使能arr和ccr寄存器的影子功能TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM3, ENABLE);// 使能更新中斷// TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);// 開啟定時器TIM_Cmd(TIM3, ENABLE);
}int main() {// 初始化定時器LunarInitTIM3();// 初始化系統定時器SYSTick_Init();int dir = 0, cr = 0;while(1) {TIM_SetCompare2(TIM3, cr);Delay_Ms(20);if (dir == 0) {cr++;if (cr > 99) {dir = 1;cr = 99;}} else {cr--;if (cr < 0) {dir = 0;cr = 0;}}}return 0;
}

實驗結果就是PB5處的LED燈實現了呼吸的效果。


本章完結

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

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

相關文章

Java 類加載過程

什么是類加載 Java 類加載是指將 Java 字節碼文件加載到 Java 虛擬機&#xff08;JVM&#xff09;中&#xff0c;并將其轉化為可以執行的可執行代碼的過程。當 Java 程序在運行時引用某個類時&#xff0c;JVM 會首先檢查是否已經加載該類&#xff0c;如果沒有加載&#xff0c;則…

ue5地編模塊學習記錄

ue5網站功能3d溜溜網下載模型https://anyconv.com/max-to-fbx-converter/3dmax轉換fbx模型解決問題記錄 一、光源 搜索光源搜索不到的時候可以點擊 窗口> 對場景內的光照進行處理

【Java】數組訓練案例

訓練案例1 需求描述&#xff1a; 定義一個含有五個元素的數組&#xff0c;并為每個元素賦值&#xff0c;求數組中所有元素的最小值。 操作步驟描述&#xff1a; 1&#xff09; 定義5個元素數組。 2&#xff09; 可以使用初始化數組的兩種方式之一為數組元素賦值。 3&#xff09…

最佳解決Maven同一依賴多版本共存問題,重復依賴(同一個jar包,多個版本)-maven-shade-plugin

先看鏈接:原文鏈接 參照原文鏈接生成的文件(下面是我放的位置) mvn指令 mvn install:install-file -DfileD:\mavenrepository/maven-shade.jar -DgroupIdcom.wj -DartifactIdmaven-shade -Dversion1.1 -Dpackagingjar如果配置了maven_home 和java_home可以任意打開cmd執行(…

Google: 在新知識上微調大語言模型是否會鼓勵產生幻覺?

摘要 當大型語言模型通過監督式微調進行對齊時,它們可能會遇到在預訓練期間沒有獲得的新事實信息。人們經常推測,這可能會教導模型產生事實上不正確的回應的行為,因為模型被訓練成生成沒有基于其預先存在的知識的事實。在這項工作中,Google研究了這種暴露在新知識下對微調后模…

基于springboot實現高校教師電子名片系統項目【項目源碼+論文說明】計算機畢業設計

基于springboot實現高校教師電子名片系統演示 摘要 傳統信息的管理大部分依賴于管理人員的手工登記與管理&#xff0c;然而&#xff0c;隨著近些年信息技術的迅猛發展&#xff0c;讓許多比較老套的信息管理模式進行了更新迭代&#xff0c;名片信息因為其管理內容繁雜&#xff…

C++的數據結構(五):樹和存儲結構及示例

在計算機科學中&#xff0c;樹是一種抽象數據類型&#xff08;ADT&#xff09;或是實現這種抽象數據類型的數據結構&#xff0c;用來模擬具有樹狀結構性質的數據集合。這種數據結構以一系列連接的節點來形成樹形結構。在C中&#xff0c;樹的概念和存儲結構是實現各種復雜算法和…

Java--初識類和對象

前言 本篇講解Java類和對象的入門版本。 學習目的&#xff1a; 1.理解什么是類和對象。 2.引入面向對象程序設計的概念 3.學會如何定義類和創建對象。 4.理解this引用。 5.了解構造方法的概念并學會使用 考慮到篇幅過長問題&#xff0c;作者決定分多次發布。 面向對象的引入 J…

Docker之grep: (standard input): binary file matches

使用 docker compose logs -f | grep 命令時遇到了 grep: (standard input): binary file matches 錯誤。 這個錯誤通常發生在 grep 嘗試搜索包含二進制內容的文件時。docker compose logs 命令會輸出容器的日志&#xff0c;而這些日志可能包含二進制數據&#xff0c;導致 gre…

MySQL查詢篇-集合運算

文章目錄 union &#xff08;并集&#xff09;union distinctunion all intersect(交集)intersect allintersect distinct except 差集except distinctexcept distinctexcept all union &#xff08;并集&#xff09; union distinct 使用前提&#xff1a;a和c數據類型一致&a…

互聯網摸魚日報(2024-05-13)

互聯網摸魚日報(2024-05-13) 36氪新聞 當綠色飛行成為潮流&#xff0c;這家航空公司定下了新目標 | 最前線 回收雨水澆花&#xff0c;廚余垃圾變肥料&#xff0c;我們打卡了阿里北京新園區 | 最前線 本周雙碳大事&#xff1a;中美就氣候問題進行會談&#xff1b;鋰電池行業迎…

GIAT: 蛋白質結構預測的新利器

瑞典Karolinska研究院在瑞典政府贊助下由Ben Murrell等研究團隊在AlphaFold 3最新報告后提出這篇論文提出了一種非常有趣和創新的方法來生成蛋白質骨架結構,稱為生成式不變角度轉換器(GIAT)。與現有的主要基于擴散模型和流匹配的方法不同,GIAT采用了類似于大型語言模型(如GPT)中…

【C語言|數據結構】雙向鏈表

文章目錄 前言1、初步認識雙向鏈表1.1 定義&#xff1a;1.2 結構1.3 節點的存儲 2、雙向鏈表的接口函數2.1 鏈表的節點的動態申請2.2 鏈表的初始化2.3 尾插2.4 頭插2.5 頭刪2.5 尾刪2.6 在pos節點后面添加數據2.6 刪除pos節點 3、雙向鏈表的實現&#xff1a; 前言 各位小伙伴大…

C控制語句:分支和跳轉

1.1if語句 //colddays.c --找出0攝氏度以下的天數占總天數的百分比 #include <stdio.h>int main(void) {const int FREEZING 0;float temperature;int cold_days 0;int all_days 0;printf("Enter the list of daily low temperature.\n");printf("Use…

電子學會C/C++編程等級考試2024年03月(八級)真題解析

C/C編程&#xff08;1~8級&#xff09;全部真題?點這里 第1題&#xff1a;道路 N個以 1 … N 標號的城市通過單向的道路相連:。每條道路包含兩個參數&#xff1a;道路的長度和需要為該路付的通行費&#xff08;以金幣的數目來表示&#xff09; Bob and Alice 過去住在城市 1.在…

藍海創業商機小吃配方項目,日入200+ ,小白可上手,圖文創作轉現快

小吃技術銷售&#xff0c;一單價格從幾元到幾百元不等&#xff0c;行業競爭相對較小&#xff0c;是一個相對冷門的領域。只需一部手機&#xff0c;就可以發布圖文并茂的內容&#xff0c;配上背景音樂&#xff08;BGM&#xff09;&#xff0c;即使是對視頻剪輯不熟悉的新手&…

面試中算法(金礦)

有一位國王擁有5座金礦&#xff0c;每座金礦的黃金儲量不同&#xff0c;需要參與挖掘的工人人數也不同。 例如&#xff0c;有的金礦儲量是5ookg黃金&#xff0c;需要5個工人來挖掘;有的金礦儲量是2ookg黃金&#xff0c;需要3個工人來挖掘...... 如果參與挖礦的工人的總數是10。…

【Oracle impdp導入dmp文件(windows)】

Oracle impdp導入dmp文件&#xff08;windows&#xff09; 1、連接數據庫2、創建與導出的模式相同名稱的用戶WIRELESS2&#xff0c;并賦予權限3、創建directory 的物理目錄f:\radio\dmp&#xff0c;并把.dmp文件放進去4、連接新用戶WIRELESS25、創建表空間的物理目錄F:\radio\t…

試衣不再有界:Tunnel Try-on開啟視頻試衣應用新紀元

論文&#xff1a;https://arxiv.org/pdf/2404.17571 主頁&#xff1a;https://mengtingchen.github.io/tunnel-try-on-page/ 一、摘要總結 隨著虛擬試衣技術的發展&#xff0c;消費者和時尚行業對于能夠在視頻中實現高質量虛擬試衣的需求日益增長。這項技術允許用戶在不實際穿…

目標檢測——印度車輛數據集

引言 親愛的讀者們&#xff0c;您是否在尋找某個特定的數據集&#xff0c;用于研究或項目實踐&#xff1f;歡迎您在評論區留言&#xff0c;或者通過公眾號私信告訴我&#xff0c;您想要的數據集的類型主題。小編會竭盡全力為您尋找&#xff0c;并在找到后第一時間與您分享。 …