STM32F103控制兩個步進(jìn)電機(jī)按照一定轉(zhuǎn)速比運(yùn)動
???????這個暑假沒有回家,在學(xué)校準(zhǔn)備九月份的電子設(shè)計(jì)競賽。今天想給大家分享一下STM32定時器控制兩個步進(jìn)電機(jī)按照一定速度比轉(zhuǎn)動的問題。
?????? 這次做的05年的電子設(shè)計(jì)競賽題目,運(yùn)動懸掛系統(tǒng)。。本實(shí)驗(yàn)是控制兩個步進(jìn)電機(jī)通過一個定滑輪用線掛一個重物,并使這個重物走直線。。
?????? 首先對定時器進(jìn)行配置。
???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ù),思路如下,將起點(diǎn)和終點(diǎn)的坐標(biāo)作為函數(shù)的傳遞參數(shù)。通過計(jì)算起點(diǎn)和終點(diǎn)到兩個滑輪之間的距離差可以算出兩個電機(jī)在這段時間轉(zhuǎn)過的距離。。因?yàn)闀r間是相同的,所以令兩個電機(jī)的速度比等于通過計(jì)算得到的距離比即可。。具體代碼如下:
?
void Draw_Line(float x1, float y1, float x2, float y2)??????
{
?float L1, L2;??????? //起始點(diǎn)到滑輪距離之差
?float sulv;???????? //兩個電機(jī)轉(zhuǎn)速比
?
?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)???????? //控制電機(jī)正反轉(zhuǎn)
??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;?????? //計(jì)算出走完L1、L2所需脈沖數(shù),,0.0006是通過幾組數(shù)據(jù)計(jì)算出來的。。
?countR = L2/0.0006;??????
?sulv = countL*170.0 /countR;???
?suduL = sulv;
?suduR = 170;??????? //算出兩個電機(jī)發(fā)生電平翻轉(zhuǎn)產(chǎn)生脈沖的時間比
?count = 0;
?countLR =0;
?
?TIM_Cmd(TIM3, ENABLE); ?? //定時器開始計(jì)時
}
???? 中斷服務(wù)程序中的內(nèi)容是定時器到達(dá)兩個電機(jī)規(guī)定的發(fā)生電平翻轉(zhuǎn)的時間的倍數(shù)是翻轉(zhuǎn)電平,產(chǎn)生脈沖驅(qū)動電機(jī)運(yùn)動。
?
void TIM3_IRQHandler(void)
{
?if((countLR == (countL*2)))
??TIM_Cmd(TIM3, DISABLE);??? //兩個電機(jī)運(yùn)動完成,,關(guān)定時器
?count++;??????????????????????????? //開始計(jì)時
?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++;???????????????????? //記錄電平翻轉(zhuǎn)次數(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年電子設(shè)計(jì)競賽的同學(xué)有所幫助,謝謝