跳转至内容

应用机器人/机构与驱动/直流步进电机

来自维基教科书,开放书籍,构建开放世界

步进电机基础

[编辑 | 编辑源代码]

步进电机是一种直流电机,由多相绕组定子和永磁转子组成。这些电机旨在啮合到离散的命令位置,并在电流通过电机时保持其位置。每个步进电机都有一个固定的每转步数,可以通过改变电机中施加磁场的方向来逐步改变。通过连续地以步骤之间的短延迟对电机进行步进,实现旋转。延迟越短,RPM 越高。

步进电机非常适合需要高扭矩和低 RPM 的简单开环位置控制应用。随着速度的增加,步进扭矩会大幅下降,过小的步进时间会导致由于电机惯性而出现漏步。

控制步进电机需要一个状态机,它将对电机进行换向或改变电机中磁场的方向,并在步进之间应用时间延迟以控制电机速度。这通常使用微控制器的计时器和 4 个 I/O 线来控制电流,从而控制磁场方向。

== 单极性步进电机 == 使用中心抽头线圈和开关元件,这些元件仅在一个方向上吸取电流,从而改变电机中的电流方向。与可比较的双极性步进电机相比,这些电机需要两倍的线圈长度才能实现单极性驱动,因此其重量比双极性步进电机功率更低。这些电机通常有两个中心抽头相位。

== 双极性步进电机 == 每个相位使用一个线圈,并且需要控制电子设备来切换通过线圈的电流方向,通常每个相位使用一个单 H 桥。单极性电机也可以通过将每个相位的中心抽头断开来以双极性方式驱动。这些电机通常有两个相位。

单极性步进电机驱动器

[编辑 | 编辑源代码]

一个高效的单极性步进电机驱动器可以使用 4 个由微控制器 I/O 引脚控制的 N 通道 MOSFET 来构建。每个线圈中心抽头都连接到一个正电压,该电压是电机额定电压,每个相位线圈端都连接到不同的 MOSFET 漏极。每个步进都由一次打开一个 MOSFET 来控制。注意:如果 MOSFET 将直接由微控制器 I/O 电平驱动,则至关重要的是它们是逻辑级 FET,将在 5V 时打开。

Unipolar stepper driver

双极性步进电机驱动器

[编辑 | 编辑源代码]

双极性步进电机驱动器可以使用 4 通道高电流驱动器(如 L293、SN754410 或 L298 电机驱动器 IC)构建。每个输出都应有一对快速作用的整流二极管,以防止驱动器 IC 因开关过程中由于电机电感引起的反向电压而损坏。步进电机的每个相位都连接到两个输出驱动器,形成两个 H 桥,允许电流双向驱动通过两个相位。在标准控制方案中,一次应该只激活一个相位,因此输出驱动器使能必须打开和关闭,除了控制输出驱动器的方向外。

Bipolar stepper driver

步进电机控制代码

[编辑 | 编辑源代码]

步进电机控制可以在 AVR 微控制器上完成,可以使用延迟语句(适用于简单的测试,但对于精确的计时和程序效率来说很糟糕),或者使用计时器/计数器和中断(稍微复杂一些,但效率要高得多)。以下代码展示了如何在 ATmega 设备上使用计时器计数器以及一个简单的状态机和 I/O 线。反转方向只需以相反的方向进行步进即可。此代码可用于控制 L29x 型电机驱动器以驱动双极性步进电机或下拉驱动器以控制单极性步进电机。

两种类型的两相步进电机的基本步进顺序如下。

步进 A 电流 B 电流
步进 1 + 0
步进 2 0 +
步进 3 - 0
步进 4 0 -
/**************************************************
 *
 * AVR Microcontroller Stepper Control Example
 * Cody Hyman <[email protected]>
 *
 **************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>

#define STEP0 0b10001000     // Phase A Enabled, positive current
#define STEP1 0b00100100     // Phase B Enabled, positive current
#define STEP2 0b01001000     // Phase A enabled, negative current
#define STEP3 0b00010100     // Phase B Enabled, negative current

#define STEPPER_MASK 0xF0    // Upper 4 bits for DIR
#define STEPPER_EN_MASK 0x0C // Bits 2 and 3 for EN
#define STEPPER_ALL_MASK (STEPPER_MASK | STEPPER_EN_MASK) 
#define STEPPER_PORT PORTC   // Stepper I/O Port
#define DIRECTION_FWD 1
#define DIRECTION_REV -1

volatile int8_t stepper_state;  // Step state
volatile int8_t step_direction; // Step direction

/* Initialize the stepper I/O and timer */
void initialize_stepper()
{
 DDRC |= STEPPER_MASK | STEPPER_EN_MASK; // Initialize stepper outputs
 STEPPER_PORT |= STEP0;                  // Step to initial position
 // Enable time 3 for stepper timing via timer overflow interrupt
 TCCR3B = (1<<WGM33)|(1<<WGM32)|(1<<CS32);// Set WGM to CTC mode CLK/256
 ICR3 = 0xFFFF; // Default to maximum delay
 current_direction = DIRECTION_FWD;      // Set initial direction to fwd
 ETIMSK |= (1<<TOIE3);                   // Set Timer 3 Overflow Interrupt
 sei(); // Enable global interrupts
}

/* Adjusts the step delay */
void set_step_delay(uint16_t delay)
{
 ICR3 = delay; // Reset the top value
}

/* Step handler sequence */
void step(uint8_t direction)
{
 stepper_state = (stepper_state + direction) % 4; // Step to the next state
 // Handle I/O changes with the switch statement
 switch(stepper_state)
 {
  STEPPER_PORT &= ~(STEPPER_ALL_MASK);
  case(STEP0):
  {
   STEPPER_PORT |= STEP0;
   break;
  }
  case(STEP1):
  {
   STEPPER_PORT |= STEP1; 
   break;
  }
  case(STEP2):
  {
   STEPPER_PORT |= STEP2;
   break;
  }
  case(STEP3):
  {
   STEPPER_PORT |= STEP3;
   break;
  }
 }
}

/* Timer 3 overflow interrupt service routine */
void ISR(TIMER3_OVF_vect)
{
 step(current_direction); // Run step handler
};

/* Main */
int main(void)
{
 initialize_stepper();
 while(1)
 {
  // Nothing to do here, the interrupt handles motion control
 }
 return 0;
}

现成步进电机解决方案

[编辑 | 编辑源代码]

作为创建您自己的步进电机驱动器/控制器的替代方案,存在许多低成本的现成产品,用于控制小型步进电机。德州仪器、Allegro、意法半导体和安森美都生产专门的微步进驱动器 IC,这些 IC 在简化的逻辑接口上运行,并提供比上面概述的基本概念更精细的步进电机控制。许多业余爱好者供应商(如 Sparkfun 和 Pololu)都为这些类型的步进电机驱动器提供突破板。

华夏公益教科书