實習公司專案需要控制步進電機,電機方面主要包括控制運動、加減速、限位,下面介紹一下在電機控制方面的心得,由于對于電機的控制不需要很精確,并且自身能力有限,相比于大牛有很大的差距,
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的輸出頻率,從而改變電機的速度
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56867.html
標籤:C
