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