stm32控制步進電機加減速


  實習公司項目需要控制步進電機,電機方面主要包括控制運動、加減速、限位。下面介紹一下在電機控制方面的心得,由於對於電機的控制不需要很精確,並且自身能力有限,相比於大牛有很大的差距。

1.需要實現的功能

  主要是控制滑塊的運動,開始運動時需要加速,當穩定在最高速度時勻速運動,檢測到下端限位信號時,開始減速直到停止,然后進行反向加速,勻速,檢測到上端限位時停止運動。

  加速——勻速——減速——停止——反向——加速——勻速——停止

2.硬件部分

  本次電機為兩相四線步進電機,兩相:電機有兩個線圈(繞組),四線:電機有四根線,一般是A+ A- B+ B-。有些電機不會標注出線的極性,其實可以用萬用表測,短接的就是同一個繞組,或者短接之后電機轉動很費力,也代表是同一個繞組。

  • 驅動

  電機的運動需要較大的電流,這取決於電機本身和負載,所以通常需要驅動芯片。而且驅動芯片可以實現許多附加的功能,包括細分、休眠、保護等。本次采用的是DRV8825驅動芯片模塊。模塊的介紹圖如圖所示:

   引腳介紹:

  1.ENABLE/:使能引腳,高電平停止工作,低電平正常工作;

  2.M0-M2:代表細分,最大可以達到32細分,這部分可以參考datasheet;

  3.RESET/  、SLEEP/:低電平會休眠和復位,因此電機正常工作時,兩個引腳接高電平;

  4.STEP:最重要的引腳,通過單片機給這個引腳PWM信號,控制電機運動;

  5.DIR:0和1控制電機方向;

  6.VMOT:供電引腳,一般用12-20V就可以了;

  7.B2-A1:接電機四根線;

  8.FAULT/:接高電平工作;

  • 光電限位

  光電限位采用的反射型,型號為sy1200,感應距離為1-4mm,當沒有遮擋時,輸出低電平;有遮擋時,代表有光反射回來,輸出高電平;測試過程中,發現最好采用白色的平面反射,效果更好。

 

3.軟件部分

  軟件主要就是通過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的輸出頻率,從而改變電機的速度 } } }

 

 

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM