???????這個暑假沒有回家,在學校準備九月份的電子設計競賽。今天想給大家分享一下STM32定時器控制兩個步進電機按照一定速度比轉動的問題。
?????? 這次做的05年的電子設計競賽題目,運動懸掛系統(tǒng)。。本實驗是控制兩個步進電機通過一個定滑輪用線掛一個重物,并使這個重物走直線。。
?????? 首先對定時器進行配置。
???void TIM_Configuration(void)
??{
?TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM3);
?TIM_TimeBaseStructure.TIM_Period =? 8;??//中斷時間為? T = ( TIM_Period + 1 )*( TIM_Prescaler + 1 )/TIMxCLK(72MHZ) =? 10(-6)?s
??? TIM_TimeBaseStructure.TIM_Prescaler =? 7;
??? TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
??? TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
??? TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
?
?TIM_ClearFlag( TIM3, TIM_FLAG_Update);
?TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE);?
?
}
?
????? 然后寫畫直線的函數(shù),思路如下,將起點和終點的坐標作為函數(shù)的傳遞參數(shù)。通過計算起點和終點到兩個滑輪之間的距離差可以算出兩個電機在這段時間轉過的距離。。因為時間是相同的,所以令兩個電機的速度比等于通過計算得到的距離比即可。。具體代碼如下:
?
void Draw_Line(float x1, float y1, float x2, float y2)??????
{
?float L1, L2;??????? //起始點到滑輪距離之差
?float sulv;???????? //兩個電機轉速比
?
?L1 = sqrt((x1 + 15)*(x1 + 15) + (115 - y1)*(115 - y1)) - sqrt((x2 + 15)*(x2 + 15) + (115 - y2)*(115 - y2));
?L2 = sqrt((95 - x1)*(95 - x1) + (115 - y1)*(115 - y1)) - sqrt((95 - x2)*(95 - x2) + (115 - y2)*(115 - y2));
?
?if(L1>0)???????? //控制電機正反轉
??GPIO_SetBits(GPIOA,GPIO_Pin_6);
?else
??GPIO_ResetBits(GPIOA,GPIO_Pin_6);
?if(L2>0)
??GPIO_SetBits(GPIOA,GPIO_Pin_7);
?else
??GPIO_ResetBits(GPIOA,GPIO_Pin_7);
?
?L1 = fabs(L1);
?L2 = fabs(L2);?
?countL = L1/0.0006;?????? //計算出走完L1、L2所需脈沖數(shù),,0.0006是通過幾組數(shù)據(jù)計算出來的。。
?countR = L2/0.0006;??????
?sulv = countL*170.0 /countR;???
?suduL = sulv;
?suduR = 170;??????? //算出兩個電機發(fā)生電平翻轉產生脈沖的時間比
?count = 0;
?countLR =0;
?
?TIM_Cmd(TIM3, ENABLE); ?? //定時器開始計時
}
???? 中斷服務程序中的內容是定時器到達兩個電機規(guī)定的發(fā)生電平翻轉的時間的倍數(shù)是翻轉電平,產生脈沖驅動電機運動。
?
void TIM3_IRQHandler(void)
{
?if((countLR == (countL*2)))
??TIM_Cmd(TIM3, DISABLE);??? //兩個電機運動完成,,關定時器
?count++;??????????????????????????? //開始計時
?if( !(count % suduR) )
?{?
??if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)==0)
???GPIO_SetBits(GPIOA,GPIO_Pin_4);
??else
????? GPIO_ResetBits(GPIOA,GPIO_Pin_4);
??countLR++;???????????????????? //記錄電平翻轉次數(shù),即脈沖數(shù)的一半
?}
???
?if( !(count % suduL) )
?{?
??if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)==0)
???GPIO_SetBits(GPIOA,GPIO_Pin_5);
??else
????? GPIO_ResetBits(GPIOA,GPIO_Pin_5);
?}
?
/*防止定時器溢出*/
?if(count == suduL*suduR)
?{?
??count=0;?
?}??????????????????????
?
?TIM_ClearFlag(TIM3, TIM_FLAG_Update);???????? //一定不要忘記清除中斷位
}
?
???? 以上就是我想分享給大家的,,希望對正在積極備戰(zhàn)2013年電子設計競賽的同學有所幫助,謝謝





