如何驱动步进电机

[复制链接]
查看92543 | 回复0 | 2024-8-1 11:47:21 | 显示全部楼层 |阅读模式
来源:digikey

本文旨在帮助初学者了解步进电机的工作原理以及如何驱动步进电机。控制步进电机是一个广泛的话题,本文帮你有个好的开始。有两种类型的步进电机:双极和单极。
双极电机:



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



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



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

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



完整步骤1和2之间的半步
如何控制线圈中的电流:




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



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



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



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



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



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



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


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


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

晶体管是一种电流控制限流装置。晶体管有三个引脚:基极、集电极和发射极。(用c、b和e表示)。
NPN晶体管:

NPN晶体管大部分已被MOS管所取代,但仍有一些应用需要晶体管。它们不易受到静电放电(ESD)的影响,使用电压也较低。最大的缺点是,它们不能像MOS管那样推动更多的电流,而且效率也不高。使用5mA提供的TIP120,我可以控制高达5A的60V负载(阅读数据表了解具体操作特性)。

这是一个典型的小信号NPN晶体管。当小电流从基极流向发射极时,允许较大电流从集电极流向发射极。记住它们是基于电流的设备很重要。



达林顿对是由两个晶体管组成的封装。增益是正向电压的两倍。

任何晶体管都可以被认为是二极管+电流源。



通过相关电流源的电流是(β)乘以通过二极管的电流(ib)。β称为晶体管的增益。不同的晶体管有一个相当大的差异,所以不要依赖这个值是真的!该模型仅在晶体管未饱和时有效。如果有足够多的电流流过基极,使得晶体管不再限制通过集电极-发射极的电流,则晶体管被称为饱和。(如果将晶体管用作开关,则应使晶体管饱和或关闭,以防止发热和断电。)

二极管在阳极和阴极两端的标称压降为0.7V。因此,从基极到发射极的电压降是0.7伏(对于达林顿来说,这是1.4伏)。



二极管是晶体管的一个组成部分,这就是为什么你应该放置NPN晶体管来控制接地,放置PNP晶体管来控制电源。考虑两个几乎相等的电路。



在第一电路中,假设你有足够的电流从3.3V电源进入基极,使晶体管完全饱和(晶体管不会限制负载图像中的任何电流。集电极和发射极之间的电压降很小,但很小。负载两端有11.8伏。限流电阻两端的电压为2.6V。这在计算电阻大小时很重要。

在第二个电路中,相同的电阻用于理论上限制相同的电流。但由于晶体管在基极和发射极之间的作用类似二极管,发射极必须比基极低0.7伏。2.6伏是发射极所能达到的最大绝对值(由于两个电阻的分压,它可能会小得多。)此时晶体管并不是限制电流,而是限制电压。无论如何,晶体管将多余的功率作为热量散发出去。负载两端的电压仅为2.6V。
PNP晶体管:

这是典型的PNP晶体管在示意图中的样子。它类似于NPN晶体管,只是电流必须从发射极流向基极,以允许电流从发射极流到集电极。当一个小电流通过二极管时,允许一个更大的电流流过发射极和集电极。



晶体管可以被认为是二极管+电流源。来自从属电流源的电流为。就像NPN一样,二极管存在于基极到发射极之间。二极管两端仍有0.7V的压降。它正对着另一个方向。



下面是在电路中使用它的方法。要打开它,让针脚1比针脚3低0.7V。为了关闭晶体管,引脚1需要与VCC处于相同的电压。在使用运算放大器控制它时,这一点很重要。如果运算放大器不是轨到轨运行,它不会完全关闭PNP晶体管。这也使得驱动更高的电压变得困难。如果你试图用3.3v控制12v电源,你永远无法关闭晶体管。3.3v总是小于12v。这就是为什么我通常将它们与小信号NPN配对。如果NPN关闭,电流不能流过二极管,PNP关闭。



如何选择离散组件:

二极管: 选择适合你应用的额定电流二极管。当从接通切换到断开时,电机中的电流必须通过二极管。为了避免过热,请尝试寻找具有较低正向电压的二极管。如果你计划实施微步进,则尤其如此。

晶体管: 你的H桥晶体管也必须为你的应用额定电流。可以通过选择较低的集电极-发射极饱和电压来避免过热。更高的转换频率也可能是有益的,因为它将减少晶体管处于激活状态的时间量。最大功率值表示晶体管可以消耗多少功率。低功耗意味着晶体管将用作开关。

小信号晶体管: 这些可能很不起眼。要查找的最大属性是集电极-发射极击穿电压高于电机电源。更高的频率转换也是好的。过渡时间将叠加在两个晶体管之间(给出总体上低得多的过渡频率)

电阻: 电阻应容易选择。他们将保证一小部分电流通过晶体管。两个NPN电阻也将看到最小电压电平。连接到PNP基极的电阻是唯一需要注意的电阻。一旦你知道流经晶体管的电流量,电压基本上就是电机电源电压。额定功率超过¼瓦对于大多数应用来说应该绰绰有余。
场景举例:

我将用一个例子来说明如何计算电阻所需的值。这是一个场景:

电机
12V,0.33 A



电源



微处理器

EFM32GG-STK3700。该板的逻辑电平为3.3v。每个引脚能够提供高达20mA的电源。

晶体管

我正好有一些TIP120和TIP125晶体管,我将用它们来驱动H桥。它们能够驾驶5A。





这两个晶体管似乎都具有4V的集电极-发射极饱和!在两个晶体管之间,这只会让我的电机运行4V。我们最好深入研究一下这个参数。



数据表吓了我一跳!看起来我的应用程序的典型饱和电压低于1V。在更高的电流情况下,饱和电压增加到约1.2V。小信号NPN通常具有0.2V的饱和电压。为什么达林顿对如此高?



考虑点D。如果第一个晶体管饱和,D将比C小0.2V。请记住,第二个晶体管内置二极管。E必须比D小0.7V,否则电流将不会流动。总的来说,E比C低0.9V。这可以解释为什么达林顿对具有更高的饱和电压。当考虑电路中的电流时,最好依靠简单的事实来避免过于复杂。

现在我们需要电阻和二极管。我手头有一些1N4148二极管。它们目前不适合我的应用程序。然而,我并没有计划对电机进行微步进。



如果你仔细看看当前的能力,数据表显示它可以处理300毫安的正向电流。此外,它可以处理1秒的1A浪涌。电机中的电流在1秒内不应超过1A。



计算H桥中的电阻:

现在零件选择已经完成,我们可以将重点放在电阻上。首先,你需要考虑通过晶体管的电流。



我们的负载电流为0.33A。因此,


PNP电阻消耗的功率为VI=120.001=12mW。实际上,任何尺寸的电阻都可以工作。Digi-key提供的表面安装电阻的最小额定功率为12.5mW。

我的晶体管在工作区附近的增益在25摄氏度时接近1000。


因此,我应该为晶体管的基极提供330 uA。为了安全起见,我将提供1mA的电流(三倍于此。因为我的电流是330 mA,所以我不在乎另外1 mA。通常双倍的电流是安全的。)

现在我们知道了所需的电流,我们可以看看电压。

由于PNP内置二极管,B点的电压将比VDD(12V)低1.4V,因此Vb=10.6V。

如果最左边的NPN饱和,集电极-发射极电压将为0.2V。因此,Va=0.2V。

这意味着电阻两端的电压是10.4V。我们需要1mA才能通过电阻。使用V=I*R,

R=V/I=10400。10k电阻就可以了。这个值不需要精确,因为当我们将电流增加三倍时,我们已经考虑了任何增益容差。



下一个晶体管将是另一对达林顿晶体管。集电极电流为330mA。在我的操作点附近,增益也在1000左右。我应该只需要330uA,但我会将其增加三倍至1mA,以确保考虑到任何公差。

D点的电压是1.4V。我的C点MCU可以提供3.3V。电阻两端的电压是1.9V。使用V=I*R,R=V/I=1900。2k2电阻或1k8电阻将工作。



最后要计算的电阻是控制PNP晶体管的电阻。集电极电流为1mA。典型的小信号晶体管的增益为100。在较低的电流下,它也会较低。仔细检查晶体管的数据表。为这个晶体管供电所需的电流只有10uA。为了安全起见,我将计算100uA。F处的电压为0.7V。E处的电压再次为3.3V。电阻两端的电压为2.6V。使用R=V/I,R=26k。从20公里到50公里的任何距离都可以。我用了28k电阻。



这就是你设置H桥的方式!要控制它,你需要为电线供电:



警告:要么不要将电机电源电压连接到VM,要么在连接所有设备之前不要打开电源。当重新连接插针和移动的电线时,请确保高压电源已关闭。你可以很容易地将所有的IC烧断。不要说我没有警告你。

只打开针脚1,然后3,然后2,然后4,旋转电机。或者,按照相反的顺序(4,2,3,1)。为了确保不会发生电源对地故障,请在切换状态时关闭所有引脚。
H桥的示例代码:

使用完整步骤的示例代码:

/**************************************************************************//** * @file * @brief Empty Project * @author Energy Micro AS * @version 3.20.2 * @section License * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>******************************************************************************* * * This file is licensed under the Silicon Labs Software License Agreement. See * "http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt"  * for details. Before using this software for any purpose, you must agree to the * terms of that agreement. *******************************************************************************/#include "em_device.h"#include "em_chip.h"#include "em_cmu.h"#include "em_system.h"#include "em_gpio.h"volatile uint32_t msTicks;#define TOTAL_STEPS      4uint32_t STEPS[TOTAL_STEPS] = {0b1000, 0b0010, 0b0100, 0b0001};             //1,3,2,4uint16_t STEP = 0;/* ************* Systick Handler ***************** */void SysTick_Handler(void) {    msTicks++;}/* ************* Delay function ****************** */void Delay(uint32_t dlyTicks) {    uint32_t curTicks = msTicks;    while((msTicks - curTicks) < dlyTicks);}/* ************* Output to H-bridge ************** */void setStep(void) {      GPIO->P[3].DOUTCLR = 0xF;                  //Shut off all pins.      GPIO->P[3].DOUTSET = STEPS[STEP];          //Output the steps}/* ************* Main function ******************* */int main(void){    CHIP_Init();    CMU->HFRCOCTRL = 0x30; // Set RC clock to 1 MHz    CMU->HFPERCLKEN0 =(1<<13); //Enable GPIO clock
    if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000)) while (1) ;         //Setup SysTick
/* ****************** Setup pushbuttons and H-bridge outputs ****************** */    GPIO->P[1].MODEH = 0x110;                //Setup RB9 and RB10 as input    GPIO->P[3].MODEL = 0x5555;               //Setup PD0-PD3 as push pull output. These go directly to the H-bridge    GPIO->P[3].CTRL = 2;                     //High drivemode    GPIO->P[3].DOUT = 0x0000;                //They should already be all low.                                            //H-bridge pins 1,2,3,4 map to pins 3,2,1,0 on port D.  /* Infinite loop */  while (1) {      if(!GPIO_PinInGet(gpioPortB,9)) {                         //If button 0 is pressed          STEP = (STEP + 1) % TOTAL_STEPS;                      //Increment the step          setStep();                                            //Output to the H-bridge      }      else if(!GPIO_PinInGet(gpioPortB, 10)) {                  //If button 1 is pressed.          STEP = (STEP + TOTAL_STEPS-1) % TOTAL_STEPS;          //Decrement the step          setStep();                                            //Output to the H-bridge      }      Delay(10);                                                //Short delay to let motor rotate  }}

使用半步的示例代码:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则