STM32高階定時器TIM1、TIM15輸出PWM
阿新 • • 發佈:2019-02-19
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輸出使能 其他定時器沒有該暫存器 不需要此項配置
}
在主函式呼叫
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;