來(lái)源:DigiKey 作者:Alan Yang 1. 什么是步進(jìn)電機? 步進(jìn)電機是一種將電脈沖信號轉換成相應角位移或線(xiàn)位移的電動(dòng)機。 對于步進(jìn)電機,每輸入一個(gè)脈沖信號,轉子就轉動(dòng)一個(gè)角度或前進(jìn)一步。其輸出的角位移或線(xiàn)位移與輸入的脈沖數成正比,轉速與脈沖頻率成正比。因此,步進(jìn)電動(dòng)機又稱(chēng)脈沖電動(dòng)機。 下面看一個(gè)簡(jiǎn)單的雙極電機: ![]() 圖 1 雙極電機 雙極步進(jìn)電機有四根電線(xiàn)和兩個(gè)線(xiàn)圈。要使其旋轉,需要通過(guò)線(xiàn)圈發(fā)送電流。每根電線(xiàn)都需要能夠被高低驅動(dòng)。以下是如何驅動(dòng)電流使步進(jìn)電機旋轉。 ![]() 圖 2 雙極步進(jìn)電機 要理解為什么這樣做,請考慮一個(gè)只有四個(gè)步驟的簡(jiǎn)單步進(jìn)電機。在第一階段,它將磁體與第一線(xiàn)圈對齊。下一步將磁體旋轉90度。通過(guò)第一線(xiàn)圈反向發(fā)送電流會(huì )反轉磁體極性。相反的線(xiàn)圈被連接,但相對于中心磁體產(chǎn)生相反的磁場(chǎng)。 ![]() 圖 3 步進(jìn)電機轉動(dòng)四個(gè)步驟 當然,大多數步進(jìn)電機的步數超過(guò)4步。你的標準步進(jìn)電機每轉200步。以這種方式旋轉電機稱(chēng)為全步進(jìn)。一旦你完成了全步工作,半步是非常簡(jiǎn)單的。你可以同時(shí)通過(guò)兩個(gè)線(xiàn)圈發(fā)送電流,這將使分辨率加倍。 步進(jìn)電機驅動(dòng)器也可以使用微步進(jìn),微步進(jìn)調節通過(guò)線(xiàn)圈的電流。典型的電機控制器可以在每一個(gè)完整的步驟中執行16個(gè)微步驟。一些芯片負責調制電流,但較舊的芯片需要為其驅動(dòng)的步進(jìn)電機“調諧”。微步進(jìn)進(jìn)一步將整個(gè)步進(jìn)劃分為256微步進(jìn),使典型的200步進(jìn)電機變成51200步進(jìn)電機!微步進(jìn)還降低了電機的噪音,使其運行更平穩、更高效。 ![]() 圖 4 完整步驟1和2之間的半步 2. 如何控制線(xiàn)圈中的電流: 控制通過(guò)繞組的電流的最常見(jiàn)設置是使用所謂的H橋。它是一組四個(gè)晶體管,可以將每條導線(xiàn)拉高或拉低。你也可以用MOS管代替晶體管,但布線(xiàn)會(huì )有點(diǎn)不同。該圖顯示了如何通過(guò)H橋向任意方向發(fā)送電流。你只需要打開(kāi)路徑中的晶體管。 ![]() 圖 5 線(xiàn)圈中的電流方向 你必須確保同一側的兩個(gè)晶體管不能同時(shí)導通。這將通過(guò)提供從電源到接地的低電阻路徑使電路短路。你還應注意,晶體管可能需要一段時(shí)間才能從接通切換到斷開(kāi)。除非你知道自己在做什么,否則不建議快速切換通過(guò)線(xiàn)圈的電流。 ![]() 圖 6 必須確保同一側的兩個(gè)晶體管不能同時(shí)導通 這仍然不是全貌。旋轉電機將產(chǎn)生電壓。為了保護晶體管,最好放置二極管。 ![]() 圖 7 用于保護晶體管的二極管 這將防止電機產(chǎn)生高壓,這可能會(huì )破壞晶體管甚至驅動(dòng)器。如果驅動(dòng)步進(jìn)電機的電壓高于MCU輸出的電壓,則需要添加另一個(gè)晶體管來(lái)控制PNP晶體管。 ![]() 圖 8 使用另一個(gè)晶體管來(lái)控制PNP晶體管 當你打開(kāi)額外的NPN晶體管時(shí),它將允許電流從PNP晶體管的基極(引腳1)流出,從而打開(kāi)它,F在所需要的只是所有NPN晶體管基極上的限流電阻。 ![]() 圖 9 NPN晶體管基極加上的限流電阻 就是這樣!該H橋將控制通過(guò)其中一個(gè)繞組的電流。由于有兩個(gè)繞組,我們需要將這個(gè)電路加倍。 ![]() 圖 10 雙H橋驅動(dòng)步進(jìn)電機 現在,你可以很好地計算所需的組件。使用雙H橋并不是驅動(dòng)步進(jìn)電機的唯一方法。你也可以購買(mǎi)步進(jìn)電機驅動(dòng)器,它將內置雙H橋(盡管驅動(dòng)器通常使用MOS管和其他技巧)。如果你想減少BOM數量(有時(shí)獲得更多功能),我建議你看看步進(jìn)電機驅動(dòng)器。你需要查看數據表以了解芯片提供的功能。一些芯片只提供晶體管和二極管,而其他芯片則完全控制通過(guò)線(xiàn)圈的電流。 3. 微步進(jìn): ![]() 圖 11 脈寬調制信號 微步進(jìn)包括向晶體管發(fā)送脈寬調制信號。這是一種控制電機線(xiàn)圈電流的簡(jiǎn)單方法。預先選擇的PWM值被放置在正弦查找表中。典型地,選擇20-40kHz的PWM頻率。任何低于20千赫的聲音,人類(lèi)耳朵都能聽(tīng)到。頻率保持低于40kHz以提高效率并減少晶體管中的功耗。當PWM信號為高時(shí),電流流過(guò)晶體管。當PWM信號低時(shí),電流流過(guò)二極管。這是一個(gè)非常粗糙的微步進(jìn)實(shí)現,但它給出了它如何工作的一般概念。使用MOS管的電機驅動(dòng)器可以控制電機電流降低或衰減的速度。驅動(dòng)器的電流波形更像這樣: ![]() 圖 12 流經(jīng)MOS管電機驅動(dòng)器的電流 必須為其驅動(dòng)的電機手動(dòng)優(yōu)化快速衰減周期和慢速衰減周期。一些新芯片會(huì )根據其感應到的電流自動(dòng)調整衰減周期,但舊芯片可能需要優(yōu)化(或調整)。 4. 步進(jìn)電機驅動(dòng)實(shí)例 介紹板子: 實(shí)例:使用控制板Arduino Mega控制步進(jìn)電機驅動(dòng)板TMC5130-EVAL來(lái)驅動(dòng)步進(jìn)電機。 ![]() 圖 13 使用Arduino Mega控制步進(jìn)電機驅動(dòng)板TMC5130-EVAL 控制器:Arduino Mega 2560是一款基于A(yíng)Tmega2560的微控制器板。它有54個(gè)數字輸入/輸出引腳(其中15個(gè)可以用作PWM輸出)、16個(gè)模擬輸入、4個(gè)UART(硬件串行端口)、一個(gè)16 MHz晶體振蕩器、一個(gè)USB連接、一個(gè)電源插座、一個(gè)ICSP頭和一個(gè)復位按鈕。它包含支持微控制器所需的一切;只需用USB電纜將其連接到計算機,或用交流到直流適配器或電池為其供電即可開(kāi)始使用。 步進(jìn)電機驅動(dòng)板:TMC5130是一個(gè)完全集成的步進(jìn)電機驅動(dòng)器和控制器系統,允許從任何微控制器遠程控制步進(jìn)電機。它在硬件上實(shí)現了所有實(shí)時(shí)關(guān)鍵任務(wù)。一旦配置,電機可以通過(guò)給出目標位置、命令歸航序列或給出目標速度來(lái)驅動(dòng)。使用TMC5130的好處包括:易于使用,使用256微步的電機精度,低電機噪聲(無(wú)噪聲隱藏斬波器),無(wú)傳感器失速檢測(stallGuard2),無(wú)階躍損耗,dcStep和coolStep、UART或SPI控制接口的高效率,高電壓范圍,小形狀因數,以及低部件數量。 1. 確保Arduino Mega與TMC5130-EVAL有電壓匹配 如果Arduino是5V控制板,則必須將TMC5130-EVAL上的一個(gè)電阻從位置R3重新定位到R8。這將TMC5130的邏輯電平設置為+5V。 2. 連線(xiàn) ![]() 圖 14 TMC5130與Arduino Mega 2560連接 (圖片來(lái)源于Trinamic) 上圖的電纜顏色 +5V - >紅色 GND - >藍色 SDO - >黃色 SDI - >橙色 SCK - >白色 CSN - >灰色 DRV_ENN - >黑色 CLK16 - >綠色 ![]() 圖 15 引腳對應的信號 (圖片來(lái)源于Trinamic) 引腳對應的信號。在A(yíng)rduino代碼的注釋部分記錄了配置。 ARDUINO代碼 下面的Arduino代碼不需要任何額外的庫。SPI庫是Arduino IDE附帶的。該程序初始化TMC5130并執行簡(jiǎn)單的移動(dòng)到位置周期。它將根據步進(jìn)電機的接線(xiàn)將200全步進(jìn)電機向一個(gè)方向旋轉10轉,向另一個(gè)方向旋轉10轉。請使用TMC5130數據表或TMCL IDE作為不同寄存器的參考。 #include #include "TMC5130_registers.h" /* The trinamic TMC5130 motor controller and driver operates through an * SPI interface. Each datagram is sent to the device as an address byte * followed by 4 data bytes. This is 40 bits (8 bit 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 the rising 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 on Compare Match TCCR1B = bit (WGM12) | bit (CS10); //CTC, no prescaling 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 32 data 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("\n"); Serial.print(" from register: "); Serial.println(address,HEX); } void PrintHex40(uint8_t stat, uint32_t data) // 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); } 代碼來(lái)源于:Trinamic 博客 (關(guān)于代碼的問(wèn)題,可以去Trinamic博客上了解更多) 總結: 希望這片文章,可以幫助您了解步進(jìn)電機的工作原理以及如何驅動(dòng)步進(jìn)電機。同時(shí)驅動(dòng)步進(jìn)電機的技術(shù)已經(jīng)很成熟,善于利用現有的硬件和代碼,才能事半功倍。 |