STM32定時器輸出PWM脈衝

来源:https://www.cnblogs.com/Nic-zhang/archive/2023/07/29/17589275.html
-Advertisement-
Play Games

一、什麼是PWM脈衝? PWM (Pulse Width Modulation) 脈衝寬度調製,通常應用於慣性系統中,(不是不能即停的設備,因為如果設備不具有關心,那麼運動是斷斷續續的,不具有連續性),通過脈寬調節輸出不同的波形作用域受控對象。 二、 PWM中三個重要的參數 1.頻率=1/Ts ;這 ...


一、什麼是PWM脈衝?

PWM (Pulse Width Modulation) 脈衝寬度調製,通常應用於慣性系統中,(不是不能即停的設備,因為如果設備不具有關心,那麼運動是斷斷續續的,不具有連續性),通過脈寬調節輸出不同的波形作用域受控對象。

二、 PWM中三個重要的參數

1.頻率=1/Ts ;這個很好理解,就是在單位時間內輸出的波形的個數啦。

 

2.占空比= Ton/Ts; 在一個脈衝周期內,脈衝波形中高電平的寬度占整個周期內波形寬度的比值。

3.解析度=占空比變化步距,指PWM最小能設定到的高電平時間所占周期的比例,也即最小占空比,意思就是把一個周期的時間分成了多少份,如果是10份,那麼占空比的精度就為10%。如果分成1000份,那麼占空比的精度就為0.1%。譬如頻率為600HZ的PWM,若最小能給到的時鐘是60kHZ,則解析度即為(1/60k)/(1/600)=1%。在同一個系統中,由於時鐘不變,提高頻率,則周期變小,解析度會變大。(前面的話可能不太好理解,那我就以自己的大白話給大家解說一下吧: 說白了其意思就是說把一個波形脈衝分成了多少分,例如解析度為0.1%,那就是把一個波形脈衝分割成了1000分,分別由不同份數的高低電平組個,例如占空比為50%d的脈衝,那就是有500份高電平,500份低電平,註意是連續的

三、 PWM脈衝輸出配置(重點來啦)

事實上,需要輸出PWM脈衝,僅需要進行兩部分寄存器的配置,分別是時基單元(前面定時器中斷的時候已經詳細說過這裡不再贅述)、輸出比較單元的配置。首先看一下基本的結構如圖3所示。

定時器在不斷進行計數,其CNT不斷增大,(我這裡說的是向上計數),同在不斷的與CRR(使用者自己設定的值)寄存器的值進行比較,通過比較與CRR的值大小關係,與設定的模式進行工作,具體的模式如圖4所示。

本試驗使用的是PWM1 模式,計數的方式使用向上計數。其中計數從0到A點的工程中CNT<CRR,輸出有效電平(高電平),A點到B點過程中CNT>=RCC,輸出無效電平(低電平),這就完成了一個波形輸出,不斷的迴圈便能輸出一系列波形。

 

四、 具體程式

好了廢話不多說下麵我們一起來看看具體的代碼吧。這裡是輸出占空比 0---->100,100--->0不斷變化的的脈衝波,其頻率為1000HZ,解析度為1%.

CODE  :PWM.c

#include"pwm.h"
void PwmInit(void)
{
//打開定時器時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //定時器2是通用定時器,其時鐘掛在到APB1時鐘線上
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE); //打開對應的GPIO的時鐘,註意這裡不同的外設可能掛載的時鐘不同,所以需要看原理圖,


GPIO_DeInit(GPIOA);// 註意這裡的函數非常的重要,這裡是將對應的GPIO埠初始化成預設的樣子,因為這個埠可能在以前使用過,其他的配置可能發生了改變
GPIO_InitTypeDef GPIOC_LED_PWM_Init; // 定義GPIO的結構體,也就是外設的結構體
GPIOC_LED_PWM_Init.GPIO_Pin= GPIO_Pin_0; // 配置需要使用的引腳
GPIOC_LED_PWM_Init.GPIO_Mode=GPIO_Mode_AF_PP; //配置引腳的輸出的模式,這裡使用大額CH1輸出波形,所以是復用模式
GPIOC_LED_PWM_Init.GPIO_Speed=GPIO_Speed_50MHz; // 配置輸出的頻率,這個在輸入的時候不需要配置
GPIO_Init(GPIOA ,&GPIOC_LED_PWM_Init); // 使用初始化函數初始化剛剛定義的結構體,以及對應的GPIO埠
//配置定時器2的時鐘源來自內部時鐘源,其實這裡系統預設的就是內部時鐘,所以這一步配置可以省去
TIM_InternalClockConfig(TIM2);
//定時器結構體配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1 ; //內部時鐘分頻
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=100-1; //定時器溢出值
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1; //分頻繫數
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; //這裡使用的是通用定時器沒有復用計數功能,這裡設置為0
//配置定時器2初始化
TIM_TimeBaseInit(TIM2 ,&TIM_TimeBaseInitStructure);
TIM_Cmd(TIM2,ENABLE); //使能定時器

//配置比較輸出單元
TIM_OCInitTypeDef PwmStruct;
TIM_OCStructInit(&PwmStruct); //給結構體賦初值,保證結構體中每一個變數都有初始值,防止使用高級定時器的時鐘時出現錯誤,應為通用定時器不具有某一個功能
PwmStruct.TIM_OCMode=TIM_OCMode_PWM1; // 輸出模式
PwmStruct.TIM_Pulse=0; //CCR
PwmStruct.TIM_OutputState=ENABLE; // PWM 輸出使能
PwmStruct.TIM_OCPolarity= TIM_OCPolarity_High;
TIM_OC1Init(TIM2,&PwmStruct);
}
//程式運行過程中設置不同的占空比
void PWM_SetCompare1(uint16_t Compare)
{

TIM_SetCompare1(TIM2 ,Compare);

}

 CODE :main.c

int main(){
Led_funcing();
PwmInit();
uint8_t i;
while(1)
{
for(i=0;i<=100;i++)
{
PWM_SetCompare1(i);
delay(100);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare1(100-i);
delay(100);
}
}
}

有條件的寶寶可以使用LED燈 馬達自己模擬一下,我是用的是模擬模式輸出。

 好啦,今天就給大家分享到這裡,如有錯誤和不合理的地方請大家指正。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 C# 中,IConfiguration 是一個介面,用於在應用程式中管理配置數據。它是 .NET Core(現在稱為 .NET 5+)和 ASP.NET Core 的一部分,用於輕鬆地讀取和使用配置信息,例如資料庫連接字元串、API密鑰、日誌設置等。 IConfiguration 介面是依賴註入 ...
  • 在C# WebAPI中,參數是用於接收和處理HTTP請求中傳遞的數據的方式。WebAPI支持不同類型的參數,包括路由參數、查詢字元串參數、請求體參數和標頭參數。以下是一些常用的WebAPI參數類型: 路由參數(Route Parameters): 路由參數從URL的路徑中提取值。在WebAPI中,通 ...
  • 調用方法體 public void OpenBrowser() { string url = "http://localhost:8055/api"; bool openRes = OpenBrowserHelper.OpenChromeBrowserUrl(url); if (!openRes) ...
  • # Unity UGUI的PhysicsRaycaster (物理射線檢測)組件的介紹及使用 ## 1. 什麼是PhysicsRaycaster組件? PhysicsRaycaster是Unity UGUI中的一個組件,用於在UI元素上進行物理射線檢測。它可以檢測滑鼠或觸摸事件是否發生在UI元素上, ...
  • zTree樹官網:https://www.treejs.cn/v3/main.php#_zTreeInfo 首先來到首頁點擊右上角下載 可以選擇使用Git拉取也可以下載ZIP壓縮包,兩者選其一即可 下載打開文件夾以後是下麵這些文件 然後將這些文件放你所使用的入項目當中,如下圖 將文件放入項目當中以後 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**恩智浦i.MX RT1170 FlexSPI NAND啟動時間**。 本篇是 i.MXRT1170 啟動時間評測第四彈,前三篇分別給大家評測了 [Raw NAND 啟動時間](https://www.cnblogs.com/henj ...
  • # linux文本編輯YCM報錯 剛從github安裝了vimplus,可是發現存在不少的問題。索性給直接記錄一下。 ![image-20230729125334361](https://chennianxiu123.oss-cn-shanghai.aliyuncs.com/Typora_PigcL ...
  • > ## ESP32連接雲伺服器【ESP32+寶塔面板】 > > > ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/4e4e3adfcb8147aab117a1292dbbfa19.png#pic_center) > >🔮🔮🔮🔮🔮相關文章🔮🔮🔮🔮 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...