使用STM32驅(qū)動無刷電機(分享)
主函數(shù)如下:
?int main(void)
?{
u8 i = 0;
u8 dir=1,key=1;
delay_init(); ? ? //延時函數(shù)初始化 ??
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
uart_init(115200); //串口初始化為115200
? LED_Init(); ? ? ?//LED端口初始化
? TIM3_PWM_Init(2000,720-1); //PWM頻率
? ?while(1)
{ ?
//電調(diào)初始化,把油門從低拉高,可自定義
for(i =190;i<240;i++){
TIM_SetCompare2(TIM3,i);
delay_ms(20);
}
while(1){
key=KEY_Scan(1); //得到鍵值
if(key)
{ ? ?
switch(key)
{ ?
case WKUP_PRES: //一檔
? TIM_SetCompare2(TIM3,160);
break;
case KEY2_PRES: //二檔
TIM_SetCompare2(TIM3,180);
break;
case KEY1_PRES: //三檔 ?
TIM_SetCompare2(TIM3,200);
break;
case KEY0_PRES: //四檔?
TIM_SetCompare2(TIM3,240);
break;
default:
TIM_SetCompare2(TIM3,190);
}
}
}? ?
} ?
}
PWM函數(shù)配置如下:
void TIM3_PWM_Init(u16 arr,u16 psc)
{??
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef? TIM_TimeBaseStructure;
TIM_OCInitTypeDef? TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時器3時鐘
? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB? | RCC_APB2Periph_AFIO, ENABLE);? //使能GPIO外設和AFIO復用功能模塊時鐘
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射? TIM3_CH2->PB5? ??
?
? ?//設置該引腳為復用輸出功能,輸出TIM3 CH2的PWM脈沖波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;? //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
?
? ?//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數(shù)的預分頻值?
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;? //TIM向上計數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
//初始化TIM3 Channel2 PWM模式 ?
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調(diào)制模式2
? TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性低
TIM_OC2Init(TIM3, &TIM_OCInitStructure);? //根據(jù)T指定的參數(shù)初始化外設TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);? //使能TIM3在CCR2上的預裝載寄存器
?
TIM_Cmd(TIM3, ENABLE);? //使能TIM3
}