最近在用stm32定時器控制步進電機,由于普通定時器不夠用,只能把TIM1當普通定時器用,我隨手就把普通定時器的代碼搬過去。
voidcs_Timer_Init(void)//TIM1us級
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
/*Timebaseconfiguration*/
TIM_TimeBaseStructure.TIM_Period=1000;
TIM_TimeBaseStructure.TIM_Prescaler=71;
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
}
編譯下載后,發(fā)現(xiàn)步進電機轉的很慢,和原先預計的不一樣,第一反應是懷疑拷貝過來的代碼有問題,核對了一邊發(fā)現(xiàn)沒問題,用邏輯分析儀測試了,發(fā)現(xiàn)真是定時器慢了,在檢查代碼,發(fā)現(xiàn)TIM_TimeBaseInitTypeDef 結構體中的一個參數(shù)TIM_RepetitionCounter一直沒用,查查資料,這個值是計數(shù)值滿溢出幾次才進入中斷,就試著把這個值也初始化為0,發(fā)現(xiàn)步進電機變快了,測量波形,定時器OK。
voidcs_Timer_Init(void)//TIM1us級
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
/*Timebaseconfiguration*/
TIM_TimeBaseStructure.TIM_Period=1000;
TIM_TimeBaseStructure.TIM_Prescaler=71;
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//修改此處
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
}