1. 程式人生 > >STM32高階定時器TIM1、TIM15輸出PWM

STM32高階定時器TIM1、TIM15輸出PWM

1、TIM初始化基本過程及原始碼

(a)GPIO、TIM結構體變數申明

(b)GPIO、TIM時鐘使能

(c)GPIO基本配置

(d)TIM配置、通道設定

(e)TIM使能

原始碼如下:

/**
* @brief void TIM_Configuration(void)
* @describe TIM配置  PWM輸出初始化
            TIM1 CH1 PA8
TIM1 CH2 PA9
TIM15 CH1 PB14
TIM15 CH2 PB15
* @param  void
* @retval void
*/
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
TIM_OCInitTypeDef         TIM_OCInitStructure;
GPIO_InitTypeDef          GPIO_InitStructure;

  //時鐘使能
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_TIM15, ENABLE);
  //GPIOA配置
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin   =GPIO_Pin_8|GPIO_Pin_9;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);//PA8選擇備用功能 電機1 TIM1 CH1
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);//PA9選擇備用功能 電機1 TIM1 CH2
  //GPIOB配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_1);//PB14選擇備用功能 電機2 TIM15 CH1
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_1);//PB15選擇備用功能 電機2 TIM15 CH2
  //TIM配置
  TIM_TimeBaseStructure.TIM_Period = fill_value;//480  最大計數值 決定PWM頻率
  TIM_TimeBaseStructure.TIM_Prescaler = 0;//時鐘預分頻數  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//時鐘0分割  1次時鐘頻率 1次計數
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計數
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  TIM_TimeBaseInit(TIM15, &TIM_TimeBaseStructure);
  //TIM通道配置
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse =fill_value*0.5;//通道佔空比係數
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);//TIM1通道1 電機1 
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);//TIM1通道2 電機1 
  TIM_OC1Init(TIM15, &TIM_OCInitStructure);//TIM15通道1 電機2
  TIM_OC2Init(TIM15, &TIM_OCInitStructure);//TIM15通道2 電機2
//通道CH3 呼叫 TIM_OC3Init 函式 
//通道CH4 呼叫 TIM_OC4Init 函式 
  //使能TIM1 TIM15  
  TIM_Cmd(TIM1, ENABLE);
TIM_Cmd(TIM15, ENABLE);
TIM1->BDTR|=1<<15;//TIM1輸出使能  其他定時器沒有該暫存器 不需要此項配置
TIM15->BDTR|=1<<15;//TIM15輸出使能 其他定時器沒有該暫存器 不需要此項配置
}

在主函式呼叫

//1號電機正轉
TIM_SetCompare1(TIM1,0.5*fill_value);
TIM_SetCompare2(TIM1,0);
//2號電機反轉
TIM_SetCompare1(TIM15,0);

TIM_SetCompare2(TIM15,fill_value);

即可設定對應通道輸出PWM

2、PWM輸出驗證


3、重要的相關配置

GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_1);

該函式配置對應GPIO引腳的功能,具體的引腳功能引數GPIO_AF_x 找對應的晶片資料手冊 檢視

下圖為STM32F051C8T6相關引腳功能



與其他普通定時器不同的是 特別注意TIM1、TIM15的BDTR

暫存器 需要將MOD置位(暫存器第15位) 才能輸出PWM

TIM1->BDTR|=1<<15;

TIM15->BDTR|=1<<15;