PWM是pulse width modulation的縮寫,即脈沖寬度調制。其通過對一系列脈沖的寬度進行調制,來等效地獲得所需要波形;
1、PWM是一種對模擬信號電平進行數字編碼的方法。通過高分辨率計數器的使用,方波的占空比被調制,用來對一個具體模擬信號的電平進行編碼。等效的實現是基於采樣定理中的一個重要結論:沖量相等而形狀不同的窄脈沖加在具有慣性的環節上時,其效果基本相同。沖量即指窄脈沖的面接。這里所說的效果基本相同,是指該環節的輸出響應波形基本相同。
2、如把各輸出波形用傅立葉分析,則它們的低頻特性非常接近,僅在高頻段略有差異;
PWM信號是數字的,在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全沒有(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上面去的。(簡單的說就是 用數字的信號來控制負載達到模擬信號控制負載的效果;負載比如舵機)
改變脈沖的周期可以達到調頻的效果,改變脈沖的寬度或占空比可以達到調壓的效果,因此,采用適當控制方法即可使電壓或電流與頻率協調變化;
PWM控制具有很多優點:
1、從處理器到被控系統信號都是數字形式的,無需進行數模轉換;
2、讓信號保持為數字形式可將噪聲影響降到最小,噪聲只有在強到足以將邏輯1改變為邏輯0或將邏輯0改變為邏輯1時,也才能對數字信號產生影響,這是PWM用於通信的主要原因;
STM32的PWM:
stm32的定時器除了TIM6和7。其他的定時器都可以用來產生PWM輸出。其中高級定時器TIM1和TIM8可以同時產生7路的PWM輸出。
而通用定時器也能同時產生多達4路PWM輸出,這樣,stm32最多可以同時產生30路PWM輸出;(如果加上重映像的話,還可以更多)
要使用STM32下的通用定時器TIMx產生PWM輸出,我們會用到3個寄存器,來控制PWM的。這三個寄存器是:捕獲/比較模式寄存器TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。注意,還有個TIMx的ARR寄存器是用來控制PWM輸出頻率的
PWM輸出模式:
STM32的pwm輸出用兩種模式,模式1和模式2,由TIMx_CCMRx寄存器的OCxM位確定的(“110”為模式1,“111”為模式2).模式1和模式2的區別如下:
“110”:pwm模式1-----在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1為有效電平,否則為無效電平;在向上計數時,一旦TIMx_CNT>TIMx_CCR1時通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1).
"111":pwm模式2-----在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1為有效電平,否則為無效電平;
而從計數模式上看,PWM和TIMx作定時器時一樣,也有向上計數模式、向下計數模式和中心對齊模式;
PWM的輸出管腳:
pwm的輸出管腳是確定好的 :
不同的TIMx有分配不同的引腳,但是考慮到管腳復用功能,STM32提出了一個重映像的概念,就是說通過設置某一些相關的寄存器,來使得在其他非原始指定的管腳上也能輸出PWM.
比如說TIM3的第2個通道,在沒有重映像的時候,指定的管腳是PA.7,如果設置部分重映像之后,TIM3_CH2的輸出就被映射到PB.5上了;如果設置了完全重映像的話,TIM3_CH2的輸出就被映像到PC.7上了;
PWM輸出信號:
pwm輸出的是一個方波信號,信號的頻率是由TIMx的時鍾頻率和TIMx_ARR預分頻器所決定的。具體的設置方法在前面定時器部分中詳細說明了;二輸出信號的占空比則是由TIMx_CRRx寄存器確定的。計算公式如下:
占空比=(TIMx_CRRx/TIMx_ARR)*100%
因此,可以通過向CRR中填入適當的值來輸出自己需要的頻率和占空比的方波信號;
具體操作步驟:
1、設置RCC時鍾;
2、設置GPIO時鍾;GPIO模式應該設置為復用推挽輸出GPIO_Model_AF_PP,如果需要引腳重映像的話,則需要用GPIO_PinRemapConfig()函數進行設置;
3、設置TIMx定時器的相關寄存器;與之前定時器寄存器設置一樣;
4、設置TIMx定時器的PWM相關寄存器;
a、設置PWM模式(默認情況下PWM是董潔的)
b、設置占空比(公式計算)
c、設置輸出比較極性(前面的介紹)
d、最重要的是使能TIMx的輸出狀態和使能TIMx的PWM輸出使能;
相關設置完成之后,通過TIMx_Cmd()來打開TIMx定時器,從而得到PWM的輸出;