STM32CubeMX Lesson 6 ─ TIMER應用之PWM控制

PWM (Pulse-width modulation)脈波寬度調變,常常應用於控制風扇、馬達、LED燈光、通訊等等,主要是控制脈波的Duty,使電壓平均值為不同的數值,用以上述相關應用。

  引用Wiki的內容,講得非常好:「將類比訊號轉換為脈波的一種技術,一般轉換後脈波的週期固定,但脈波的工作週期會依類比訊號的大小而改變。」

下文將以STM32L053R8Tx為示範,使用意法半導體官方所提供的Nucleo開發板完成該實驗,使用的IDE為Keil uVision5(MDK-ARM),而STM32CubeMX的版本為6.2.1。

Lesson5有介紹到 TIMER ,其中TIMER2、TIMER21、TIMER22皆可以用來做PWM輸出,在此以TIMER2的Channel1為例。

在 TIMER 中有不少的暫存器,其中有PSC、ARR、CCRx是與 PWM 的設定有直接的關係,而PSC是使用Clock除頻作為該 TIMER 的基頻,ARR是自動裝載數值、CCRx是比較值,CCRx/ARR則是 PWM 的Duty,以下圖為例來了解。

TIMER 開啟後會將ARR的數值裝載,且內部會有一個CNT暫存器,以除頻後的頻率計數到ARR,則會回到0重新計數。而當計數值超過或低於CCRx值時,則會變更輸出狀態。可以透過調整 PWM Mode,改變預設是High或是Low。

開啟STM32Cube後,將TIMER2的Channel1設定為 PWM 輸出,可以看見PA0的Pin腳已經被設定為TIM2_CH1,而下方的設定我們不在此做設定,後續可以直接在Keil進行上述暫存器的控制。

產生程式碼後,開啟main.c,在while前做 PWM 的設定。剛剛有提到 PWM 的暫存器有3個主要設定的,分別是PSC、ARR、CCRx,因為我們使用的是Channel1,因此CCRx使用CCR1。

Clock使用32Mhz,PSC設定為32-1、ARR為1000-1、CCR1為500-1,則設定為1khz、Duty為50%,接著需開啟 PWM 的輸出,使用HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);

TIM2->PSC=32-1;
TIM2->ARR=1000-1;
TIM2->CCR1=500-1;
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);

燒錄完成後即可以透過示波器觀察到週期1ms、頻率1khz、Duty為50%的脈波。

透過調整CCRx的數值,則可以變更不同的Duty產生。若要產生呼吸燈的效果,則可以遞增CCRx值,直到等於ARR值後,遞減至0,則可以達到此效果。

 TIM2->PSC=32-1;
	TIM2->ARR=1000-1;
	TIM2->CCR1=0;
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	uint8_t flag=0;	//-- 0:Increase 1:Decrease
  while (1)
  {
		if(flag==0){
			if(++TIM2->CCR1>=TIM2->ARR){
				flag=1;
			}
		}else{
			if(--TIM2->CCR1<=0){
				flag=0;
			}
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

在前面也提及可以調整 PWM Mode,決定CCRx/ARR的Duty是 Positive Duty 或是Negative Duty,同時也可以直接透過程式碼的調整修改,不一定要透過暫存器。

若要直接修改 PWM 的Mode,可以查看Datasheet找到決定 PWM Mode的暫存器位於CCMR1的bit4~bit6。

當bit6~bit4為110則是 PWM Mode1,控制Positive Duty正占空比,若為111則是 PWM Mode2,控制Negative Duty負占空比。

因此我們控制bit4則可以切換Mode,若要是Mode1則清除OC1M的bit0,反之則是寫入bit0。在while前面選擇一個做為設定就可以囉,預設都是Mode1。

TIM2->CCMR1&=~TIM_CCMR1_OC1M_0;		//Mode1
TIM2->CCMR1|=TIM_CCMR1_OC1M_0;		//Mode2

透過上述的教學,可以了解 PWM 的輸出控制,進而控制週邊的LED、馬達等相關周邊電路。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *