步進馬達

      在〈步進馬達〉中尚無留言

用途

步進馬達可以控制比較精密的動作, 例如4相步進馬達, 可以把一圈360度分為2048 or 4096 個等分, 程式碼可以精密的控制馬達轉動等分.

步進馬達定位較精確, 可使用1000rpm以內的速度運轉, 適合動作頻繁與距離短的應用, 比如自動門的開啟. 步進馬達通常搭配控制晶片, 程式比較容易設計, 以下使用整合ULN2003晶片的控制模組, 可連接步進馬達的插座、指示燈號與連接到Raspberry Pi的針腳‧

至於伺服馬達, 也可精確的控制馬達定位角度, 反應速度比步進馬達快, 運轉的扭力也較大, 但轉向只能在0-180度之間, 通常適用於方向機之類的應用.

照片

28BYJ-48 會附有一個控制板, 控制板的編號為 ULN2003. 透過控制板就可以容易的控制步進馬達. 請注意, UL2003的電源可使用5V 及12V. 而本版本的右邊是+ 極, 左邊是 – 極.

小編曾參照網路上的接法, 將正反極接反而無法運轉, 還好沒有燒掉.

steppermoter_1

規格

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極及到東方.

此種方式電力消耗小, 缺點是振動大, 轉距小.

一相激磁

phars4_0

二相激磁

二相激磁是一次激發二組線圈, 如下圖. 此種方式振動小、轉距大

phars4_1

半相激磁

先激發北方, 再激發北/西, 然後西, 西/南, 南, 南/東, 東, 東/北

phars4_2

角度控制

上述不論是一相激磁, 二相激磁, 還是一/二相激磁(半相), 不是四個方向, 頂多也才八個方向而以. 那如何控制在精準的其他角度呢.

原來是每次送一個脈衝, 就改變一個基本步進角, 然後停住.

一相激磁, 二相激磁

先看一下官方原文的說法
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步

接線

stepper_wire

程式

順時鐘或逆時鐘共有 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()

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *