實習公司項目須要控制步進電機,電機方面主要包括控制運動、加減速、限位。下面介紹一下在電機控制方面的心得,因爲對於電機的控制不須要很精確,而且自身能力有限,相比於大牛有很大的差距。數組
主要是控制滑塊的運動,開始運動時須要加速,當穩定在最高速度時勻速運動,檢測到下端限位信號時,開始減速直到中止,而後進行反向加速,勻速,檢測到上端限位時中止運動。測試
加速——勻速——減速——中止——反向——加速——勻速——中止spa
本次電機爲兩相四線步進電機,兩相:電機有兩個線圈(繞組),四線:電機有四根線,通常是A+ A- B+ B-。有些電機不會標註出線的極性,其實能夠用萬用表測,短接的就是同一個繞組,或者短接以後電機轉動很費力,也表明是同一個繞組。excel
電機的運動須要較大的電流,這取決於電機自己和負載,因此一般須要驅動芯片。並且驅動芯片能夠實現許多附加的功能,包括細分、休眠、保護等。本次採用的是DRV8825驅動芯片模塊。模塊的介紹圖如圖所示:code
引腳介紹:blog
1.ENABLE/:使能引腳,高電平中止工做,低電平正常工做;it
2.M0-M2:表明細分,最大能夠達到32細分,這部分能夠參考datasheet;class
3.RESET/ 、SLEEP/:低電平會休眠和復位,所以電機正常工做時,兩個引腳接高電平;軟件
4.STEP:最重要的引腳,經過單片機給這個引腳PWM信號,控制電機運動;date
5.DIR:0和1控制電機方向;
6.VMOT:供電引腳,通常用12-20V就能夠了;
7.B2-A1:接電機四根線;
8.FAULT/:接高電平工做;
光電限位採用的反射型,型號爲sy1200,感應距離爲1-4mm,當沒有遮擋時,輸出低電平;有遮擋時,表明有光反射回來,輸出高電平;測試過程當中,發現最好採用白色的平面反射,效果更好。
軟件主要就是經過stm32輸出PWM脈衝,脈衝的頻率決定了電機的速度。
PWM經過定時器產生,決定頻率的主要是arr重裝載值,以及psc預分頻值。最終輸出的PWM頻率爲72000k/(arr*psc)。
因爲須要作到加減速,也就意味着PWM的頻率是改變的,所以arr的值須要改變。參考網上對於加減速的一些方法:主要有T型加減速和S型加減速,實現方法有公式法或者查表法。因爲公式法比較麻煩,就直接採用了查表法。因此根據須要的頻率,計算出不一樣頻率下的arr值,寫到數組裏,就能夠實現頻率的改變。不過這種方法下,頻率的改變是根據時間作線性或者S型變化,這種方法對嗎?仍是根據步數來改變?
S型加減速:
T型加速就是勻加速,固定加速度。S型加速須要根據公式計算,詳細說明以下:
其中Fcurrent表明某個點的頻率:Fmin表明最小頻率;Fmax表明最大頻率;Flexible爲S曲線區間係數,越大表明壓縮的最厲害,中間(x座標0點周圍)加速度越大;越小越接近勻加速。理想的S曲線的取值爲4-6;num:頻率點/2;
例如想要從1kHz加速到40kHz,中間通過40個點,Fmin=1kHz,Fmax=40kHz,num=40/2=20,最後經過excel計算出各個頻率值,能夠發如今末端的加速是很是緩慢的,中間加速比較大。問題就是,初始速度並非1khz了,他取決於係數的取值,取6時,初始速度就越小。
軟件中實現:
採用定時器3輸出PWM脈衝,定時器2用於計數中斷(更精確的控制能夠經過定時器2來計算出給出多少個脈衝,也就是電機運動的步數,那樣的話就能夠精確控制電機運動,造成開環反饋)
// 加減速實現部分
void TIM2_IRQHandler(void) // { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // time++; if(time>=35)// { time=0; //每x個週期進入定時後,對time進行清零,而後從新進行累加 if(jiasu==1) //加速狀態 { n=n+1; fre=freq[n]; } if(jiasu==0) //減速狀態,檢測到下端的限位後進行減速,此時的n應該等於加速以後的最大值,也就是頻率最大的時候,接下來進行遞減,速度下降 { n=n-1; fre=freq[n]; } if(n>=38)// { n=38; } if(n<=0) //根據前面速度遞減,當減到第一個數時,速度已經降到了1k,可讓電機開始中止而後轉向 { GPIO_SetBits(GPIOC,GPIO_Pin_6); // 拉高步進電機的enable,中止運動 DIR0=!DIR0; //轉向 delay_ms(100); n=0; fre=freq[n]; jiasu=1; GPIO_ResetBits(GPIOC,GPIO_Pin_6); // 轉向以後拉低電機的enable,開始運動 } TIM3_PWM_Init(fre,9); TIM_SetCompare4(TIM3,fre/2);// 改變TIM3的輸出頻率,從而改變電機的速度 } } }