STM32——PWM輸出總結

2021-01-08 電子產品世界

學習後發現stm32的定時器功能確實很強大,小總結一下方便以後使用的時候做參考。Stm32定時器一共分為三種:tim1和tim8是高級定時器,6和7是基本定時器,2—5是通用定時器。從名字就可以看得出來主要功能上的差異。今天我主要是用定時器做pwm輸出,所以總結也主要是針對pwm方面的。
先大致說下通用和高級定時器的區別。通用的可以輸出四路pwm信號互不影響。高級定時器可以輸出三對互補pwm信號外加ch4通道,也就是一共七路。
所以這樣算下來stm32一共可以生成4*5+7*2=30路pwm信號。接下來還有功能上的區別:通用定時器的pwm信號比較簡單,就是普通的調節佔空比調節頻率(別的不常用到的沒去深究);高級定時器的還帶有互補輸出功能,同時互補信號可以插入死區,也可以使能剎車功能,從這些看來高級定時器的pwm天生就是用來控制電機的。

Pwm輸出最基本的調節就是頻率和佔空比。頻率當然又和時鐘信號扯上了關係。高級定時器是掛接到APB2上,而通用定時器是掛接到APB1上的。APB1和APB2的區別就要在於時鐘頻率不同。APB2最高頻率允許72MH,而APB1最高頻率為36MHZ。這樣是不是通用定時器只最高36MHZ頻率呢,不是的;通用定時器時鐘信號完整的路線應該是下面這樣的:
AHB(72mhz)→APB1分頻器(默認2)→APB1時鐘信號(36mhz)→倍頻器(*2倍)→通用定時器時鐘信號(72mhz)。
在APB1和定時器中間的倍頻器起到了巨大的作用,假如紅色字體的「APB1分頻器」假如不為1(默認是2),倍頻器會自動將APB1時鐘頻率擴大2倍後作為定時器信號源,這個它內部自動控制的不用配置。設置這個倍頻器的目的很簡單就是在APB1是36mhz的情況下通用定時器的頻率同樣能達到72mhz。我用的庫函數直接調用函數SystemInit(); 這個函數之後時鐘配置好了:通用定時器和高級定時器的時鐘現在都是72mhz(你也可以自己再配置一下RCC讓他的頻率更低,但是不能再高了)。定時器接下來還有一個分頻寄存器:TIMX_PSC經過他的分頻後,才是定時器計數的頻率。所以真正的時鐘頻率應該是72mhz/(TIMX_PSC-1),我們設為tim_frepuency下面還會用到。
stm32的時鐘頻率弄得確實是很饒人的,所以關鍵就是先要把思路理清楚。時鐘的頻率弄好了下面終於可以開說重點PWM了。當然還少不了頻率:pwm主要就是控制頻率和佔空比的:這兩個因素分別通過兩個寄存器控制:TIMX_ARR和TIMX_CCRX。ARR寄存器就是自動重裝寄存器,也就是計數器記到這個數以後清零再開始計,這樣pwm的頻率就是tim_frequency/(TIMX_ARR-1)。在計數時會不停的和CCRX寄存器中的數據進行比較,如果小於的話是高電平或者低電平,計數值大於CCRX值的話電平極性反相。所以這也就控制了佔空比。

下面是定時器1的配置代碼:
GPIO_InitTypeDef GPIO_InitStructure2;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
//第一步:配置時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB

|RCC_APB2Periph_TIM1,ENABLE);
//第二步,配置goio口
GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP; //設置為復用浮空輸出
GPIO_Init(GPIOA,&GPIO_InitStructure2);

GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP; //設置為復用浮空輸出
GPIO_Init(GPIOB,&GPIO_InitStructure2);

//第三步,定時器基本配置
TIM_TimeBaseStructure.TIM_Period=1000-1; // 自動重裝載寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler=72-1; // 時鐘預分頻數
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 採樣分頻
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計數
TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //重複寄存器,用於自動更新pwm佔空比 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

//第四步pwm輸出配置
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //設置為pwm1輸出模式
TIM_OCInitStructure.TIM_Pulse=500; //設置佔空比時間
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //設置輸出極性
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能該通道輸出
//下面幾個參數是高級定時器才會用到,通用定時器不用配置
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High; //設置互補端輸出極性
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable; //使能互補端輸出
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; //死區後輸出狀態
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset; //死區後互補端輸出狀態
TIM_OC1Init(TIM1,&TIM_OCInitStructure); //按照指定參數初始化


//第五步,死區和剎車功能配置,高級定時器才有的,通用定時器不用配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//運行模式下輸出選擇
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//空閒模式下輸出選擇
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //鎖定設置
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //死區時間設置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //剎車功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; //剎車輸入極性
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; //自動輸出使能
TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);


//第六步,使能端的打開
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能TIMx在CCR1上的預裝載寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的預裝載寄存器
TIM_Cmd(TIM1,ENABLE); //打開TIM1
//下面這句是高級定時器才有的,輸出pwm必須打開
TIM_CtrlPWMOutputs(TIM1, ENABLE); //pwm輸出使能,一定要記得打開

TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();這兩個函數控制的是ccr1和arr的預裝再使能,使能和失能的區別就是:使能的時候這兩個寄存器的讀寫需要等待有更新事件發生時才能被改變(比如計數溢出就是更新時間)。失能的時候可以直接進行讀寫而沒有延遲。
另外在運行當中想要改變pwm的頻率和佔空比調用:TIM_SetAutoreload(),TIM_SetCompare1()這兩個函數就可以了。


相關焦點

  • STM32F4輸出PWM波形的配置總結
    單片機輸出pwm的原理涉及模塊:GPIO、TIM1主要寄存器:TIMx_CCR、TIMx_ARR、TIMx_CNT原理圖>通用定時器可以利用GPIO引腳進行脈衝輸出,在配置為比較輸出、PWM輸出功能時,捕獲/比較寄存器TIMx_CCR被用作比較功能,下面把它簡稱為比較寄存器。
  • stm32 學習 (設置TIM4輸出4路 pwm J-LINK仿真驗證)
    X >= A 時輸出低電平(高電平) ; PWM佔空比:A/(N+1)stm32的pwm輸出只要設置好在主循環前調用一次即可, 對用的IO就可以持續的輸出PWMTIM4配置PWM過程程序:配置pwm輸出引腳7.
  • MSP430F149 TimerA 輸出pwm信號 C程序代碼
    MSP430F149 TimerA 輸出pwm信號 注意其中寄存器設置與pwm信號輸出引腳的對應關係 P1.2-TA1,TACCR1
  • stm32單片機中使用GPIO口模擬PWM輸出解析
    gpio   General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或總線擴展器,人們利用工業標準I2C、SMBus或SPI接口簡化了I/O口的擴展。當微控制器或晶片組沒有足夠的I/O埠,或當系統需要採用遠端串行通信或控制時,GPIO產品能夠提供額外的控制和監視功能。
  • 基於Cortex-A9的pwm詳解——PWM信號輸出輸出和作用
    二、PWM信號輸出輸出和作用1. 如果要實現PWM信號輸出如何輸出呢?1)可以直接通過晶片內部模塊輸出PWM信號,前提是這個I/O口要有集成的pwm控制器,只需要通過對應的寄存器即可,這種自帶有PWM輸出的功能模塊在程序設計更簡便,同時數據更精確。2)但是如果IC內部沒有PWM功能模塊,或者要求不是很高的話可以利用I/O口設置一些參數來輸出PWM信號,因為PWM 信號其實就是一高一低的一系列電平組合在一起。
  • 正點原子-戰艦V3第十四章 PWM 輸出實驗
    圖中,我們假定定時器工作在向上計數 PWM模式,且當 CNT<CCRx 時,輸出 0,當 CNT>=CCRx 時輸出 1。改變 CCRx 的值,就可以改變 PWM 輸出的佔空比,改變 ARR 的值,就可以改變 PWM 輸出的頻率,這就是 PWM 輸出的原理。STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產生 PWM 輸出。
  • PCA9685--16路 PWM模塊舵機驅動板--STM32 IIC接口模塊
    i2c通信,只需要2根i2c線就可以控制16路pwm,周期和佔空比都可控。可以多個模塊級聯。箭頭部分可以更改設備id。可以控制16路輸出端的開、關、pwm以及佔空比。精度是12位:工作頻率 時間解析度 通常舵機500~2500us可分成份數 通常舵機500~2500us,旋轉角180°的角度解析度50Hz 4.88us 410份 0.439°60Hz 4us 492份 0.366°驅動方式可以選擇開漏輸出或推輓輸出。
  • STM32:利用定時器的PWM輸出
    PWM,Pulse Width Modulation,即脈衝寬度調製,就是利用定時器的計數功能實現對模擬輸出的控制,可以產生周期和佔空比可調的信號輸出。連續輸出的話就會產生方波,周期由自動重裝載值ARR(TIMx_ARR)決定,佔空比由捕獲/比較寄存器(TIMx_CCR1~4)值決定。
  • 基於PIC16F84的兩組PWM輸出的實例源程序
    PIC16F84產生兩組PWM輸出的實例源程序本文引用地址:http://www.eepw.com.cn/article/171049.htm;*************************************************
  • 你足夠了解pwm嗎?搞清楚pwm控制技術
    pwm是現代重要技術之一,在各種電子設備中,均存在pwm的身影。在往期文章中,小編對pwm原理、pwm佔空比、pwm頻率均有所介紹。為增進大家對pwm的認識,本文將對pwm控制技術予以闡述。如果你對pwm抑或本文即將介紹的內容具有興趣,不妨繼續往下閱讀哦。
  • 大佬帶你深入pwm殿堂,搞明白pwm頻率是咋回事
    對於pwm,想必很多朋友都有所耳聞。但是,大家對於pwm真的了解嗎?譬如,pwm頻率是如何被確定下來的?pwm頻率和pwm值是同一個東西嗎?如果不是,pwm頻率和pwm值有什麼區別呢?如果你對這些問題存在疑惑,或者是對本文涉及的pwm相關知識具有興趣,不妨繼續往下閱讀哦。
  • PWM是什麼
    也就是在輸出波形的半個周期中產生多個脈衝,使各脈衝的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。按一定的規則對各脈衝的寬度進行調製,即可改變逆變電路輸出電壓的大小,也可改變輸出頻率。  在PWM波形中,各脈衝的幅值是相等的,要改變等效輸出正弦波的幅值時,只要按同一比例係數改變各脈衝的寬度即可,因此在交-直-交變頻器中,PWM逆變電路輸出的脈衝電壓就是直流側電壓的幅值。  根據上述原理,在給出了正弦波頻率,幅值和半個周期內的脈衝數後,PWM波形各脈衝的寬度和間隔就可以準確計算出來。按照計算結果控制電路中各開關器件的通斷,就可以得到所需要的PWM波形。
  • PWM原理
    按一定的規則對各脈衝的寬度進行調製,既可改變逆變電路輸出電壓的大小,也可改變輸出頻率。語音信號如果大於鋸齒波信號,比較器輸出正常數A,否則輸出0。因此,從圖中可以看出,比較器輸出一列下降沿調製的脈衝寬度調製波。
  • PWM在ARM Linux中的原理和蜂鳴器驅動實例開發
    PWM(脈衝寬度調製)簡單的講是一種變頻技術之一,是靠改變脈衝寬度來控制輸出電壓,通過改變周期來控制其輸出頻率。如果還不是很清楚,好吧,來看看我們實際生活中的例子,我們的電風扇為什麼扭一下按扭,風扇的轉速就會發生變化;調一下收音機的聲音按鈕,聲音的大小就會發生變化;還有待會兒我們要講的蜂鳴器也會根據不同的輸入值而發出不同頻率的叫聲等等!!
  • 能否使用普通IO口模擬PWM波?該怎麼做?
    普通IO埠模擬PWM,其實是有局限的,尤其是要輸出高頻率的PWM波形時,更不適合,建議不要選用普通埠模擬PWM,而建議選用定時器復用硬體PWM輸出。假設實現1Khz,50%佔空比的波形,即實現周期為1ms的pwm輸出,需要設定一個0.5ms的定時器中斷,每次進入一次定時器,則對普通的IO埠輸出電平進行一次翻轉,以達到PWM輸出波形的作用。
  • PWM和SB
    另外兩個正反控制,就叫做控制1和控制2吧,分別給這兩個引腳不同的信號,比如,1是高電平,2是低電平,L298N給這一路的輸出就是正電壓,如果1是低2是高,模塊輸出極性就會反過來,正是通過控制輸出電壓的方向,從而控制了電機的正反轉向。
  • 新手向,STM32輸入輸出總結
    因此,在這裡做一個總結:推輓輸出:可以輸出高,低電平,連接數字器件; 推挽結構一般是指兩個三極體分別受兩互補信號的控制,總是在一個三極體導通的時候另一個截止。高低電平由IC的電源低定。推挽電路是兩個參數相同的三極體或MOSFET,以推挽方式存在於電路中,各負責正負半周的波形放大任務,電路工作時,兩隻對稱的功率開關管每次只有一個導通,所以導通損耗小、效率高。
  • 脈寬調製原理- -PWM原理
    脈寬調製技術的輸出波形是一系列大小相等的脈衝,用於替代所需要的波形,以正弦波為例,也就是使這一系列脈衝的等值電壓為正弦波,並且輸出脈衝儘量平滑且具有較少的低次諧波。根據不同的需求,可以對各脈衝的寬度進行相應的調整,以改變輸出電壓或輸出頻率等值,進而達到對模擬電路的控制。
  • STM32單片機學習(6) PWM輸出實驗
    /** * 軟體功能: PWM輸出實驗* */#include "stm32f10x.hGPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結構體GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//復用輸出
  • STM32複習三:什麼是埠復用和埠重映射?
    我們可以查詢stm32的數據手冊,可以了解具體I/O口可以復用為什麼功能引腳。可參考stm32中文參考手冊8.1.11外設GPIO配置:查手冊可得GPIO配置模式二、埠重映射我們知道每個內置外設都有若干個輸入輸出引腳,一般這些引腳的輸出埠都是固定不變的,為了讓設計工程師可以更好地安排引腳的走向和功能,在STM32中引入了外設引腳重映射的概念