定時器輸出PWM波
什麼是PWM
脈衝寬度調製(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調製,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。
PWM工作原理
SMT32F1系列共有8個定時器:
高級定時器(TIM1、TIM8);通用定時器(TIM2、TIM3、TIM4、TIM5);基本定時器(TIM6、TIM7)。
SMT32F4系列共有15個定時器:
高級定時器(TIM1、TIM8);通用定時器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定時器(TIM6、TIM7)。
STM32的每個通用定時器都有獨立的4個通道可以用來作爲:輸入捕獲、輸出比較、PWM輸出、單脈衝模式輸出等。
STM32的定時器除了TIM6和TIM7(基本定時器)之外,其他的定時器都可以產生PWM輸出。其中,高級定時器TIM1、TIM8可以同時產生7路PWM輸出
原理講解:
下圖爲向上計數模式:
-
在PWM輸出模式下,除了CNT(計數器當前值)、ARR(自動重裝載值)之外,還多了一個值CCRx(捕獲/比較寄存器值)。
-
當CNT小於CCRx時,TIMx_CHx通道輸出低電平;
-
當CNT等於或大於CCRx時,TIMx_CHx通道輸出高電平。
PWM的一個週期
-
定時器從0開始向上計數
-
當0-t1段,定時器計數器TIMx_CNT值小於CCRx值,輸出低電平
-
t1-t2段,定時器計數器TIMx_CNT值大於CCRx值,輸出高電平
-
當TIMx_CNT值達到ARR時,定時器溢出,重新向上計數…循環此過程
-
至此一個PWM週期完成
總結:
每個定時器有四個通道,每一個通道都有一個捕獲比較寄存器,
將寄存器值和計數器值比較,通過比較結果輸出高低電平,便可以實現脈衝寬度調製模式(PWM信號)
TIMx_ARR寄存器確定PWM頻率,
TIMx_CCRx寄存器確定佔空比
詳解:
若配置脈衝計數器TIMx_CNT爲向上計數,而重載寄存器TIMx_ARR配置爲N,即TIMx_CNT的當前計數值數值X在TIMxCLK時鐘源的驅動下不斷累加,當TIMx_CNT的數值X大於N時,會重置TIMx_CNT數值爲0重新計數。
而在TIMxCNT計數的同時,TIMxCNT的計數值X會與比較寄存器TIMx_CCR預先存儲了的數值A進行比較,當脈衝計數器TIMx_CNT的數值X小於比較寄存器TIMx_CCR的值A時,輸出高電平(或低電平),相反地,當脈衝計數器的數值X大於或等於比較寄存器的值A時,輸出低電平(或高電平)。
如此循環,得到的輸出脈衝週期就爲重載寄存器TIMx_ARR存儲的數值(N+1)乘以觸發脈衝的時鐘週期,其脈衝寬度則爲比較寄存器TIMx_CCR的值A乘以觸發脈衝的時鐘週期,即輸出PWM的佔空比爲A/(N+1)。
PWM的工作模式:
PWM模式1(向上計數) :計數器從0計數加到自動重裝載值(TIMx_ARR),然後重新從0開始計數,並且產生一個計數器溢出事件
PWM模式2(向下計數) :計數器從自動重裝載值(TIMx_ARR)減到0,然後重新從重裝載值(TIMx_ARR)開始遞減,並且產生一個計數器溢出事件
設置寄存器TIMx_CCMR1的OC1M[2:0]位來確定PWM的輸出模式:
-
PWM模式1:在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1爲有效電平,否則爲無效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1爲無效電平(OC1REF=0),否則爲有效電平(OC1REF=1)。
-
PWM模式2:在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1爲無效電平,否則爲有效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1爲有效電平,否則爲無效電平。
在兩種模式下TIMx_CNT(計數器當前值)與TIMx_CCR1(捕獲/比較值) 只是決定是有效電平還是無效電平
有效電平可以是高電平也可以是低電平,這需要結合CCER寄存器的CC1P位的值來確定。
TIMx_CCER寄存器的CCCP位,設置輸入/捕獲通道1輸出極性
- 0:高電平爲有效電平
- 1:低電平爲有效電平
若爲向上計數,且CCER寄存器的CC1P位爲0,則當TIMx_CNT<TIMx_CCR1時,輸出高電平;
同樣向上計數,且CCER寄存器的CC1P位爲1,則當TIMx_CNT<TIMx_CCR1時,輸出低電平。
PWM的工作過程
1、CCR1寄存器:捕獲/比較值寄存器:設置比較值;
計數器值TIMx_CNT與通道1捕獲比較寄存器CCR1進行比較,通過比較結果輸出有效電平和無效電平
OC1REF=0 無效電平
OC1REF=1 無效電平
2、TIMx_CCMR1寄存器:OC1M[2:0]位:用於設置PWM模式
110:PWM模式1
111:PWM模式2
3、CCER寄存器:CC1P位:輸入/捕獲1輸出極性。
0:高電平爲有效電平
1:低電平爲有效電平
4、CCER寄存器:CC1E位:輸入/捕獲1輸出使能。
0:關閉使能
1:打開使能
5、輸出電平信號
TIM定時器的四路通道TIMx_CHx輸出PWM
摘自: 《STM32中文參考手冊》254頁 通用定時器框圖
STM32定時器輸出通道引腳
具體不同定時器對應引腳在對應芯片數據手冊的引腳說明(pin description) 中查看
這裏我們以TIM3_CH1 PA6作爲講解
CUBEMX設置
-
HSE選擇外部時鐘源
-
設置定時器
- 1.選擇TIM3
- 2.設置定時器時鐘源爲內部時鐘源
- 設置定時器CH1爲PWM模式
- 3.對應管腳自動設置爲複用模式
- 4.可自行選擇是否開啓定時器中斷
Channel1~4 就是設置定時器通道的功能 (輸入捕獲、輸出比較、PWM輸出、單脈衝模式)
- Mode 選擇PWM模式1
- Pulse(佔空比值) 先給0
- Fast Mode PWM脈衝快速模式 : 和我們配置無關,不使能
- PWM 極性: 設置爲低電平 PS: 由於LED是低電平點亮,所以我們把極性設置爲low
在 Parameter Settings 頁配置預分頻係數爲 71,計數週期(自動加載值)爲 499,定時器溢出頻率,即PWM的週期,就是 72MHz/(71+1)/(499+1) = 2kHz(關於預分配係數和自動加載值說的知識在上一節)
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%
改CCR1可以修改佔空比,修改arr可以修改頻率
- 1選擇外部時鐘HSE 8MHz
- 2PLL鎖相環倍頻72倍
- 3系統時鐘來源選擇爲PLL
- 4設置APB1分頻器爲 /2
MDK設置
函數總結
__HAL_TIM_SetCompare // 是設置CCRx,一般是用在PWM輸出的,控制PWM佔空比
__HAL_TIM_GET_COMPARE// 是用來讀取CCRx的,一般用於捕獲處理
定義變量:
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM佔空比
/* USER CODE END 1 */
然後使能TIM3的PWM Channel1 輸出。
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
在while循環中添加代碼:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比較值,修改佔空比
// TIM3->CCR1 = pwmVal; 與上方相同
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比較值,修改佔空比
// TIM3->CCR1 = pwmVal; 與上方相同
HAL_Delay(1);
}
HAL_Delay(200);
/* USER CODE END 3 */
}
將上述代碼燒錄進STM32,就會發現板子上得燈在進行“呼吸”了!