STM32標準庫通用定時器PWM生成

T7H發表於2024-03-08

STM32標準庫通用定時器PWM生成

1. 初始化

void TIM2_Init()                                            // 定時器2初始化
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     // 使能定時器2的時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    // 使能GPIOA的時鐘
	
	GPIO_InitTypeDef GPIO_InitStructure;                    // 定義一個GPIO_InitTypeDef型別的結構體
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;      // 定義一個TIM_TimeBaseInitTypeDef型別的結構體
	TIM_OCInitTypeDef TIM_OCInitStructure;                  // 定義一個TIM_OCInitTypeDef型別的結構體
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;               // 選擇要控制的GPIO引腳
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         // 設定引腳為複用推輓輸出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       // 設定引腳速度為50MHz
	GPIO_Init(GPIOA,&GPIO_InitStructure);                   // 初始化GPIOA的引腳
	
	TIM_TimeBaseInitStructure.TIM_Period = 1000-1;          // 設定在下一個更新事件裝入活動的自動重灌載暫存器週期的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200-1;       // 設定用來作為TIM2時脈頻率的預分頻值
	TIM_TimeBaseInitStructure.TIM_ClockDivision  = TIM_CKD_DIV1;    // 設定時鐘分割
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 設定TIM2計數器的工作模式
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);              // 初始化TIM2
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;               // 設定TIMx的通道的輸出比較模式
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 設定輸出比較狀態
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;     // 設定輸出比較極性
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);                 // 初始化TIM2通道3
	
	TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);        // 使能TIMx在CCR3上的預裝載暫存器
	
	TIM_CtrlPWMOutputs(TIM2,ENABLE);                        // 使能TIMx的輸出比較

	TIM_Cmd(TIM2,ENABLE);                                   // 使能TIM2
}

STM32通用定時器生成的PWM波形週期為 (STM32主頻)/((TIM_Period+1)*(TIM_Prescaler+1))

  • TIM_OCMode:PWM的模式,有兩種模式:TIM_OCMode_PWM1和TIM_OCMode_PWM2

    • TIM_OCMode_PWM1:向上計數時,一旦TIMx_CNT < TIMx_CCR1時通道1為有效電平,否則為無效電平;在向下計數時,一旦TIMx_CNT >TIMx_CCR1時通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。

    • TIM_OCMode_PWM2:與TIM_OCMode_PWM1相反。在向上計數時,一旦TIMx_CNT < TIMx_CCR1時通道1為無效電平,否則為有效電平;在向下計數時,一旦TIMx_CNT > TIMx_CCR1時通道1為有效電平,否則為無效電平。

  • TIM_OCNPolarity_High:PWM的輸出極性

    • TIM_OCNPolarity_High:輸出比較極性高

    • TIM_OCNPolarity_Low:輸出比較極性低

PWM的模式不能單獨討論,必須要和對應的輸出極性放在一起才有意義。

例如:設定輸出極性為高,則在有效電平內,輸出高電平;在無效電平內,輸出低電平。設定輸出極性為低,則在有效電平內,輸出低電平;在無效電平內,輸出高電平。是否決定有效電平和無效電平的,取決於PWM的模式。

在初始化通道時要注意,對應的通道有專門的函式名字,例如我這裡使用的為TIM2的通道3,那麼對應的函式名字為TIM_OC3Init與TIM_OC3PreloadConfig。

2. 設定PWM佔空比

設定PWM佔空比只需要一個函式:

  • void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)

    • 這裡是通道3,如果為通道2,則需要使用函式TIM_SetCompare2,其餘通道同理。

    • Compare3為要設定的佔空比,實際佔空比為(Compare3/TIM_Period)*100%。

相關文章