為了做一些工具所以研究了一下 3D 印表機的步進馬達部份
以前寫過一篇 透過 L297 / L298 控制四線式步進馬達
這兩顆 IC 一顆是產生時序, 另一顆則是 H 橋
兩個合起來就可以讓 MCU 可以只用 clock 便可讓步進馬達依照 clock 速度旋轉
而現在 3D 印表機上的步進馬達控制 IC 則是把上面兩顆的功能全都做進一顆小小的 IC 裡
上圖兩黑色散熱片下面的 IC 是 A4988, 3D 印表機常用的步進馬達控制 IC, 晶片面積非常小
控制方式一樣是只要把 clock 信號送進 step 接腳, Enable 腳拉低, 馬達就會轉
而且還加了一個厲害的功能:Microstepping
這些技術的介紹在英文版的 wiki 上有, 中文版的 wiki 沒有完全翻譯
它的原理是這樣的, 考慮一個精簡版的馬達
當我們對線圈 1 給電時, 轉軸會被磁力吸住固定在 12 點鐘方向
接著線圈 1 斷電, 線圈 2 給電, 轉軸會被線圈 2 的磁力引導而轉向 3 點鐘方向
真實的步進馬達不會這樣設計, 這是為了方便想像
真實的步進馬達轉的方式可參考上面英文版的 wiki 裡的圖
接著線圈 2 斷電, 線圈 3 給電, 以此類推, 它就會旋轉
所以前篇 L297 / L298 裡的 L297 要產生正確的時序, 才能引導轉軸旋轉
上面的時序是每一次只對一個線圈給電, 一次走一步, 稱作全步驅動 (Full step drive)
全步驅動有兩種形式:一相激磁和二相激磁
上面一次只對一線圈給電是一相激磁, 另一種是一次對兩個線圈給電是二相激磁
例如:1,2 , 接著 2,3 給電, 然後是 3,4 給電, 最後是 4,1
當 1,2 同時給電, 轉軸會被兩磁力同時吸引, 故停留在 1 和 2 之間
接著 2,3 給電, 轉軸會轉到 2 和 3 之間, 雖然停留的位置和一相激磁的不同
但是每次都是走一步, 也就是轉 90 度 (再次提醒這是方便想像用, 和真實的步進馬達不同)
這兩種全步驅動不同之處除了每次轉軸停留的位置不同外, 力矩也不同
二相激磁可以獲得比較大的力矩
如果和我一樣高中物理沒學好的用戶可以參考這連結惡補一下關於力矩的知識XD
教育部數位教學資源入口網站 16-2力矩與槓桿原理
如果一相激磁總是讓轉軸停在 0, 90, 180, 270 度
而二相激磁則是在 45, 135, 225, 315 度
那麼混合一相激磁和二相激磁
我們應該可以讓轉軸停在 0, 45, 90, 135, 180, 225, 270, 315 度
給電順序為:1 → 1,2 → 2 → 2,3 → 3 → 3,4 → 4 → 4,1
這讓我們可以在一步之間再切出一步出來, 稱作半步驅動 (Half stepping)
以上這些就是舊式步進馬達 IC 在做的控制法, 或是以多數 MCU 的 GPIO 能做到的控制法
它們都是數位控制, 不斷的開關電來驅動磁場, 電不是開就是關, 容易實現
從半步驅動我們可以延伸出更細部的控制, 有一就有二, 有二就有三
我們只能從一步中多切出一步嗎? 可不可以切二或是切三?
以上圖來說, 如果 1 和 2 同時給電會變半步, 那 1 的電如果只給 25%, 2 的電只給 75%
轉軸應該就會停在 1 和 2 中間但是比較靠近 2 的地方, 2 的磁力比較大, 轉軸靠近 2
但是 1 並沒有完全斷電, 留了一點小電流, 因次會把轉軸往 1 方向拉過去一點點
這樣的策略就是比較新的微步驅動 (Microstepping)
以 3D 印表機常用的 A4988 這顆微步驅動 IC 來說, 它可以分割一步達 1/16
也就是每給一個 clock 它只走 1/16 步, 送 16 個 clock 才算走一步
而且可以鎖定, 持續的產生電流固定住馬達轉軸, 該 IC 有附一張電流電壓圖
上圖出自 A4988 datasheet
下面的像 clock 的波形是電壓, 上面的弦波是電流, 就算我們沒有輸入 clock
只要 A4988 的 En 接腳在低電位, A4988 就會不斷送出電流鎖住轉軸
當我們接著輸入 clock, A4988 就會自動計算並產生對應的電流形成弦波來進行微步驅動
驅動時採用 Mixed Decay Mode, 這裡我暫時翻為 "混合衰退模式"
有個老外寫篇文:
Slow, Mixed and Fast Decay Modes. Why Do We Need To Complicate Things?
裡面有恐怖的電子學 (對我等軟體出身人員算恐怖XD)
由於我缺乏對 FET 的知識, 我只能以 BJT 的經驗來理解他的文章
所以可能有錯, 僅供參考XD
所謂衰退是指電流的衰退, 當我們控制 H 橋時, 如果是 MCU 的 GPIO
我們通常回如同 L297 / L298 那篇那樣簡單的同時打開或關閉兩個接腳
當我要正轉就 01, 反轉就 10, 類似這樣
然而, 馬達是電感性負載, 它由線圈組成, 具有電感特性:阻止電流變化
當我們要切換方向或是停止旋轉時, 切掉 H 橋的控制晶體時, 線圈會產生電流反饋回來
如果放任它不理, 這反向電流就會衝向那些已經關閉的控制晶體, 構成傷害
處理方法是透過一定順序關閉晶體, 引導它退場
直到線圈出來的電流都衰退到零才關閉晶體改變流向, 有兩種衰退模式:
Fast Decay Modes (快速衰退模式) 以及 Slow Decay Modes (慢速衰退模式)
文章中示範如果總是用一種衰退模式, 不管是快速和慢速, 可能會導致微步驅動失準
以慢速衰退模式來說, 當在弦波上升側, 因為電流是要一直增加, 沒什麼問題
但是到了弦波下滑側, 電流逐漸減少, 若線圈的電感量比較大, 它會產生較多的反饋電流
若還是用慢速衰退模式會使得電流衰退速度更慢, 結果就是弦波變形, 影響微步的準確度
所以採用混合衰退模式, 弦波上升側用慢速衰退模式, 下滑側用快速衰退模式
步進馬達中心是永久磁鐵, 線圈在外側產生磁力來相吸或互斥中央的永久磁鐵來轉動轉軸
當沒有給電時永久磁鐵會以磁力吸住線圈的鐵心, 構成一個力量阻止轉動
英文 wiki 上寫作 Detent torque, 這裡暫時稱作阻動力矩
試著用手轉動沒通電的步進馬達, 應該可以感受到一格一格的阻力, 那個力就是阻動力矩
步進馬達如果要能轉動, 至少需產生足夠克服阻動力矩的力, 也就是要有足夠的電流
而這個力矩也會影響微步驅動的準確性, 從 wiki 上的引用來源可找到一篇文章:
Stepper Motor Technical Note: Microstepping Myths and Realities
當微步驅動的分割步數多到一定程度時, 每走一微步增加的力矩會變小很多
以 1/16 的微步驅動來說, 每走一微步增加的力矩只有全步驅動時的 10% 以下
若步進馬達同時有負載, 摩擦力, 以及阻動力矩的阻擋, 輸出力不足時將不會旋轉
也就失去了微步的準確度, 所以微步驅動 IC 在設計時或許可以無止盡的切割步數
但是實際上馬達運轉時不一定能真的容許這麼精細的步數, 需看馬達的設計以及其負載
這裡有篇文章討論依據負載選用馬達:馬達選用之負載慣性慣量之計算
如果要惡補角動量和轉動慣量的知識可看這XD 角動量簡介
根據角動量守恆, 同樣的轉動力量遇上不同的力臂, 能驅動的力量也不同
所以對馬達裝上越短的連桿, 能轉動的重量就會越多
馬達的力矩來自於磁力, 也就是通過的電流
但是那是假設力量 "有效", 當這電流維持的時間不夠時, 力矩就會下降
維持的時間則由轉速決定, 轉速越快, 施力的時間越短, 力矩就越小
所以當轉速為零時可以獲得最大的力矩
無聊可以把 A4988 的 En 接腳在低電位然後不送 clock
接著嘗試去轉馬達軸心, 阻力會很大, 難以轉動, 這我有試過XD
而轉動的功率等於力矩和角速度的乘積, 如果把一顆馬達的力矩和轉速畫成圖表
就可以發現在特定轉速下馬達可以獲得最大功率, 這資料出自:
Understanding D.C. Motor Characteristics
花了幾天時間蒐集並看懂這些資料
這完全不是我本行的技術, 看得有點累, 常常看到打瞌睡, 就像以前上課一樣XD
若有專家路過發現有誤歡迎踢館指導, 感謝
寫的真好阿
回覆刪除感謝大大無私的分享!!!
請問該怎麼在adrduino下code控制a4988呢?
回覆刪除我沒在用 arduino 不清楚, 我只知道對 MCU 來說就設定 GPIO 為輸出
刪除然後 En 和 Clk 腳拉低, 接著 Clk 接腳拉高後 delay 一下再拉低就會走一個 micro step
都只是 GPIO 操作, 沒有使用特殊硬體介面
超棒!
回覆刪除