用途
步進馬達可以控制比較精密的動作, 例如4相步進馬達, 可以把一圈360度分為2048 or 4096 個等分, 程式碼可以精密的控制馬達轉動等分.
步進馬達定位較精確, 可使用1000rpm以內的速度運轉, 適合動作頻繁與距離短的應用, 比如自動門的開啟. 步進馬達通常搭配控制晶片, 程式比較容易設計, 以下使用整合ULN2003晶片的控制模組, 可連接步進馬達的插座、指示燈號與連接到Raspberry Pi的針腳‧
至於伺服馬達, 也可精確的控制馬達定位角度, 反應速度比步進馬達快, 運轉的扭力也較大, 但轉向只能在0-180度之間, 通常適用於方向機之類的應用.
照片
28BYJ-48 會附有一個控制板, 控制板的編號為 ULN2003. 透過控制板就可以容易的控制步進馬達. 請注意, UL2003的電源可使用5V 及12V. 而本版本的右邊是+ 極, 左邊是 – 極.
小編曾參照網路上的接法, 將正反極接反而無法運轉, 還好沒有燒掉.
規格
28BYJ-48的規格如下
Rated voltage : 5VDC
Number of Phase : 4 相
Speed Variation Ratio : 1/64
Stride Angle : 5.625° /64
Frequency : 100Hz
DC resistance : 50Ω±7%(25℃)
Idle In-traction Frequency : > 600Hz
Idle Out-traction Frequency : > 1000Hz
In-traction Torque >34.3mN.m(120Hz)
Self-positioning Torque >34.3mN.m
Friction torque : 600-1200 gf.cm
Pull in torque : 300 gf.cm
Insulated resistance >10MΩ(500V)
Insulated electricity power :600VAC/1mA/1s
Insulation grade :A
Rise in Temperature <40K(120Hz)
Noise <35dB(120Hz,No load,10cm)
Model : 28BYJ-48
28BYJ-48 是四相 5線的規格
運作方式
下圖為四相圖面, 所謂四相是指有四個定子, 也就是四組線圈. 而下圖的激磁方式為一次激發一組線圈, 稱為一相激磁.
1. 先激發北方的線圈, 把轉子的N極吸到北方.
2. 激發西方的線圈, 把轉子的N極及到西方.
3. 激發南方的線圈, 把轉子的N極及到南方.
4. 激發東方的線圈, 把轉子的N極及到東方.
此種方式電力消耗小, 缺點是振動大, 轉距小.
一相激磁
二相激磁
二相激磁是一次激發二組線圈, 如下圖. 此種方式振動小、轉距大
半相激磁
先激發北方, 再激發北/西, 然後西, 西/南, 南, 南/東, 東, 東/北
角度控制
上述不論是一相激磁, 二相激磁, 還是一/二相激磁(半相), 不是四個方向, 頂多也才八個方向而以. 那如何控制在精準的其他角度呢.
原來是每次送一個脈衝, 就改變一個基本步進角, 然後停住.
一相激磁, 二相激磁
先看一下官方原文的說法
There are 32 steps per revolution on my sample motor, and inside is a 1/64 reduction gear set. Gear reduction is actually : (32/9)/(22/11)x(26/9)x(31/10)=63.683950617, This means is that there are really 32*63.683950617 steps per revolution = 2037.88641975 ~ 2038 steps!
上述說明, 在一相激磁或二相激磁時, 轉子每轉一圈是32步(齒), 也就是每一次脈衝, 就會轉1齒, 需要32次脈衝才會轉一圈. 但裏面有一個減速齒輪組, 是1:64的比率. 也就是說轉子轉64圈, 輸出軸心才會轉一圈.
說的更白話一點, 也就是輸出軸心轉一圈, 轉子需轉64圈, 而轉子一圈為32步, 所以轉子64圈就是 64*32=2048步, 所以輸出軸心一圈就是 2048步.
由上換算出基本步進角為 : 360/2048=0.17578125°
半相激磁
半相激磁時, 轉子一圈是64步(齒), 再套上 1:64的減速齒輪組, 因此輸出軸心轉一圈是 64*64=4096步
由上算出基本步進角為 360/4096 = 0.087890625°.
ps. 但更精細的規格是, 減速齒輪組其實是 (32/9)/(22/11)/(26/9)/(31/10)=63.683950617, 也就是轉子跟傳輸軸比為 1:63.683950617, 所以傳輸軸的正確步數為 2038步及4075步
接線
程式
順時鐘或逆時鐘共有 8 個步序,完成 8 個步序就是轉子轉一圈。轉子與傳輸軸中間有減速齒輪,轉子轉 512 圈傳輸軸才轉一圈。完成一個步序要 time.sleep(0.001),少於這個時間值就無法轉動。底下為其完整代碼
from gpiozero import OutputDevice import time # 定義步進馬達的控制引腳 IN1 = OutputDevice(17) IN2 = OutputDevice(18) IN3 = OutputDevice(27) IN4 = OutputDevice(22) #半相激磁 #順時鐘步序 clockwise=[ [0, 1, 0, 0], [1, 1, 0, 0], [1, 0, 0, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 1, 1], [0, 0, 1, 0], [0, 1, 1, 0], ] #逆時鐘步序 counter=[ [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 0], [1, 1, 0, 0], ] # 控制一個步驟 def set_step(step, delay=0.001): IN1.value, IN2.value, IN3.value, IN4.value = step time.sleep(delay) # 控制步進馬達旋轉 def clockwise_motor(): for _ in range(512): for step in clockwise: set_step(step) def counter_motor(): for _ in range(512): for step in counter: set_step(step) try: print("步進馬達正向旋轉 512 步(1 轉)") clockwise_motor() time.sleep(1) print("步進馬達反向旋轉 512 步(1 轉)") counter_motor() except KeyboardInterrupt: print("程序被終止") finally: # 關閉所有引腳 IN1.off() IN2.off() IN3.off() IN4.off()