本文希望可以幫助初學者,了解步進電機的工作原理以及如何驅動步進電機。然后給出一個設計實例,如何使用Arduino Mega結合ADI的TMC5130-EVAL來驅動步進電機。
什么是步進電機?步進電機是一種將電脈沖信號轉換成相應角位移或線位移的電動機。對于步進電機,每輸入一個脈沖信號,轉子就轉動一個角度或前進一步。其輸出的角位移或線位移與輸入的脈沖數成正比,轉速與脈沖頻率成正比。因此,步進電動機又稱脈沖電動機。下面看一個簡單的雙極電機:
雙極步進電機有四根電線和兩個線圈。要使其旋轉,需要通過線圈發送電流。每根電線都需要能夠被高低驅動。以下是如何驅動電流使步進電機旋轉。

要理解為什么這樣做,請考慮一個只有四個步驟的簡單步進電機。在第一階段,它將磁體與第一線圈對齊。下一步將磁體旋轉90度。通過第一線圈反向發送電流會反轉磁體極性。相反的線圈被連接,但相對于中心磁體產生相反的磁場。

當然,大多數步進電機的步數超過4步。你的標準步進電機每轉200步。以這種方式旋轉電機稱為全步進。一旦你完成了全步工作,半步是非常簡單的。你可以同時通過兩個線圈發送電流,這將使分辨率加倍。
步進電機驅動器也可以使用微步進,微步進調節通過線圈的電流。典型的電機控制器可以在每一個完整的步驟中執行16個微步驟。一些芯片負責調制電流,但較舊的芯片需要為其驅動的步進電機“調諧”。微步進進一步將整個步進劃分為256微步進,使典型的200步進電機變成51200步進電機!微步進還降低了電機的噪音,使其運行更平穩、更高效。


你必須確保同一側的兩個晶體管不能同時導通。這將通過提供從電源到接地的低電阻路徑使電路短路。你還應注意,晶體管可能需要一段時間才能從接通切換到斷開。除非你知道自己在做什么,否則不建議快速切換通過線圈的電流。


這將防止電機產生高壓,這可能會破壞晶體管甚至驅動器。如果驅動步進電機的電壓高于MCU輸出的電壓,則需要添加另一個晶體管來控制PNP晶體管。

當你打開額外的NPN晶體管時,它將允許電流從PNP晶體管的基極(引腳1)流出,從而打開它。現在所需要的只是所有NPN晶體管基極上的限流電阻。

就是這樣!該H橋將控制通過其中一個繞組的電流。由于有兩個繞組,我們需要將這個電路加倍。

現在,你可以很好地計算所需的組件。使用雙H橋并不是驅動步進電機的唯一方法。你也可以購買步進電機驅動器,它將內置雙H橋(盡管驅動器通常使用MOS管和其他技巧)。如果你想減少BOM數量(有時獲得更多功能),我建議你看看步進電機驅動器。你需要查看數據表以了解芯片提供的功能。一些芯片只提供晶體管和二極管,而其他芯片則完全控制通過線圈的電流。
微步進

微步進包括向晶體管發送脈寬調制信號。這是一種控制電機線圈電流的簡單方法。預先選擇的PWM值被放置在正弦查找表中。典型地,選擇20-40kHz的PWM頻率。任何低于20千赫的聲音,人類耳朵都能聽到。頻率保持低于40kHz以提高效率并減少晶體管中的功耗。當PWM信號為高時,電流流過晶體管。當PWM信號低時,電流流過二極管。這是一個非常粗糙的微步進實現,但它給出了它如何工作的一般概念。使用MOS管的電機驅動器可以控制電機電流降低或衰減的速度。驅動器的電流波形更像這樣:

必須為其驅動的電機手動優化快速衰減周期和慢速衰減周期。一些新芯片會根據其感應到的電流自動調整衰減周期,但舊芯片可能需要優化(或調整)。
步進電機驅動實例
實例:使用控制板Arduino Mega控制步進電機驅動板TMC5130-EVAL來驅動步進電機。
圖 13.使用Arduino Mega控制步進電機驅動板TMC5130-EVAL
控制器:Arduino Mega 2560是一款基于ATmega2560的微控制器板。它有54個數字輸入/輸出引腳(其中15個可以用作PWM輸出)、16個模擬輸入、4個UART(硬件串行端口)、一個16 MHz晶體振蕩器、一個USB連接、一個電源插座、一個ICSP頭和一個復位按鈕。它包含支持微控制器所需的一切;只需用USB電纜將其連接到計算機,或用交流到直流適配器或電池為其供電即可開始使用。
步進電機驅動板:TMC5130是一個完全集成的步進電機驅動器和控制器系統,允許從任何微控制器遠程控制步進電機。它在硬件上實現了所有實時關鍵任務。一旦配置,電機可以通過給出目標位置、命令歸航序列或給出目標速度來驅動。使用TMC5130的好處包括:易于使用,使用256微步的電機精度,低電機噪聲(無噪聲隱藏斬波器),無傳感器失速檢測(stallGuard2),無階躍損耗,dcStep和coolStep、UART或SPI控制接口的高效率,高電壓范圍,小形狀因數,以及低部件數量。
1. 確保Arduino Mega與TMC5130-EVAL有電壓匹配
如果Arduino是5V控制板,則必須將TMC5130-EVAL上的一個電阻從位置R3重新定位到R8。這將TMC5130的邏輯電平設置為+5V。
2. 連線

上圖的電纜顏色
+5V - >紅色
GND - >藍色
SDO - >黃色
SDI - >橙色
SCK - >白色
CSN - >灰色
DRV_ENN - >黑色
CLK16 - >綠色

ARDUINO代碼
下面的Arduino代碼不需要任何額外的庫。SPI庫是Arduino IDE附帶的。該程序初始化TMC5130并執行簡單的移動到位置周期。它將根據步進電機的接線將200全步進電機向一個方向旋轉10轉,向另一個方向旋轉10轉。請使用TMC5130數據表或TMCLIDE作為不同寄存器的參考。
向上滑動查看完整代碼
#include
#include"TMC5130_registers.h"
/* The trinamic TMC5130 motorcontroller and driver operates through an
* SPI interface. Each datagram is sent to thedevice as an address byte
* followed by 4 data bytes. This is 40 bits (8bit address and 32 bit word).
* Each register is specified by a one byte(MSB) address: 0 for read, 1 for
* write. The MSB is transmitted first on therising edge of SCK.
*
* Arduino Pins Eval Board Pins
* 51 MOSI 32 SPI1_SDI
* 50 MISO 33 SPI1_SDO
* 52 SCK 31 SPI1_SCK
* 25 CS 30 SPI1_CSN
* 17 DIO 8 DIO0 (DRV_ENN)
* 11 DIO 23 CLK16
* GND 2 GND
* +5V 5 +5V
*/
int chipCS = 25;
const byte CLOCKOUT = 11;
// const byte CLOCKOUT = 9; --> Uncomment for UNO, Duemilanove,etc...
int enable = 17;
void setup() {
// put your setup code here, to run once:
pinMode(chipCS,OUTPUT);
pinMode(CLOCKOUT,OUTPUT);
pinMode(enable, OUTPUT);
digitalWrite(chipCS,HIGH);
digitalWrite(enable,LOW);
//set up Timer1
TCCR1A = bit (COM1A0); //toggle OC1A onCompare Match
TCCR1B = bit (WGM12) | bit (CS10); //CTC, noprescaling
OCR1A = 0; //output every cycle
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV8);
SPI.setDataMode(SPI_MODE3);
SPI.begin();
Serial.begin(9600);
sendData(0x80,0x00000000); //GCONF
sendData(0xEC,0x000101D5); //CHOPCONF: TOFF=5,HSTRT=5, HEND=3, TBL=2, CHM=0 (spreadcycle)
sendData(0x90,0x00070603); //IHOLD_IRUN:IHOLD=3, IRUN=10 (max.current), IHOLDDELAY=6
sendData(0x91,0x0000000A); //TPOWERDOWN=10
sendData(0xF0,0x00000000); // PWMCONF
//sendData(0xF0,0x000401C8); //PWM_CONF:AUTO=1, 2/1024 Fclk, Switch amp limit=200, grad=1
sendData(0xA4,0x000003E8); //A1=1000
sendData(0xA5,0x000186A0); //V1=100000
sendData(0xA6,0x0000C350); //AMAX=50000
sendData(0xA7,0x000186A0); //VMAX=100000
sendData(0xAA,0x00000578); //D1=1400
sendData(0xAB,0x0000000A); //VSTOP=10
sendData(0xA0,0x00000000); //RAMPMODE=0
sendData(0xA1,0x00000000); //XACTUAL=0
sendData(0xAD,0x00000000); //XTARGET=0
}
void loop()
{
// put your main code here, to run repeatedly:
sendData(0xAD,0x0007D000); //XTARGET=512000 |10 revolutions with micro step = 256
delay(20000);
sendData(0x21,0x00000000);
sendData(0xAD,0x00000000); //XTARGET=0
delay(20000);
sendData(0x21,0x00000000);
}
void sendData(unsigned long address,unsigned long datagram)
{
//TMC5130 takes 40 bit data: 8 address and 32data
delay(100);
uint8_t stat;
unsigned long i_datagram;
digitalWrite(chipCS,LOW);
delayMicroseconds(10);
stat = SPI.transfer(address);
i_datagram |= SPI.transfer((datagram >>24) & 0xff);
i_datagram <<= 8;
i_datagram |= SPI.transfer((datagram >>16) & 0xff);
i_datagram <<= 8;
i_datagram |= SPI.transfer((datagram >>8) & 0xff);
i_datagram <<= 8;
i_datagram |= SPI.transfer((datagram) &0xff);
digitalWrite(chipCS,HIGH);
Serial.print("Received: ");
PrintHex40(stat, i_datagram);
Serial.print(" ");
Serial.print(" from register: ");
Serial.println(address,HEX);
}
void PrintHex40(uint8_t stat, uint32_tdata) // prints 40-bit data in hex with leading zeroes
{
char tmp[16];
uint16_t LSB = data & 0xffff;
uint16_t MSB = data >> 16;
sprintf(tmp, "0x%.2X%.4X%.4X", stat,MSB, LSB);
Serial.print(tmp);
}
代碼來源于:Trinamic 博客(關于代碼的問題,可以去Trinamic博客上了解更多)
總結
希望這篇文章,可以幫助您了解步進電機的工作原理以及如何驅動步進電機。同時驅動步進電機的技術已經很成熟,善于利用現有的硬件和代碼,才能事半功倍。
更多有關電機技術文章,請點擊以下鏈接,也歡迎大家在文末留言討論。
-
如何驅動步進電機
-
電機控制中的軟啟動(Soft Start)
-
一分鐘讀懂:與眾不同的步進電機
-
步進電機每轉步數和步進角
-
計算電機驅動器的功耗
小編的話
隨著科學技術的發展,特別是永磁材料、半導體技術、計算機技術的發展,步進電機在眾多領域得到了廣泛應用,包括工業機器中的汽車儀表和機床自動化生產設備、機器人、安防攝像機、醫用掃描儀、液壓泵、呼吸機和血液分析儀,以及消費攝像機、商用機器及電腦周邊等應用。您是否正在利用步進電機進行電機系統的設計?您在步進電機驅動過程中有哪些設計經驗、心得或疑問?歡迎留言,分享和討論!
秘技知識學不停 專屬福利享不停
就等您加入!
點此登記
賺積分、換好禮
立即到「會員權益」查看您的禮遇! 如有任何問題,歡迎聯系得捷電子DigiKey的客服團隊中國(人民幣)客服




中國(美金)/ 香港客服

400-882-4440



點擊下方“閱讀原文”查看更多
讓我知道你在看喲
原文標題:聊一聊步進電機的幾件事 還有彩蛋
文章出處:【微信公眾號:得捷電子DigiKey】歡迎添加關注!文章轉載請注明出處。
-
得捷電子
+關注
關注
1文章
255瀏覽量
9277
原文標題:聊一聊步進電機的幾件事 還有彩蛋
文章出處:【微信號:得捷電子DigiKey,微信公眾號:得捷電子DigiKey】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
為什么聊自動駕駛的越來越多,聊無人駕駛的越來越少?

評論