【STM32】定時器與PWM的LED控制

目錄

  • 一、定時器控制LED周期性亮滅
    • (一)定時器
      • 1.STM32F103定時器分類及區別
      • 2.通用定時器主要功能
      • 3.通用定時器工作過程
    • (二)STM32CubeMX創建工程
    • (三)代碼實現
    • (四)實驗結果
  • 二、PWM模式控制LED呼吸燈
    • (一)PWM工作原理
      • 1.PWM一個周期
      • 2.PWM輸出模式區別
      • 3.PWM的計數模式
    • (二)STM32CubeMX創建工程
    • (三)代碼實現
    • (四)實驗結果
  • 參考鏈接

一、定時器控制LED周期性亮滅

(一)定時器

1.STM32F103定時器分類及區別

STM32F103一共有8個定時器TIM1~TIM8。STM32的定時器分為基本定時器、通用定時器和高等定時器。

TIM6TIM7(基本定時器):基本定時器是只能向上計數的16位定時器,基本定時器只能有定時的功能,沒有外部IO口,所以沒有捕獲和比較通道。

TIM2TIM3TIM4TIM5(通用定時器):通用定時器是可以向上計數,也可以向下計數的16位定時器。通用定時器可以定時、輸出比較、輸入捕捉,每個通用定時器具有4個外部IO口。

TIM1TIM8(高級定時器):高級定時器是是可以向上計數,也可以向下計數的16位定時器。高等定時器可以定時、輸出比較、輸入捕捉、還可以輸出三相電機互補信號,每個高等定時器有8個外部IO口。

此次主要使用通用定時器,故后續了解以通用定時器為主

2.通用定時器主要功能

通用TIMx (TIM2、TIM3、TIM4和TIM5)定時器功能包括:

● 16位向上、向下、向上/向下自動裝載計數器

● 16位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻系數為1~65536之間的任意數值

● 4個獨立通道:
─ 輸入捕獲
─ 輸出比較
─ PWM生成(邊緣或中間對齊模式)
─ 單脈沖模式輸出

● 使用外部信號控制定時器和定時器互連的同步電路

● 如下事件發生時產生中斷/DMA:
─ 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
─ 觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發計數)
─ 輸入捕獲
─ 輸出比較

● 支持針對定位的增量(正交)編碼器和霍爾傳感器電路

通用定時器計數模式:①向上計數 ②向下計數 ③中心對齊

3.通用定時器工作過程

從時鐘源產生框可以看到

定時器時鐘有四種來源:
● 內部時鐘(CK_INT)
● 外部時鐘模式1:外部輸入腳(TIx) (輸入捕獲的引腳)
● 外部時鐘模式2:外部觸發輸入(ETR)
● 內部觸發輸入(ITRx):(定時器級聯)使用一個定時器作為另一個定時器的預分頻器,如可以配置一個定時器Timer1而作為另一個定時器Timer2的預分頻器。

產生CK_PSC時鐘,然后在從模式控制器內設置好計數模式(向上向下),再經過預分頻器產生CK_CNT,若為CNT計數器向下計數,則當其計數到0時,自動重裝載寄存器會重新為CNT計數器裝載新值重新遞減計數,并產生一個更新事件。

時基單元:
● 計數器寄存器(TIMx_CNT)
● 預分頻器寄存器 (TIMx_PSC)
● 自動裝載寄存器 (TIMx_ARR)
輸入捕獲:信號通過捕獲通道進入,經濾波,經分頻,到捕獲比較寄存器。(經輸入捕獲與輸出比較的四個通道其實是一個)

(二)STM32CubeMX創建工程

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
這里我們 arr=4999 psc=6399 Tclk=16Mhz Tout = (5000*6400)/16 us = 2s
在這里插入圖片描述
在這里插入圖片描述

(三)代碼實現

HAL_TIM_Base_Start_IT(&htim2);

在這里插入圖片描述

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static unsigned char ledState = 0;if (htim == (&htim2)){if (ledState == 0)HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);elseHAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);ledState = !ledState;}
}

在這里插入圖片描述

(四)實驗結果

在這里插入圖片描述

二、PWM模式控制LED呼吸燈

(一)PWM工作原理

脈沖寬度調制(Pulse width modulation,PWM)是一種對模擬信號電平進行數字編碼的方法。

STM32的每個通用定時器都有獨立的4個通道可以用來作為:輸入捕獲、輸出比較、PWM輸出、單脈沖模式輸出等。

STM32的定時器除了TIM6和TIM7(基本定時器)之外,其他的定時器都可以產生PWM輸出。其中,高級定時器TIM1、TIM8可以同時產生7路PWM輸出。
在這里插入圖片描述

1.PWM一個周期

  • 定時器從0開始向上計數
  • 當0-t1段,定時器計數器TIMx_CNT值小于CCRx值,輸出低電平
  • t1-t2段,定時器計數器TIMx_CNT值大于CCRx值,輸出高電平
  • 當TIMx_CNT值達到ARR時,定時器溢出,重新向上計數…循環此過程
  • 至此一個PWM周期完成

每個定時器有四個通道,每一個通道都有一個捕獲比較寄存器。
將寄存器值和計數器值比較,通過比較結果輸出高低電平,便 可以實現脈沖寬度調制模式(PWM信號)。
向上計數:
在這里插入圖片描述
假定定時器工作在向上計數 PWM模式:

當 CNT<CCRx 時,輸出 0
當 CNT>=CCRx 時輸出 1
當 CNT 達到 ARR 值的時候,重新歸零,然后重新向上計數,依次循環。

改變 CCRx 的值,就可以改變 PWM 輸出的占空比,改變 ARR 的值,就可以改變 PWM 輸出的頻率。

2.PWM輸出模式區別

PWM模式1:在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1為有效電平,否則為無效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)
PWM模式2:在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1為有效電平,否則為無效電平
注意:PWM的模式只是區別什么時候是有效電平,但并沒有確定是高電平有效還是低電平有效。這需要結合CCER寄存器的CCxP位的值來確定

3.PWM的計數模式

向上計數模式
下面是一個PWM模式1的例子。當TIMx_CNT<TIMx_CCRx時PWM信號參考OCxREF為高,否則為低。如果TIMx_CCRx中的比較值大于自動重裝載值(TIMx_ARR),則OCxREF保持為’1’。如果比較值為0,則OCxREF保持為’0’:
在這里插入圖片描述
向下計數模式
在PWM模式1,當TIMx_CNT>TIMx_CCRx時參考信號OCxREF為低,否則為高。如果TIMx_CCRx中的比較值大于TIMx_ARR中的自動重裝載值,則OCxREF保持為’1’。該模式下不能產生0%的PWM波形

中央對齊模式
TIMx_CR1寄存器中的CMS位不為’00’時,為中央對齊模式(所有其他的配置對OCxREF/OCx信號都有相同的作用)。根據不同的CMS位設置,比較標志可以在計數器向上計數時被置’1’、在計數器向下計數時被置’1’、或在計數器向上和向下計數時被置’1’。TIMx_CR1寄存器中的計數方向位(DIR)由硬件更新,不要用軟件修改它。

(二)STM32CubeMX創建工程

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

(三)代碼實現

/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */while (pwmVal< 500){pwmVal++;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比較值,修改占空比// TIM3->CCR1 = pwmVal; 與上方相同HAL_Delay(1);}while (pwmVal){pwmVal--;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比較值,修改占空比// TIM3->CCR1 = pwmVal; 與上方相同HAL_Delay(1);}HAL_Delay(200);
}
/* USER CODE END 3 */

(四)實驗結果

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

參考鏈接

定時器&PWM應用編程
STM32CubeMX & Keil——STM32F103C8T6:PWM控制LED燈

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

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

相關文章

gin接收圖片文件,websocet持續返回響應,解決多任務排隊問題

背景 有一個需求是這樣的&#xff0c;前端需要通過http請求的form-data上傳圖片文件&#xff0c;后端接收圖片后調用AI接口執行命令&#xff0c;由于命令執行時間較長&#xff0c;需要持續返回當前任務在全局任務列表中的位置&#xff0c;以便前端即時更新排隊信息。 思考 如…

【源碼】Spring Data JPA原理解析之Repository自定義方法命名規則執行原理(二)

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查詢、部分字段查詢 3、Spring Data JPA數據批量插入、批量更新真的用對了嗎 4、Spring Data JPA的一對一、LazyInitializationException異常、一對多、多對多操作 5、Spring Data JPA自定…

Oracle中TAF與SCANIP全面解析

TAF (Transparent Application Failover) 概念&#xff1a; TAF是Oracle數據庫提供的一個高級特性&#xff0c;旨在實現應用程序在數據庫連接中斷時的透明重連。它允許應用程序在數據庫故障發生時&#xff0c;無需修改代碼或手動干預&#xff0c;就能自動連接到新的數據庫實例…

Java垃圾回收_1

一、垃圾回收 1.如何判斷對象可以回收 &#xff08;1&#xff09;引用計數法 存在循環引用問題&#xff0c; Java未使用這種算法 在引用計數法中&#xff0c;每個對象都有一個引用計數器&#xff0c;記錄著指向該對象的引用數量。當引用計數器為零時&#xff0c;表示沒有任…

JavaSE:SE知識整體總結

1、引言 歷時一個多月的學習&#xff0c;已經掌握了JavaSE的知識&#xff0c;這篇博客就來做一下SE知識的總結~ 2、數據類型和變量 Java中的數據類型分為基本數據類型和引用數據類型。 2.1 基本數據類型 基本數據類型共有四類八種&#xff1a; 四類&#xff1a;整形、浮點…

在phpstorm2024版里如何使用Jetbrains ai assistant 插件 ?

ai assistant激活成功后&#xff0c;如圖 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 為 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌編碼基礎模型 Codey,Codey 是…

SpringBoot HelloWorld 之 實現注冊功能

SpringBoot HelloWorld 之 實現注冊功能 一.配置 創建數據庫big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用戶名,password varchar(32) COLLATE utf8_unicode_ci …

Vue3項目練習詳細步驟(第五部分:用戶模塊的功能)

頂部導航欄個人信息顯示 接口文檔 接口請求與綁定 導航欄下拉菜單功能 路由實現 退出登錄和路由跳轉實現 基本資料修改 頁面結構 接口文檔 接口請求與綁定 修改頭像 頁面結構 頭像回顯 頭像上傳 接口文檔 重置密碼 頁面結構 接口文檔 接口請求與綁定 頂部導航…

自然語言處理學習路線

學習目標 NLP 系統知識&#xff08;從入門到入土&#xff09; 學習內容 NLP的基本流程&#xff1a;&#xff08;待更&#xff09;文本預處理&#xff08;標點符號處理、繁體轉簡體、分詞Tokenizer&#xff09;&#xff1a;&#xff08;待更&#xff09;詞袋模型&#xff08;TF…

【T+】暢捷通T+軟件固定資產模塊反啟用

【問題描述】 暢捷通T軟件&#xff0c;固定資產模塊反啟用。 【解決方法】 針對賬套庫執行如下腳本清除資產的所有數據&#xff0c; 執行前請與客戶確認資產的所有數據都不要了&#xff0c;確認后備份賬套再執行腳本&#xff0c;切記&#xff01;&#xff01;&#xff01; 然后…

Flutter 中的 ChipTheme 小部件:全面指南

Flutter 中的 ChipTheme 小部件&#xff1a;全面指南 Flutter 是一個由 Google 開發的跨平臺 UI 框架&#xff0c;它提供了一套豐富的組件集合&#xff0c;用于構建現代化的、響應式的移動和 Web 應用。ChipTheme 是 Flutter 中一個專門用于統一設置應用中所有 Chip 組件樣式的…

紅外熱成像觀驅一體儀,夜間驅鳥新利器

夜間驅鳥是機場鳥防工作的重點和難點&#xff0c;但紅外熱成像觀驅一體儀的出現解決了這個問題&#xff0c;它結合了紅外熱成像技術和激光驅鳥技術&#xff0c;極大地提升了夜間驅鳥工作的效率和安全性。 驅鳥技術詳解&#xff1a; 在夜晚低能見度的環境下&#xff0c;紅外熱成…

基于開源項目ESP32 SVPWM驅動無刷電機開環速度測試

基于開源項目ESP32 SVPWM驅動無刷電機開環速度測試 ?本篇硬件電路和代碼來源于此開源項目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件電路和項目介紹&#xff0c;立創開源廣場&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

【bug】在 Windows 上安裝 SDKMAN! 的完整指南

在 Windows 系統上&#xff0c;安裝 SDKMAN! 可能會遇到一些小問題。本文將詳細介紹如何解決這些問題并成功安裝 SDKMAN!。 問題描述 當在 PowerShell 中運行以下命令以安裝 SDKMAN! 時&#xff1a; curl -s get.sdkman.io | bash你可能會遇到以下錯誤&#xff1a; bash : …

前端面試題日常練-day45 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末 1. 在Bootstrap中&#xff0c;以下哪個類用于創建一個具有響應式的導航欄&#xff1f; a) .navbar-responsive b) .responsive-nav c) .navbar-collapse d) .collapse-navbar 2. 哪個Bootstrap類用…

2024 HN CTF WebMisc 部分 wp

Web ez_tp 判斷是thinkphp 3.2 參考官方手冊:https://www.kancloud.cn/manual/thinkphp/1697 判斷路由模式 URL_CASE_INSENSITIVE > true, // 默認false 表示URL區分大小寫 true則表示不區分大小寫URL_MODEL > 1, // URL訪問模式,可選參數0、1、…

Python使用動態代理的多元應用

Python作為一種功能強大且易于學習的編程語言&#xff0c;在網絡編程領域具有廣泛的應用。當Python與動態代理技術結合時&#xff0c;便開啟了一扇通往更多可能性的大門。以下將深入探討Python使用動態代理可以實現的多種應用。 首先&#xff0c;Python結合動態代理在網絡爬蟲…

中文多模態InternVL-Chat-V1-5,中文理解能力強勁,8 項指標超越商業模型,性能媲美 GPT-4V

前言 近年來&#xff0c;多模態大型語言模型&#xff08;MLLM&#xff09;的快速發展&#xff0c;為人工智能在圖像、文本等多模態信息理解和處理方面帶來了前所未有的突破。然而&#xff0c;現有的主流多模態模型多以英文為訓練語言&#xff0c;在中文理解和處理方面存在著明…

可用于嵌入式的解釋器調研對比,及lua解釋器介紹

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手動分割線-------------------------------------------------------------------------------- 本文章參考了以下文章&#xff1a; 這里是引用 ------------…

1113 錢串子的加法

idea 測試點3&#xff1a;輸入的兩個整數都是0測試點4.5&#xff1a;大數&#xff0c;需要用大數加法 solution1(測試點4&#xff0c;5不通過) 直接相加再轉30進制 #include<iostream> #include<string> using namespace std; typedef long long ll; string a,…