原创 了解步进电机及如何驱动步进电机

2024-4-23 13:43 298 3 3 分类: 机器人/ AI

1. 什么是步进电机?


步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。


对于步进电机,每输入一个脉冲信号,转子就转动一个角度或前进一步。其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。


下面看一个简单的双极电机:


图 1 双极电机


双极步进电机有四根电线和两个线圈。要使其旋转,需要通过线圈发送电流。每根电线都需要能够被高低驱动。以下是如何驱动电流使步进电机旋转。


图 2 双极步进电机


要理解为什么这样做,请考虑一个只有四个步骤的简单步进电机。在第一阶段,它将磁体与第一线圈对齐。下一步将磁体旋转90度。通过第一线圈反向发送电流会反转磁体极性。相反的线圈被连接,但相对于中心磁体产生相反的磁场。


图 3 步进电机转动四个步骤


当然,大多数步进电机的步数超过4步。你的标准步进电机每转200步。以这种方式旋转电机称为全步进。一旦你完成了全步工作,半步是非常简单的。你可以同时通过两个线圈发送电流,这将使分辨率加倍。


步进电机驱动器也可以使用微步进,微步进调节通过线圈的电流。典型的电机控制器可以在每一个完整的步骤中执行16个微步骤。一些芯片负责调制电流,但较旧的芯片需要为其驱动的步进电机“调谐”。微步进进一步将整个步进划分为256微步进,使典型的200步进电机变成51200步进电机!微步进还降低了电机的噪音,使其运行更平稳、更高效。


图 4 完整步骤1和2之间的半步


2. 如何控制线圈中的电流:


控制通过绕组的电流的最常见设置是使用所谓的H桥。它是一组四个晶体管,可以将每条导线拉高或拉低。你也可以用MOS管代替晶体管,但布线会有点不同。该图显示了如何通过H桥向任意方向发送电流。你只需要打开路径中的晶体管。


图 5 线圈中的电流方向


你必须确保同一侧的两个晶体管不能同时导通。这将通过提供从电源到接地的低电阻路径使电路短路。你还应注意,晶体管可能需要一段时间才能从接通切换到断开。除非你知道自己在做什么,否则不建议快速切换通过线圈的电流。


图 6 必须确保同一侧的两个晶体管不能同时导通


这仍然不是全貌。旋转电机将产生电压。为了保护晶体管,最好放置二极管。


图 7 用于保护晶体管的二极管


这将防止电机产生高压,这可能会破坏晶体管甚至驱动器。如果驱动步进电机的电压高于MCU输出的电压,则需要添加另一个晶体管来控制PNP晶体管。


图 8 使用另一个晶体管来控制PNP晶体管


当你打开额外的NPN晶体管时,它将允许电流从PNP晶体管的基极(引脚1)流出,从而打开它。现在所需要的只是所有NPN晶体管基极上的限流电阻。


图 9 NPN晶体管基极加上的限流电阻


就是这样!该H桥将控制通过其中一个绕组的电流。由于有两个绕组,我们需要将这个电路加倍。


图 10 双H桥驱动步进电机


现在,你可以很好地计算所需的组件。使用双H桥并不是驱动步进电机的唯一方法。你也可以购买步进电机驱动器,它将内置双H桥(尽管驱动器通常使用MOS管和其他技巧)。如果你想减少BOM数量(有时获得更多功能),我建议你看看步进电机驱动器。你需要查看数据表以了解芯片提供的功能。一些芯片只提供晶体管和二极管,而其他芯片则完全控制通过线圈的电流。


3. 微步进:


图 11 脉宽调制信号


微步进包括向晶体管发送脉宽调制信号。这是一种控制电机线圈电流的简单方法。预先选择的PWM值被放置在正弦查找表中。典型地,选择20-40kHz的PWM频率。任何低于20千赫的声音,人类耳朵都能听到。频率保持低于40kHz以提高效率并减少晶体管中的功耗。当PWM信号为高时,电流流过晶体管。当PWM信号低时,电流流过二极管。这是一个非常粗糙的微步进实现,但它给出了它如何工作的一般概念。使用MOS管的电机驱动器可以控制电机电流降低或衰减的速度。驱动器的电流波形更像这样:


图 12 流经MOS管电机驱动器的电流


必须为其驱动的电机手动优化快速衰减周期和慢速衰减周期。一些新芯片会根据其感应到的电流自动调整衰减周期,但旧芯片可能需要优化(或调整)。


4. 步进电机驱动实例


介绍板子:

实例:使用控制板Arduino Mega控制步进电机驱动板TMC5130-EVAL来驱动步进电机。


图 13 使用Arduino Mega控制步进电机驱动板TMC5130-EVAL


控制器:Arduino Mega 2560是一款基于ATmega2560的微控制器板。它有54个数字输入/输出引脚(其中15个可以用作PWM输出)、16个模拟输入、4个UART(硬件串行端口)、一个16MHz晶体振荡器、一个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. 连线


图 14 TMC5130与Arduino Mega 2560连接 (图片来源于Trinamic)


上图的电缆颜色

+5V - >红色

GND - >蓝色

SDO - >黄色

SDI - >橙色

SCK - >白色

CSN - >灰色

DRV_ENN - >黑色

CLK16 - >绿色


图 15 引脚对应的信号 (图片来源于Trinamic)


引脚对应的信号。在Arduino代码的注释部分记录了配置。

ARDUINO代码


下面的Arduino代码不需要任何额外的库。SPI库是Arduino IDE附带的。该程序初始化TMC5130并执行简单的移动到位置周期。它将根据步进电机的接线将200全步进电机向一个方向旋转10转,向另一个方向旋转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);
}

代码来源于:Trinamic 博客

 


来源:digikey 作者: Alan Yang

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条