背景
上一講,我們介紹了 STM32 CubeMX 學習:定時器 ,並示范了如何使用定時器來定時。這一講我們來試試PWM(Pulse Width Modulation, 脈沖寬度調制),這是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。廣泛應用在從測量、通信到功率控制與變換的許多領域中。
HOST-OS : Windows-10
STM32 Cube :v5.6
MCU : STM32F429
LIB : stm32cube_fw_f4_v1250
知識
基本概念
脈沖調制有兩個重要的參數,(在STM32中,這兩個因素分別通過兩個寄存器控制:TIMX_ARR和TIMX_CCRX)
- 輸出頻率 : 頻率越高,則模擬的效果越好。
- 占空比 : 占空比就是改變輸出模擬效果的電壓大小。占空比越大則模擬出的電壓越大。
PWM值 :在一個周期內,開關管導通時間長短相加的平均值。導通時間越長,則直流輸出的平均值越大。(因此,可以等效於模擬電路)
例如輸出占空比為50%,頻率為10Hz的脈沖,高電平為3.3V.則其輸出的模擬效果相當於輸出一個1.65V的高電平。
PWM輸出頻率 : 指這一次導通到下一次導通的時間的倒數。
PWM占空比:指的是輸出的PWM中,高電平保持的時間 與 該PWM的時鍾周期的時間之比。
如,一個PWM的頻率是1000Hz(時鍾周期就是1ms,1000us),如果高電平出現的時間是200us,那么低電平的時間肯定是800us,那么占空比就是200:1000,也就是說PWM的占空比就是1:5。
PWM分辨率 :分辨率也就是占空比最小能達到多少,如8位的PWM,理論的分辨率就是1:255(單斜率),16位的的PWM理論就是1:65535(單斜率)。頻率就是這樣的,如16位的PWM,它的分辨率達到了1:65535,要達到這個分辨率,T/C就必須從0計數到65535才能達到,如果計數從0計到80之后又從0開始計到80,那么它的分辨率最小就是1:80了,但是它也快了,也就是說PWM的輸出頻率高了。
PWM斜率:
- 假設一個PWM從0計數到80,之后又從0計數到80.這個就是單斜率。
- 假設一個PWM從0計數到80,之后是從80計數到0.這個就是雙斜率。可見,雙斜率的計數時間多了一倍,所以輸出的PWM頻率就慢了一半,但是分辨率卻是1:(80+80) =1:160,就是提高了一倍。
單片機是如何控制產生PWM的:
- 假設PWM是單斜率,設定最高計數是80,我們再設定一個比較值是10,那么T/C從0計數到10時(這時計數器還是一直往上計數,直到計數到設定值80),單片機就會根據你的設定,控制某個IO口在這個時候是輸出1還是輸出0還是端口取反,這樣,就是PWM的最基本的原理了。
補充:PWM"死區"(電機控制方面有關:讓橋臂上的上面兩個管子或下面兩個同時給高電平即為剎車。不讓同邊導通 為 死區。)
- 通常,大功率電機、變頻器等,末端都是由大功率管、IGBT等元件組成的H橋或3相橋。每個橋的上半橋和下半橋是是絕對不能同時導通的,但高速的PWM驅動信號在達到功率元件的控制極時,往往會由於各種各樣的原因產生延遲的效果,造成某個半橋元件在應該關斷時沒有關斷,造成功率元件燒毀。
- 死區就是在上半橋關斷后,延遲一段時間再打開下半橋或在下半橋關斷后,延遲一段時間再打開上半橋,從而避免功率元件燒毀。這段延遲時間就是死區。(就是上、下半橋的元件都是關斷的)死區時間控制在通常的低端單片機所配備的PWM中是沒有的。死區時間是PWM輸出時,為了使H橋或半H橋的上下管不會因為開關速度問題發生同時導通而設置的一個保護時段,所以在這個時間,上下管都不會有輸出,當然會使波形輸出中斷,死區時間一般只占百分之幾的周期。但是PWM波本身占空比小時,空出的部分要比死區還大,所以死區會影響輸出的紋波,但應該不是起到決定性作用的。
STM32 與 PWM
在STM32中,每個定時器有四個通道,每一個通道都有一個捕獲比較寄存器, 將寄存器值和計數器值比較,通過比較結果輸出高低電平,實現PWM信號。
在PWM輸出模式下,除了CNT(計數器當前值)、TIMX_ARR (自動重裝載值)之外,還多了一個值CCRx(捕獲/比較寄存器值)。
上文提到,脈沖調制有兩個重要的參數,輸出頻率分別通過兩個寄存器控制:TIMX_ARR和TIMX_CCRX。
- TIMX_ARR寄存器就是自動重裝寄存器,也就是計數器記到這個數以后清零再開始計,這樣pwm的頻率就是tim_frequency/(TIMX_ARR-1)。
- 在計數時會不停的和TIMX_CCRX寄存器中的數據進行比較,如果小於的話是高電平或者低電平,計數值大於TIMX_CCRX值的話電平極性反相。所以這也就控制了占空比。
- 當 CNT 小於 TIMX_ARR 時,TIMx_CHx通道輸出低電平;當 CNT 等於或大於 TIMX_CCRX 時,TIMx_CHx通道輸出高電平。
PWM的工作模式:
- PWM模式1(向上計數) :計數器從0計數加到自動重裝載值(TIMx_ARR),然后重新從0開始計數,並且產生一個計數器溢出事件。
- PWM模式2(向下計數) :計數器從自動重裝載值(TIMx_ARR)減到0,然后重新從重裝載值(TIMx_ARR)開始遞減,並且產生一個計數器溢出事件。
PWM頻率計算
Fpwm =Tclk / ((arr+1)*(psc+1))(單位:Hz)
- arr 是計數器值
- psc 是預分頻值
占空比:
- duty circle = TIM3->CCR1 / arr(單位:%)
- TIM3->CCR1 用戶設定值
比如 定時器頻率Tclk = 72Mhz arr=499 psc=71。 那么PWM頻率就是720000/500/72= 2000Hz,即2KHz。
arr=499,TIM3->CCR1=250 則pwm的占空比為50%
CubeMX 配置 PWM (以 TIM4 為例)
需要配置好 RCC 時鍾
1)在Pinout & Configuration中,選擇一個 定時器 (例如 TIM4)
2)"Mode"
- "Clock Source" :選擇 "Internal CLock"
- "Channle 1":選擇 "PWM Generation CH1"
3)"Configuration " - "Parameter Settings"中
- PSC : 167
- Counter Mode: Up
- Counter Period: 999
- auto-reload preload: Enable
- Trigger Event Selection : Reset
- Mode : PWM模式
- Pulse:占空比值 先給0
- Fast Mode : PWM脈沖快速模式(Disable, 和我們配置無關,不使能)
- CH Polarity : 通道極性(這個通道的初始電平高低)
- "Configuration " - "NVIC Settings"中 : 勾選 "Enabled" (開啟中斷)
5)右上角,"GENERATE CODE"