最近在用stm32定時器控制步進電機,由於普通定時器不夠用,只能把TIM1當普通定時器用,我隨手就把普通定時器的代碼搬過去。
void cs_Timer_Init(void) //TIM1 us級
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* Time base configuration */
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);
}
編譯下載后,發現步進電機轉的很慢,和原先預計的不一樣,第一反應是懷疑拷貝過來的代碼有問題,核對了一邊發現沒問題,用邏輯分析儀測試了,發現真是定時器慢了,在檢查代碼,發現 TIM_TimeBaseInitTypeDef 結構體中的一個參數 TIM_RepetitionCounter 一直沒用,查查資料,這個值是計數值滿溢出幾次才進入中斷,就試着把這個值也初始化為0,發現步進電機變快了,測量波形,定時器OK。
void cs_Timer_Init(void) //TIM1 us級
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* Time base configuration */
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);
}
