本節我們介紹stm32定時器的PWM輸出。
1)PWM基礎知識
PWM的全稱是Pulse Width Modulation,即脈沖寬度調制。它是數字信號,只有0、1兩種狀態,它通過一個周期中0、1所占不同的時間比例,來等效模擬信號。
假設一個數字信號源的高電平為5V、低電平為0V,如果我們在一個周期中的一半時間輸出0V、另一半時間輸出5V,只要信號的頻率足夠快,那么在外系統看來,一個整周期中電壓所起的作用就相當於2.5V;同理,只要改變高低電平的時間占比,就能等效出0~5V間的任意電壓。
如果要等效一個正弦波,可以如下輸出PWM波形:

只要PWM的頻率足夠高,占空比可以分得足夠細,那么理論上它可以等效出任意模擬電壓波形。
在數字電路中PWM可以用很少的器件等效出模擬信號的功能,而不用配置復雜的DAC芯片,所以應用十分廣泛。它可以用於LED燈調節亮度、電動調節轉速、加熱器調節溫度等等場合。
2)stm32的PWM使用
我們在最基本的定時器工程上修改,得到PWM的工程,如下圖所示:

選擇channal 1輸出PWM,此時可以看到右側的芯片引腳PA6自動設置成為定時器的CH1輸出;
設置定時器分頻系數為720-1,即主時鍾的720分之一,分頻為100kHz;
Counter Mode設置的是計數方式,有向上、向下、中心對稱計數等幾種方式;
計數周期設置為1000-1,即計數從0~999,由於計數頻率為100kHz,所以這里設置的是一個周期為10ms;
PWM的MODE可以設為1或2,二者輸出的波形是反相的,這里設置為1,即先高電平,計數值到后變為低電平;
Pulse的值設定的是脈沖寬度,這里設為100,即計數到100時翻轉輸出,所以占空比為100/1000,結果為10%;
生成工程代碼,在keil中打開。在main函數之前,加入啟動PWM功能的代碼:

編譯、下載,運行。
此時可以用示波器監測PA6引腳上的波形,可以看到周期為10ms,占空比為10%的方波:

3)stm32的PWM特點
這里把stm32定時器的PWM和它的輸出比較功能比較一下:
PWM功能可以輸出頻率、占空比可調的方波,在計數溢出和計數比較相等時輸出都會翻轉,如下圖所示:

而輸出比較功能,只能輸出50%占空比的方波,定時器的周期即為方波周期,輸出只在計數比較相等時翻轉,計數溢出時不翻轉;它可以設置輸出方波的相位:

如果熟悉AVR單片機的朋友可能會有些疑惑,AVR的輸出比較功能產生的波形,其頻率和占空比都是可調的,與stm32的輸出比較功能不同。實際上AVR單片機的輸出比較功能等同於stm32的PWM功能,這里要注意一下,不同廠家的芯片對該功能的命名有點不同。
本節講的PWM使用只是最簡單的實現,stm32的PWM還有很多更強大的功能值得探索。
歡迎關注我的公眾號,可留言“資料”獲取相關資料和軟件:

