STM32 PWM輸出實驗

定時器用來產生PWM輸出:
STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。而通用定時器也能同時產生多達 4路的 PWM 輸出,這樣,STM32 最多可以同時產生 30 路 PWM 輸出!
STM32 PWM工作過程
在這里插入圖片描述
在這里插入圖片描述
STM32 PWM工作過程(通道1為例:
在這里插入圖片描述

  • CCR1:捕獲比較(值)寄存器(x=1,2,3,4):設置比較值。

  • CCMR1: OC1M[2:0]位:對于PWM方式下,用于設置PWM模式1【110】或者PWM模式2【111】

  • CCER:CC1P位:輸入/捕獲1輸出極性。0:高電平有效,1:低電平有效。

  • CCER:CC1E位:輸入/捕獲1輸出使能。0:關閉,1:打開。

總結幾個關鍵詞:

  • 有效電平:高電平

  • 無效電平:低電平

  • 高電平有效:高電平可以使能相應功能

  • 低電平有效:低電平可以使能相應功能

PWM模式1 & PWM模式2
寄存器TIMx_CCMR1的OC1M[2:0]位來分析:
在這里插入圖片描述
STM32 PWM工作過程在這里插入圖片描述
STM32 PWM
在這里插入圖片描述

void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

自動重載的預裝載寄存器
在這里插入圖片描述
在這里插入圖片描述

  • 捕獲/比較模塊由一個預裝載寄存器和一個影子寄存器組成。讀寫過程僅操作預裝載寄存器。在捕獲模式下,捕獲發生在影子寄存器上,然后再復制到預裝載寄存器中。在比較模式下,預裝載寄存器的內容被復制到影子寄存器中,然后影子寄存器的內容和計數器進行比較。
  • 根據TIMx_CR1寄存器中APRE位的設置:APRE=0時,預裝載寄存器的內容可以隨時傳送到影子寄存器,此時二者是連通的;而APRE=1時,在每一次更新事件(UEV)時,才把預裝在寄存器的內容傳送到影子寄存器。
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

簡單的說,ARPE=1,ARR立即生效,APRE=0,ARR下個比較周期生效。

STM32 定時器3輸出通道引腳
在這里插入圖片描述
PWM輸出庫函數

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);typedef struct
{uint16_t TIM_OCMode;  //PWM模式1或者模式2uint16_t TIM_OutputState; //輸出使能 OR失能uint16_t TIM_OutputNState;uint16_t TIM_Pulse; //比較值,寫CCRxuint16_t TIM_OCPolarity; //比較輸出極性uint16_t TIM_OCNPolarity; uint16_t TIM_OCIdleState;  uint16_t TIM_OCNIdleState; 
} TIM_OCInitTypeDef;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure. TIM_Pulse=100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據T指定的參數初始化外設TIM3 OC2

設置比較值函數:

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);

使能輸出比較預裝載:

void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

使能自動重裝載的預裝載寄存器允許位:

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

PWM輸出配置步驟:
1、 使能定時器3和相關IO口時鐘

  • 使能定時器3時鐘:
RCC_APB1PeriphClockCmd();
  • 使能GPIOB時鐘:
RCC_APB2PeriphClockCmd();

2、 初始化IO口為復用功能輸出

  • 函數:
GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     

3、 這里我們是要把PB5用作定時器的PWM輸出引腳,所以要重映射配置,所以需要開啟AFIO時鐘。同時設置重映射。

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 

4、 初始化定時器:ARR,PSC等:

TIM_TimeBaseInit();

5、 初始化輸出比較參數:

TIM_OC2Init();

6、 使能預裝載寄存器:

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); 

7、 使能定時器:

TIM_Cmd();

8、 不斷改變比較值CCRx,達到不同的占空比效果:

TIM_SetCompare2();

PWM 初始化代碼:

#include "pwm.h"
#include "sys.h"void PWM_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStrue;TIM_TimeBaseInitTypeDef TIM_TimStrue;TIM_OCInitTypeDef TIM_OCInitStrue;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能相應定時器的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能相應GPIO的時鐘GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//設置模式為復用輸出GPIO_InitStrue.GPIO_Pin=GPIO_Pin_5;GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStrue);//初始化GPIOB.5RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//開啟AFIO時鐘GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//設置重映射TIM_TimStrue.TIM_ClockDivision=TIM_CKD_DIV1;//設置時鐘分割:TDTS = Tck_timTIM_TimStrue.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimStrue.TIM_Period=arr;//自動裝載值TIM_TimStrue.TIM_Prescaler=psc;//預分頻系數的設置TIM_TimeBaseInit(TIM3,&TIM_TimStrue);//初始化定時器TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM2;//PWM模式2TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;//比較輸出極性,TIM輸出比較極性高TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;//輸出使能 TIM_OCInitStrue.TIM_Pulse=100;//比較值,寫CCRxTIM_OC2Init(TIM3,&TIM_OCInitStrue);//根據指定的參數初始化外設TIM3 OC2(因為是通道2,所以是OC2)TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能預裝載寄存器TIM_Cmd(TIM3,ENABLE);//使能定時器
}

主函數代碼:

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "pwm.h"int main(void){	u16 led0pwmval=0;u8 dir=1;	delay_init();	    	 //延時函數初始化	  LED_Init();			     //LED端口初始化PWM_Init(899,0);	 //不分頻。PWM頻率=72000000/900=80Khzwhile(1){delay_ms(10);	 if(dir)led0pwmval++;else led0pwmval--;if(led0pwmval>300)dir=0;if(led0pwmval==0)dir=1;										 TIM_SetCompare2(TIM3,led0pwmval);//不斷改變比較值CCRx,達到不同的占空比效果		   }	 }

以上代碼可以實現呼吸燈的效果

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

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

相關文章

docker鏡像和容器區別

docker鏡像 docker容器,容器是用鏡像創建的運行實例

域名相關的一些基礎知識

DNS DNS,Domain Name System或者Domain Name Service(域名系統或者域名服務)。域名系統為Internet上的主機分配域名地址和IP地址。由于網絡中的計算機都必須有個IP地址,這樣相互之間才能通信,但讓我們記住一大串的IP地址來訪問網站顯然是不可…

定時器輸入捕獲實驗

輸入捕獲簡介: 輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。STM32 的定時器,除了 TIM6 和 TIM7,其他定時器都有輸入捕獲功能。STM32 的輸入捕獲,簡單的說就是通過檢測 TIMx_CHx 上的邊沿信號,在邊沿信號發生跳變&a…

黑馬程序員—————— 多線程

java使用Thread類代表線程,所有的線程對象都必須是Thread類或其子類的實例。每個線程的作用是完成一定的任務,實際上就是執行一段程序流(一段順序執行的代碼)。java使用線程執行體來代表這段程序流。 繼承Thread類創建線程類 通過…

Linux查看內置命令和非內置命令幫助的幾種方法(man、help、info)

??作者主頁:IT技術分享社區 ??作者簡介:大家好,我是IT技術分享社區的博主,從事C#、Java開發九年,對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽: 數據庫領域優質創作者🏆&#x…

電容觸摸按鍵 實驗

RC充放電電路原理: RC電路充放電公式: Vt V0(V1-V0)* [1-exp(-t/RC)]V0 為電容上的初始電壓值; V1 為電容最終可充到或放到的電壓值; Vt 為t時刻電容上的電壓值。如果V0為0,也就是從0V開始充…

tomcat調優方案Maximum number of threads (200) created for connector with address null and port 8091...

1.tomcat6大并發出現:INFO: Maximum number of threads (200) created for connector with address null and port 8091 說明:最大線程數錯誤 解決方案:使用線程池,用較少的線程處理較多的訪問,可以提高tomcat處理請…

SFTP是什么?與FTP之間有什么區別

什么是SFTP? SFTP是一種安全的文件傳輸協議,一種通過網絡傳輸文件的安全方法;它確保使用私有和安全的數據流來安全地傳輸數據。 SFTP要求客戶端用戶必須由服務器進行身份驗證,并且數據傳輸必須通過安全通道(SSH&#x…

C++基礎( C++初識、數據類型、運算符、程序流程結構、)

前言&#xff1a; C專欄筆記來源于觀看視頻筆記 配套視頻&#xff1a; https://www.bilibili.com/video/BV1et411b73Z?p16 基本代碼框架&#xff1a; #include <iostream> using namespace std; int main() {system("pause");//等待程序return 0; }輸出Hell…

C#判斷某天是否是周末或者節假日示例

/// <summary> /// 判斷是不是周末/節假日 /// </summary> /// <param name"date">日期</param> /// <returns>周末和節假日返回true&#xff0c;工作日返回false</returns> public static async Task<bool> IsHolidayByD…

查看docker版本命令docker version

查看docker版本 docker version

spring security原理

spring security通過一系列過濾器實現其功能&#xff0c;入口過濾器如下&#xff08;web.xml&#xff09;&#xff1a; <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilt…

程序員太牛了 公司年會整成代碼討論會

作者丨前端小喬 https://blog.csdn.net/weixin_44330260/article/details/86478512 公司年底年會&#xff0c;被程序員開成代碼討論大會&#xff0c;是一種什么樣的體驗&#xff01;最近某公司舉行了一場年會&#xff0c;本來熱熱鬧鬧&#xff0c;結果被程序員給攪煳了&#xf…

嵌入式C語言基礎(一)

嵌入式C語言基礎&#xff1a; system函數&#xff1a;功能是運行windows命令 #include <stdio.h> #include <stdlib.h> int main() {//main是程序的入口&#xff0c;操作系統運行程序先找mainsystem("ipconfig");//在windows下ipconfig查看本地的網絡狀…

docker info 顯示 Docker 系統信息

docker info : 顯示 Docker 系統信息&#xff0c;包括鏡像和容器數

如何通過session控制單點登錄

web服務器為每一個瀏覽器實例對應一個session。這個session有自己的一個獨立id,這個id保存在瀏覽器的cookie中&#xff08;這個cookie貌似隨著這個瀏覽器實例的關閉而清除&#xff09;&#xff0c;訪問web服務器的時候&#xff0c;web服務會根據你cookie中的sessionId來決定重新…

Syncd - 開源自動化部署工具

官網地址&#xff1a;https://gitee.com/dreamans/syncd/issues syncd是一款開源的代碼部署工具&#xff0c;它具有簡單、高效、易用等特點&#xff0c;可以提高團隊的工作效率. 目前只支持類Linux系統. 特性 Go語言開發&#xff0c;編譯簡單、運行高效 Web界面訪問&#xff0…

嵌入式C語言基礎(二)

指針是分類型的&#xff1a; 指針根據類型不同&#xff0c;偏移值也不同。指針和數組&#xff0c;如何讓指針指向數組&#xff1f; ①用數組名 &#xff1a;int array[10],int* p,parray ②用第一個元素的地址&#xff1a;int array[10],int* p,p&array[0] 注意&#xff1a…