應用機器人/機構與驅動/直流步進電機
步進電機是一種直流電機,由多相繞組定子和永磁轉子組成。這些電機旨在齧合到離散的命令位置,並在電流透過電機時保持其位置。每個步進電機都有一個固定的每轉步數,可以透過改變電機中施加磁場的方向來逐步改變。透過連續地以步驟之間的短延遲對電機進行步進,實現旋轉。延遲越短,RPM 越高。
步進電機非常適合需要高扭矩和低 RPM 的簡單開環位置控制應用。隨著速度的增加,步進扭矩會大幅下降,過小的步進時間會導致由於電機慣性而出現漏步。
控制步進電機需要一個狀態機,它將對電機進行換向或改變電機中磁場的方向,並在步進之間應用時間延遲以控制電機速度。這通常使用微控制器的計時器和 4 個 I/O 線來控制電流,從而控制磁場方向。
== 單極性步進電機 == 使用中心抽頭線圈和開關元件,這些元件僅在一個方向上吸取電流,從而改變電機中的電流方向。與可比較的雙極性步進電機相比,這些電機需要兩倍的線圈長度才能實現單極性驅動,因此其重量比雙極性步進電機功率更低。這些電機通常有兩個中心抽頭相位。
== 雙極性步進電機 == 每個相位使用一個線圈,並且需要控制電子裝置來切換透過線圈的電流方向,通常每個相位使用一個單 H 橋。單極性電機也可以透過將每個相位的中心抽頭斷開來以雙極性方式驅動。這些電機通常有兩個相位。
一個高效的單極性步進電機驅動器可以使用 4 個由微控制器 I/O 引腳控制的 N 通道 MOSFET 來構建。每個線圈中心抽頭都連線到一個正電壓,該電壓是電機額定電壓,每個相位線圈端都連線到不同的 MOSFET 漏極。每個步進都由一次開啟一個 MOSFET 來控制。注意:如果 MOSFET 將直接由微控制器 I/O 電平驅動,則至關重要的是它們是邏輯級 FET,將在 5V 時開啟。
雙極性步進電機驅動器可以使用 4 通道高電流驅動器(如 L293、SN754410 或 L298 電機驅動器 IC)構建。每個輸出都應有一對快速作用的整流二極體,以防止驅動器 IC 因開關過程中由於電機電感引起的反向電壓而損壞。步進電機的每個相位都連線到兩個輸出驅動器,形成兩個 H 橋,允許電流雙向驅動透過兩個相位。在標準控制方案中,一次應該只啟用一個相位,因此輸出驅動器使能必須開啟和關閉,除了控制輸出驅動器的方向外。
步進電機控制可以在 AVR 微控制器上完成,可以使用延遲語句(適用於簡單的測試,但對於精確的計時和程式效率來說很糟糕),或者使用計時器/計數器和中斷(稍微複雜一些,但效率要高得多)。以下程式碼展示瞭如何在 ATmega 裝置上使用計時器計數器以及一個簡單的狀態機和 I/O 線。反轉方向只需以相反的方向進行步進即可。此程式碼可用於控制 L29x 型電機驅動器以驅動雙極性步進電機或下拉驅動器以控制單極性步進電機。
兩種型別的兩相步進電機的基本步進順序如下。
| 步進 | A 電流 | B 電流 |
|---|---|---|
| 步進 1 | + | 0 |
| 步進 2 | 0 | + |
| 步進 3 | - | 0 |
| 步進 4 | 0 | - |
/**************************************************
*
* AVR Microcontroller Stepper Control Example
* Cody Hyman <hymanc@onid.orst.edu>
*
**************************************************/
#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)都為這些型別的步進電機驅動器提供突破板。

