首頁 > 評測 > Sensortile評測----平坦度測量之42步進電機調試

Sensortile評測----平坦度測量之42步進電機調試

  
  • 作者:
  • 來源:
  • [導讀]
  • 項目需求,動作部分需要步進電機參與,去年論壇送的3D打印機還在,那就用A4988驅動模塊和42步進電機了。 一、模塊介紹: 1、步進電機: 1>步進電機:在非超載的情況下,電機的轉速、停止的位置只取決于脈沖信號
項目需求,動作部分需要步進電機參與,去年論壇送的3D打印機還在,那就用A4988驅動模塊和42步進電機了。
一、模塊介紹:

1、步進電機:
1>步進電機:在非超載的情況下,電機的轉速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負載變化的影響,當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度,稱為“步距角”,它的旋轉是以固定的角度一步一步運行的。可以通過控制脈沖個數(shù)來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉動的速度。

圖1 四線兩相步進電機原理圖

2〉42步進電機
42意思是說安裝機座寬42mm,如下圖



圖2 42步進電機機械圖

其額定轉矩為0.5Nm。

2、A4988步進電機驅動模塊


圖3 A4988IC功能框圖

A4988一個帶轉換器和過流保護功能的DMOS(vertical double-diffused MOSFET)微步驅動芯片。

其MS1/2/3是模式選擇邏輯引腳,共有五種不同的步進模式(全、半、1/4、1/8、1/16),模式根據(jù)應用精度選擇,其具體介紹見官方datasheet。



圖4 模式邏輯表


圖5 時序圖


下面是A4988在3D打印機應用中的經(jīng)典模塊電路

圖6 3D打印RAMPS1.4電路中的驅動模塊

RAMPS1.4電路板中,MS1/2/3、reset和sleep引腳被上拉,step、enable和dir,以及OUT1A、OUT1B、OUT2A、OUT2B引腳外留。

二、用Arduino開發(fā)板調試驅動塊:

開發(fā)板用的是ATmega2560 R3,驅動模塊的dir、step、enable分別接于開發(fā)板的28、26、24接口,前面說過A4988的模式,網(wǎng)上查來說,在全模式下,轉一圈要200個步進值或一個步進1.8°,而我們的板子是在1/16的模式下,即轉一圈需要16*200個步,這里的1步指的是step引腳的一個周期方波,方波的周期決定了旋轉的速度,而總的步進數(shù)決定了旋轉的角位移,兩者其實耦合,不糾結了,經(jīng)測試方波的周期在300us至1600us之間電機運行穩(wěn)定。


下面是這次調試的代碼:

  • char Dir=28;
  • char Step=26;
  • char Enable=24;
  • //MS1/2/3 5V
  • void setup() {
  •   // put your setup code here, to run once:
  •   pinMode(Enable,OUTPUT); // Enable
  •   pinMode(Step,OUTPUT); // Step
  •   pinMode(Dir,OUTPUT); // Dir
  •   digitalWrite(Enable,LOW); // Set Enable low
  •   //digitalWrite(Dir,HIGH); // Set Dir high
  • }
  • void loop() {
  •   // put your main code here, to run repeatedly:
  •   digitalWrite(Dir,HIGH); // Set Dir high  正轉
  •   for(int x = 0; x < 3200; x++)
  •   {
  •       digitalWrite(Step,HIGH); // Output high
  •       delayMicroseconds(800); //
  •       digitalWrite(Step,LOW); // Output low
  •       delayMicroseconds(800); //
  •   }
  • delay(5000);
  • digitalWrite(Dir,LOW); // Set Dir low 反轉
  •   for(int x = 0; x <3200; x++)
  •   {
  •       digitalWrite(Step,HIGH); // Output high
  •       delayMicroseconds(800); //
  •       digitalWrite(Step,LOW); // Output low
  •       delayMicroseconds(800); //
  •    }
  •     delay(5000); // pause five second
  • }

復制代碼




三、總結:


此次調試唯一經(jīng)驗就是,一定不忘以前養(yǎng)成的程序編寫習慣,切記,下面來說說這次遇到的坑,


首先、是第二次玩Arduino,對其編輯、編譯器和代碼書寫要求沒有任何好感,個人感覺。


其次、犯了一個很沒程序素養(yǎng)的問題,程序是先讓電機正轉一圈,延遲5s后再反轉一圈,如此輪回,結果一直在正轉,怪了,什么鬼?于是拿著表測了一下方向控制腳,發(fā)現(xiàn)的確沒有執(zhí)行到這一步,看了半天沒看出來,于是就回頭去測電路板,排除硬件的影響,任然無效,于是從程序for循環(huán)開始排查,是不是步數(shù)轉多了,電機剩磁太大,老死機的經(jīng)驗,就慢慢改步數(shù),從3200改到了100,發(fā)現(xiàn)改到150時還是一樣,但改到100時可以反轉了,聰明的你知道是什么原因了吧,差不多找著你了,于是改到了126發(fā)現(xiàn)可以反轉,又改到了130不反轉,好家伙,x溢出了!!,???恩,無緣無故你溢出個球,x怎么是char類型的,我明明定義的是int啊,于是想了想,當初定義了一個全局變量x,char類型的,寫for的時候為了省事,就用了它,這回是哭笑不得,好吧,老了,記性太差,改回來后,ok了,覺得好笑,寫這麼多,大家一起笑笑undefined。

  • 本文系21ic原創(chuàng),未經(jīng)許可禁止轉載!

網(wǎng)友評論