0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于ULN2003A达林顿管的步进电机驱动设计

CHANBAEK 来源:木南创智 作者:尹家军 2022-12-14 16:22 次阅读

在我们的项目中,经常使用到低电压小功率的步进电机,此类步进电机若采用驱动器控制不断成本高也过于复杂,我们可以直接使用场效应管或者达林顿管来实现对其的驱动。在本篇中,我们就来讨论一下基于ULN2003A达林顿管实现对步进电机的驱动。

1、功能概述

  我们先来了解一下基本的功能。ULN2003A达林顿管为7个输出通道,当导通时该通道连接到负端,所以非常适合于驱动4相5线步进电机

1.1、ULN2003A达林顿管

  ULN2003A 器件是高电压大电流达林顿晶体管阵列。每 款器件均由7个NPN 达林顿对组成,这些达林顿对具有高压输出,带有用于开关感性负载的共阴极钳位二极管。 单个达林顿对的集电极电流额定值为500mA。将达林 顿对并联可以提供更高的电流。应用包括继电器驱动器、电锤驱动器、灯驱动器、显示驱动器(LED 和气体放电)、线路驱动器和逻辑缓冲器。其基本结构图如下:

1.2、步进电机基本原理

  在我们的测试中,我们使用4相5线步进电机。所谓4相5线步进电机就是该电机具有4组线圈5根连接线,实际上可能不只5根线,但公共端不管抽出多少根线,实际状态与1根无异。

  我们一般将这4组线圈记为A相、B相、C相和D相,当然,也可以用别的称呼,只要便于标记分别就好。4相5线步进电机一般采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。一般电机都会提供控制表,具体如下所示:

  结合ULN2003A结构和4相5线步进电机的驱动要求,我们可以设计ULN2003A达林顿管驱动4相5线步进电机的驱动电路

1.3、步进电机驱动模式

  步进电机的驱动虽然按照电机的驱动表就可以实现,但实际的驱动方式有多种,常见的如单波驱动方式、全步驱动方式、半步驱动方式以及微步驱动方式等。这里我们可以看一看前面三种比较简单的驱动方式。

  单波驱动方式又称之为单四拍工作方式。此种方式按固定次序依次驱动每一个线圈以达到使电机转动的目的。其波形如下:

  全步驱动方式又称之为双四拍工作方式。此种方式按固定次序依次驱动两组线圈以达到使电机转动的目的。其波形如下:

  半步驱动方式又称之为八拍工作方式。此种模式实际上是前两种模式的组合,以固定的次序依次激励一组或两组线圈以达到驱动电机的目的。其波形如下:

  上述波形即是在单波驱动方式、全步驱动方式以及半步驱动方式下使用示波器抓取的A相和C相的波形图,基本可以展示这几种驱动工作方式波形特征。

2、驱动设计与实现

  我们已经了解了ULN2003A驱动4相5线步进电机的基本工作情况,接下来我们就需要据此来实现ULN2003A驱动4相5线步进电机驱动程序的设计与实现。

2.1、对象定义

  我们依然是基于对象来实现相关的操作。所以我们首先要定义对象,出于适用性考虑,我们要定义对象的类型并将具体的对象实例化,接下来我们就来抽象对象类型和实例化对象的操作。

2.1.1、对象的抽象

  对于一个对象最主要包括属性与方法两方面内容,所以我们先来考虑驱动一个步进电机对象具有哪些属性和方法,并抽象出较为通用的步进电机的对象类型。

  首先,我们来考虑对象的属性情况。对电机的操作包括启停命令、方向命令、运行状态、实际运转方向、节拍数、周期等,这些信息控制电机的运转并表征其具体工作状态,所以我们将其作为对象的属性。驱动模式和运行模式用以配置电机的具体工作方式,所以我们也将其作为对象的属性,以完成对象的配置。

  其次我们再来考虑对象的方法问题。对相位的具体操作与具体的硬件平台有关,根据对应的引脚定义相应的相位引脚。这依赖于具体的硬件和软件操作平台,所以我们将其定义为对象的方法。为了控制操作时序,我们需要延时处理,而延时操作函数同样依赖于具体的软硬件平台,所以我们也将其定义为对象的方法,通过回调函数的方式来实现。

  根据上述对对象属性和方法的分析,我们可以定义步进电机对象的类型如下:

/*定义步进电机对象类型*/
typedef struct StepperObject {
  uint8_t startStop;   //启动停止命令
  uint8_t runStatus;   //运行状态
  uint8_t directSet;   //方向设定
  uint8_t directRun;   //当前方向
  uint8_t beat;      //当前节拍
  uint8_t period;     //速度控制周期
  DriveModeType driveMode;  //驱动模式
  StepperModeType runMode;  //运行模式
  void (*PhaseAction)(uint8_t cmd);
  void (*Delayms)(uint32_t period);
}StepperObjectType;

2.1.2、对象初始化

  我们定义了对象类型,可以实现基于对象的操作,但定义的对象变量需要进行初始化才能让不同的对象按照我们的配置的方式去运行。所以在开始对象的使用之前我们先对其进行初始化,这就需要我们设计一个对象的初始化函数。

  这个初始化函数,将构造一个具体的操作对象。对于步进电机来说,我们需要初始化其相关的参数,如:工作模式、运行模式以及相位操作函数等。具体的初始化函数如下:

/*步进电机对象初始化*/
void StepperInitialization(StepperObjectType *stepper,   //步进电机对象
​           DriveModeType driveMode,     //驱动模式
​           StepperModeType runMode,     //运行模式uint8_t period,         //速度控制周期
​           StepperPhaseActionType action, //相位操作回调函数
​           StepperDelaymsType delayms  //延时操作回调函数
​           )
{
  if((stepper==NULL)||(action==NULL)||(delayms==NULL))
  {
​    return;
  }
  stepper->PhaseAction=action;
  stepper->Delayms=delayms;

  stepper->driveMode=driveMode;
  stepper->runMode=runMode;
  
  stepper->period=period>0?period:1;
}

2.2、对象操作

  接下来我们考虑对步进电机对象所要进行的操作问题。我们已经将相位的具体面向硬件平台的操作定义为对象的方法。我们需要实现对象在不同的模式下节拍操作的控制。具体实现如下:

//步进电机节拍操作
static void StepperAction(StepperObjectType *stepper)
{
  uint8_t Command[BEAT_NUM]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
  RunBeatType beat=BEAT_NUM;
  
  if(stepper->beat>=BEAT_NUM)
  {
​    stepper->beat=0;
​    
​    if(stepper->driveMode==Full_Step)
​    {
​      stepper->beat=1;
​    }
  }
 
  beat=stepper->directRun>0?((RunBeatType)(7-stepper->beat)):((RunBeatType)stepper->beat);
  
  if(beat>=BEAT_NUM)
  {
​    return;
  }
  
  stepper->PhaseAction(Command[beat]);
  
  stepper->beat++;
  if((stepper->driveMode==Full_Step)||(stepper->driveMode==Single_Wave))
  {
​    stepper->beat++;
  }
  
  stepper->Delayms(stepper->period);
}

3、驱动的应用

  我们已经设计并实现了基于ULN2003A的步进电机驱动程序,接下来我们实现一个实例来验证这一驱动程序设定是否符合要求。

3.1、声明并初始化对象

  在开始一切操作之前,首先我们需要一个对象。前面的设计中,我们已经定义了一个StepperObjectType对象类型,所以我们使用它定义一个对象变量。

  StepperObjectType chamber;

  定义了chamber对象变量之后,还没有办法使用,因为我们需要对其进行初始化。前面我们已经设计了对象初始化函数,我们需要使用这一函数来初始化chamber对象变量。初始化函数需要如下参数:

  StepperObjectType *stepper, //步进电机对象

  DriveModeType driveMode, //驱动模式

  StepperModeType runMode, //运行模式

  uint8_t period, //速度控制周期

  StepperPhaseActionType action, //相位操作回调函数

  StepperDelaymsType delayms //延时操作回调函数

  第1个参数为我们需要初始化的步进电机对象。而驱动模式、运行模式为枚举,根据实际使用要求输入即可。而速度周期为初始速度设定,只要不是0的整数就可以。主要需要考虑的是后面两个函数指针。其原型定义如下:

  typedef void (*StepperPhaseActionType)(uint8_t cmd);

  typedef void (*StepperDelaymsType)(uint32_t period);

  根据函数指针的原型定义,以及我们项目中具体用到的硬件配置,我们可以实现相位操作函数为:

/*步进电机相位操作*/
static void PhaseOperation(uint8_t cmd)
{
  GPIO_PinState AP,BP,CP,DP;
  
  AP=(GPIO_PinState)(cmd&0x01);
  BP=(GPIO_PinState)((cmd>>1)&0x01);
  CP=(GPIO_PinState)((cmd>>2)&0x01);
  DP=(GPIO_PinState)((cmd>>3)&0x01);
  
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, BP);
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, DP);
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, AP);
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14, CP);
}

  而延时函数我们直接使用HAL_Delay,所以我们就可以实现步进电机对象的初始化操作如下:

/*步进电机对象初始化*/
  StepperInitialization(&chamber,   //步进电机对象
​              Half_Step,     //驱动模式
​              Mode_Speed,     //运行模式10,          //速度控制周期
​              PhaseOperation,  //相位操作回调函数
​              HAL_Delay    //延时操作回调函数
​                );

3.2、基于对象进行操作

  初始化之后,我们就可以使用该对象来实现我们想要的操作了。我们设计一个应用函数调用相关驱动实现操作。

  我们可以实现位置控制模式如下:

  StepperPositionControl(&chamber,5000,Direct_CW);

  我们可以实现速度控制模式如下:

  StepperSpeedControl(&chamber);

  当然具体的操作模式需要在初始化函数中配置。

4、结论

  在本篇中我们设计并实现了基于ULN2003A的步进电机驱动程序。我们设计的测试示例运行正常。事实上该驱动在我们的项目中已经实际使用,到目前为止运行还算稳定。

  我们开篇说是面向低电压的小功率的步进电机,但实际上如果我们通过ULN2003A控制MOS管是可以实现高电压大功率的步进电机的,但我们是直接使用ULN2003A达林顿管所以才限定为低电压小功率的步进电机。

  使用驱动是需要注意,该驱动方式不支持很高的运行速度。速度高时会出现力矩过小而堵转的情形。我们实验中所采用的电机一般控制在250Hz以下都可以稳定运行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 步进电机
    +关注

    关注

    149

    文章

    2929

    浏览量

    146059
  • 达林顿管
    +关注

    关注

    1

    文章

    32

    浏览量

    15973
  • 驱动设计
    +关注

    关注

    1

    文章

    108

    浏览量

    15186
  • ULN2003A
    +关注

    关注

    0

    文章

    7

    浏览量

    7990
收藏 人收藏

    评论

    相关推荐

    达林顿晶体ULN2003应用电路及中文资料

    ,适应于各类要求高速大功率驱动的系统。ULN2003A电路是美国Texas Instruments公司和Sprague公司开发的高压大电流达林顿晶体阵列电路,文中介绍了它的电路构成、
    发表于 05-31 13:46

    ULN2003A的使用问题

    `ULN2003A驱动多少个直流马达?我用的时候驱动两个就不行了。一个是PWM信号控制的一个是一直全速转动。。但是接上ULN2003A后两个都在全速转动。PWM的那个没有调到速。。
    发表于 05-01 20:41

    ULN2003A驱动步进电机

    `ULN2003A驱动步进电机,C51,C语言,附:PROTEUS仿真文件,与KEIL源代码.自己亲手制作,亲测可用.`
    发表于 07-10 16:53

    哪种型号的达林顿驱动电流较大的步进电机

    刚开始学步进电机,不知道用哪种达林顿驱动效果比较好、、希望输出电流能大些,自己查到的比如ULN2003A等,它们的输出电流都只有500mA
    发表于 07-30 11:05

    达林顿ULN2003/2004与之相配的KEC

    大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。ULN2003输入电压=5V,适用于TTL COMS,由达林顿组成驱动电路。通常单片机
    发表于 11-21 10:47

    DSP2812通过ULN2003A控制步进电机程序

    哪位大神有DSP2812通过ULN2003A控制步进电机的程序,可否给一份?
    发表于 02-01 16:49

    ULN2003A驱动步进电机的原理图

    。  下面介绍一种驱动步进电机驱动ULN2003A,它是一种新型的七路高耐压、大电流达林顿
    发表于 01-13 16:26

    ULN2003A达林顿管有哪些基本功能?

    基于ULN2003A达林顿动。1、功能概述  我们先来了解一下基本的功能。ULN2003A达林顿
    发表于 07-07 06:20

    使用uln2003模块驱动步进电机

    淘宝上买的步进电机店家未提供驱动方式。经过一段时间的探索,研究出这款电机驱动方式,最方便的是使用uln
    发表于 08-31 08:18

    用AT89C51的中断和ULN2003A来分别控制跑马灯和步进电机

    本次学习应用AT89C51的中断和ULN2003A来分别控制跑马灯和步进电机,我们暂时称这个电路为——旋转木马!!!哈哈哈哈哈!!!(其实没半毛钱关系)电路:P1中的五个IO口用来控制LED灯,P2
    发表于 12-08 07:59

    ULN2003驱动步进电机

    80c51的ULN2003驱动步进电机源码
    发表于 09-01 15:01 156次下载

    一文看懂arduino驱动uln2003操作步进电机的方法

    本文首先介绍了arduino驱动uln2003操作步进电机的方法,其次介绍了ULN2003引脚及功能,最后介绍了
    的头像 发表于 05-30 09:34 8.1w次阅读
    一文看懂arduino<b class='flag-5'>驱动</b><b class='flag-5'>uln2003</b>操作<b class='flag-5'>步进</b><b class='flag-5'>电机</b>的方法

    基于ULN2003步进电机驱动

    基于ULN2003A达林顿管实现对步进电机驱动。 1、功能概述   我们先来了解一下基本的功能。ULN
    发表于 03-16 10:50 7次下载
    基于<b class='flag-5'>ULN2003</b>的<b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>驱动</b>

    ESP32设备驱动-ULN2003步进电机驱动

    ULN2003A 是一个由七个 NPN 达林顿晶体管组成的阵列,能够提供 500 mA、50 V 输出。 它具有用于切换感性负载的共阴极反激二极管。 它可以采用 PDIP、SOIC、SOP
    发表于 05-16 15:14 7次下载
    ESP32设备<b class='flag-5'>驱动</b>-<b class='flag-5'>ULN2003</b><b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>驱动</b>

    使用ULN2003A步进电机驱动例程

    今天要讲的是步进电机驱动例程,硬件电路中采用的是ULN2003A来进行步进电机
    的头像 发表于 11-09 09:58 2134次阅读
    使用<b class='flag-5'>ULN2003A</b>的<b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>驱动</b>例程