博客專欄

        EEPW首頁 > 博客 > 聊一聊步進電機的幾件事

        聊一聊步進電機的幾件事

        發(fā)布人:12345zhi 時間:2023-07-27 來源:工程師 發(fā)布文章

        什么是步進電機?

        步進電機是一種將電脈沖信號轉(zhuǎn)換成相應(yīng)角位移或線位移的電動機。

        對于步進電機,每輸入一個脈沖信號,轉(zhuǎn)子就轉(zhuǎn)動一個角度或前進一步。其輸出的角位移或線位移與輸入的脈沖數(shù)成正比,轉(zhuǎn)速與脈沖頻率成正比。因此,步進電動機又稱脈沖電動機。

        下面看一個簡單的雙極電機:

        圖片

        圖 1. 雙極電機

        雙極步進電機有四根電線和兩個線圈。要使其旋轉(zhuǎn),需要通過線圈發(fā)送電流。每根電線都需要能夠被高低驅(qū)動。以下是如何驅(qū)動電流使步進電機旋轉(zhuǎn)。

        圖片

        圖 2. 雙極步進電機

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

        圖片

        圖 3. 步進電機轉(zhuǎn)動四個步驟

        當(dāng)然,大多數(shù)步進電機的步數(shù)超過4步。你的標(biāo)準(zhǔn)步進電機每轉(zhuǎn)200步。以這種方式旋轉(zhuǎn)電機稱為全步進。一旦你完成了全步工作,半步是非常簡單的。你可以同時通過兩個線圈發(fā)送電流,這將使分辨率加倍。

        步進電機驅(qū)動器也可以使用微步進,微步進調(diào)節(jié)通過線圈的電流。典型的電機控制器可以在每一個完整的步驟中執(zhí)行16個微步驟。一些芯片負責(zé)調(diào)制電流,但較舊的芯片需要為其驅(qū)動的步進電機“調(diào)諧”。微步進進一步將整個步進劃分為256微步進,使典型的200步進電機變成51200步進電機!微步進還降低了電機的噪音,使其運行更平穩(wěn)、更高效。

        圖片

        圖 4. 完整步驟1和2之間的半步

        如何控制線圈中的電流

        控制通過繞組的電流的最常見設(shè)置是使用所謂的H橋。它是一組四個晶體管,可以將每條導(dǎo)線拉高或拉低。你也可以用MOS管代替晶體管,但布線會有點不同。該圖顯示了如何通過H橋向任意方向發(fā)送電流。你只需要打開路徑中的晶體管。

        圖片

        5. 線圈中的電流方向

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

        圖片

        圖 6 . 必須確保同一側(cè)的兩個晶體管不能同時導(dǎo)通

        這仍然不是全貌。旋轉(zhuǎn)電機將產(chǎn)生電壓。為了保護晶體管,最好放置二極管。

        圖片

        7. 用于保護晶體管的二極管

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

        圖片

        圖8. 使用另一個晶體管來控制PNP晶體管

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

        圖片

        圖 9. NPN晶體管基極加上的限流電阻

        就是這樣!該H橋?qū)⒖刂仆ㄟ^其中一個繞組的電流。由于有兩個繞組,我們需要將這個電路加倍。

        圖片

        圖10. 雙H橋驅(qū)動步進電機

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

        微步進

        圖片

        圖11. 脈寬調(diào)制信號

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

        圖片

        圖 12. 流經(jīng)MOS管電機驅(qū)動器的電流

        必須為其驅(qū)動的電機手動優(yōu)化快速衰減周期和慢速衰減周期。一些新芯片會根據(jù)其感應(yīng)到的電流自動調(diào)整衰減周期,但舊芯片可能需要優(yōu)化(或調(diào)整)。

        步進電機驅(qū)動實例

        實例:使用控制板Arduino Mega控制步進電機驅(qū)動板TMC5130-EVAL來驅(qū)動步進電機。

        圖片

        圖 13. 使用 Arduino Mega 控制步進電機驅(qū)動板 TMC5130-EVAL

        控制器:Arduino Mega 2560是一款基于ATmega2560的微控制器板。它有54個數(shù)字輸入/輸出引腳(其中15個可以用作PWM輸出)、16個模擬輸入、4個UART(硬件串行端口)、一個16 MHz晶體振蕩器、一個USB連接、一個電源插座、一個ICSP頭和一個復(fù)位按鈕。它包含支持微控制器所需的一切;只需用USB電纜將其連接到計算機,或用交流到直流適配器或電池為其供電即可開始使用。

        步進電機驅(qū)動板:TMC5130是一個完全集成的步進電機驅(qū)動器和控制器系統(tǒng),允許從任何微控制器遠程控制步進電機。它在硬件上實現(xiàn)了所有實時關(guān)鍵任務(wù)。一旦配置,電機可以通過給出目標(biāo)位置、命令歸航序列或給出目標(biāo)速度來驅(qū)動。使用TMC5130的好處包括:易于使用,使用256微步的電機精度,低電機噪聲(無噪聲隱藏斬波器),無傳感器失速檢測(stallGuard2),無階躍損耗,dcStep和coolStep、UART或SPI控制接口的高效率,高電壓范圍,小形狀因數(shù),以及低部件數(shù)量。

        1. 確保Arduino Mega與TMC5130-EVAL有電壓匹配

        如果Arduino是5V控制板,則必須將TMC5130-EVAL上的一個電阻從位置R3重新定位到R8。這將TMC5130的邏輯電平設(shè)置為+5V。

        2. 連線

        圖片

        圖 14. TMC5130與Arduino Mega 2560連接 (圖片來源于Trinamic)

        上圖的電纜顏色

        +5V - >紅色

        GND - >藍色

        SDO - >黃色

        SDI - >橙色

        SCK - >白色

        CSN - >灰色

        DRV_ENN - >黑色

        CLK16 - >綠色

        圖片

        圖 15. 引腳對應(yīng)的信號 (圖片來源于Trinamic)

        引腳對應(yīng)的信號。在Arduino代碼的注釋部分記錄了配置。

        ARDUINO代碼

        下面的Arduino代碼不需要任何額外的庫。SPI庫是Arduino IDE附帶的。該程序初始化TMC5130并執(zhí)行簡單的移動到位置周期。它將根據(jù)步進電機的接線將200全步進電機向一個方向旋轉(zhuǎn)10轉(zhuǎn),向另一個方向旋轉(zhuǎn)10轉(zhuǎn)。請使用TMC5130數(shù)據(jù)表或TMCL IDE作為不同寄存器的參考。

        #include <SPI.h>

        #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);

        }

        代碼來源于:Trinamic 博客(關(guān)于代碼的問題,可以去Trinamic博客上了解更多)

        總結(jié)

        希望這篇文章,可以幫助您了解步進電機的工作原理以及如何驅(qū)動步進電機同時驅(qū)動步進電機的技術(shù)已經(jīng)很成熟,善于利用現(xiàn)有的硬件和代碼,才能事半功倍。

        *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: 步進電機

        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 彰化县| 古交市| 老河口市| SHOW| 通州区| 鹤壁市| 桂平市| 基隆市| 天门市| 临泽县| 宁波市| 宜阳县| 仁寿县| 江城| 巴林左旗| 平原县| 天等县| 滕州市| 黄骅市| 铜川市| 微山县| 开鲁县| 汉中市| 定安县| 闻喜县| 孝昌县| 沙湾县| 平利县| 大英县| 彭泽县| 五华县| 房产| 鹿邑县| 凤庆县| 长汀县| 普定县| 调兵山市| 德保县| 德格县| 灵武市| 区。|