0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于ULN2003A達林頓管的步進電機驅(qū)動設(shè)計

CHANBAEK ? 來源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-14 16:22 ? 次閱讀

在我們的項目中,經(jīng)常使用到低電壓小功率的步進電機,此類步進電機若采用驅(qū)動器控制不斷成本高也過于復(fù)雜,我們可以直接使用場效應(yīng)管或者達林頓管來實現(xiàn)對其的驅(qū)動。在本篇中,我們就來討論一下基于ULN2003A達林頓管實現(xiàn)對步進電機的驅(qū)動。

1、功能概述

??我們先來了解一下基本的功能。ULN2003A達林頓管為7個輸出通道,當(dāng)導(dǎo)通時該通道連接到負端,所以非常適合于驅(qū)動4相5線步進電機。

1.1、ULN2003A達林頓管

??ULN2003A 器件是高電壓大電流達林頓晶體管陣列。每 款器件均由7個NPN 達林頓對組成,這些達林頓對具有高壓輸出,帶有用于開關(guān)感性負載的共陰極鉗位二極管。 單個達林頓對的集電極電流額定值為500mA。將達林 頓對并聯(lián)可以提供更高的電流。應(yīng)用包括繼電器驅(qū)動器、電錘驅(qū)動器、燈驅(qū)動器、顯示驅(qū)動器(LED 和氣體放電)、線路驅(qū)動器和邏輯緩沖器。其基本結(jié)構(gòu)圖如下:

1.2、步進電機基本原理

??在我們的測試中,我們使用4相5線步進電機。所謂4相5線步進電機就是該電機具有4組線圈5根連接線,實際上可能不只5根線,但公共端不管抽出多少根線,實際狀態(tài)與1根無異。

??我們一般將這4組線圈記為A相、B相、C相和D相,當(dāng)然,也可以用別的稱呼,只要便于標(biāo)記分別就好。4相5線步進電機一般采用單極性直流電源供電。只要對步進電機的各相繞組按合適的時序通電,就能使步進電機步進轉(zhuǎn)動。一般電機都會提供控制表,具體如下所示:

??結(jié)合ULN2003A結(jié)構(gòu)和4相5線步進電機的驅(qū)動要求,我們可以設(shè)計ULN2003A達林頓管驅(qū)動4相5線步進電機的驅(qū)動電路。

1.3、步進電機驅(qū)動模式

??步進電機的驅(qū)動雖然按照電機的驅(qū)動表就可以實現(xiàn),但實際的驅(qū)動方式有多種,常見的如單波驅(qū)動方式、全步驅(qū)動方式、半步驅(qū)動方式以及微步驅(qū)動方式等。這里我們可以看一看前面三種比較簡單的驅(qū)動方式。

??單波驅(qū)動方式又稱之為單四拍工作方式。此種方式按固定次序依次驅(qū)動每一個線圈以達到使電機轉(zhuǎn)動的目的。其波形如下:

??全步驅(qū)動方式又稱之為雙四拍工作方式。此種方式按固定次序依次驅(qū)動兩組線圈以達到使電機轉(zhuǎn)動的目的。其波形如下:

??半步驅(qū)動方式又稱之為八拍工作方式。此種模式實際上是前兩種模式的組合,以固定的次序依次激勵一組或兩組線圈以達到驅(qū)動電機的目的。其波形如下:

??上述波形即是在單波驅(qū)動方式、全步驅(qū)動方式以及半步驅(qū)動方式下使用示波器抓取的A相和C相的波形圖,基本可以展示這幾種驅(qū)動工作方式波形特征。

2、驅(qū)動設(shè)計與實現(xiàn)

??我們已經(jīng)了解了ULN2003A驅(qū)動4相5線步進電機的基本工作情況,接下來我們就需要據(jù)此來實現(xiàn)ULN2003A驅(qū)動4相5線步進電機驅(qū)動程序的設(shè)計與實現(xiàn)。

2.1、對象定義

??我們依然是基于對象來實現(xiàn)相關(guān)的操作。所以我們首先要定義對象,出于適用性考慮,我們要定義對象的類型并將具體的對象實例化,接下來我們就來抽象對象類型和實例化對象的操作。

2.1.1、對象的抽象

??對于一個對象最主要包括屬性與方法兩方面內(nèi)容,所以我們先來考慮驅(qū)動一個步進電機對象具有哪些屬性和方法,并抽象出較為通用的步進電機的對象類型。

??首先,我們來考慮對象的屬性情況。對電機的操作包括啟停命令、方向命令、運行狀態(tài)、實際運轉(zhuǎn)方向、節(jié)拍數(shù)、周期等,這些信息控制電機的運轉(zhuǎn)并表征其具體工作狀態(tài),所以我們將其作為對象的屬性。驅(qū)動模式和運行模式用以配置電機的具體工作方式,所以我們也將其作為對象的屬性,以完成對象的配置。

??其次我們再來考慮對象的方法問題。對相位的具體操作與具體的硬件平臺有關(guān),根據(jù)對應(yīng)的引腳定義相應(yīng)的相位引腳。這依賴于具體的硬件和軟件操作平臺,所以我們將其定義為對象的方法。為了控制操作時序,我們需要延時處理,而延時操作函數(shù)同樣依賴于具體的軟硬件平臺,所以我們也將其定義為對象的方法,通過回調(diào)函數(shù)的方式來實現(xiàn)。

??根據(jù)上述對對象屬性和方法的分析,我們可以定義步進電機對象的類型如下:

/*定義步進電機對象類型*/
typedef struct StepperObject {
  uint8_t startStop;   //啟動停止命令
  uint8_t runStatus;   //運行狀態(tài)
  uint8_t directSet;   //方向設(shè)定
  uint8_t directRun;   //當(dāng)前方向
  uint8_t beat;      //當(dāng)前節(jié)拍
  uint8_t period;     //速度控制周期
  DriveModeType driveMode;  //驅(qū)動模式
  StepperModeType runMode;  //運行模式
  void (*PhaseAction)(uint8_t cmd);
  void (*Delayms)(uint32_t period);
}StepperObjectType;

2.1.2、對象初始化

??我們定義了對象類型,可以實現(xiàn)基于對象的操作,但定義的對象變量需要進行初始化才能讓不同的對象按照我們的配置的方式去運行。所以在開始對象的使用之前我們先對其進行初始化,這就需要我們設(shè)計一個對象的初始化函數(shù)。

??這個初始化函數(shù),將構(gòu)造一個具體的操作對象。對于步進電機來說,我們需要初始化其相關(guān)的參數(shù),如:工作模式、運行模式以及相位操作函數(shù)等。具體的初始化函數(shù)如下:

/*步進電機對象初始化*/
void StepperInitialization(StepperObjectType *stepper,   //步進電機對象
?           DriveModeType driveMode,     //驅(qū)動模式
?           StepperModeType runMode,     //運行模式
?           uint8_t period,         //速度控制周期
?           StepperPhaseActionType action, //相位操作回調(diào)函數(shù)
?           StepperDelaymsType delayms  //延時操作回調(diào)函數(shù)
?           )
{
  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、對象操作

??接下來我們考慮對步進電機對象所要進行的操作問題。我們已經(jīng)將相位的具體面向硬件平臺的操作定義為對象的方法。我們需要實現(xiàn)對象在不同的模式下節(jié)拍操作的控制。具體實現(xiàn)如下:

//步進電機節(jié)拍操作
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、驅(qū)動的應(yīng)用

??我們已經(jīng)設(shè)計并實現(xiàn)了基于ULN2003A的步進電機驅(qū)動程序,接下來我們實現(xiàn)一個實例來驗證這一驅(qū)動程序設(shè)定是否符合要求。

3.1、聲明并初始化對象

??在開始一切操作之前,首先我們需要一個對象。前面的設(shè)計中,我們已經(jīng)定義了一個StepperObjectType對象類型,所以我們使用它定義一個對象變量。

??StepperObjectType chamber;

??定義了chamber對象變量之后,還沒有辦法使用,因為我們需要對其進行初始化。前面我們已經(jīng)設(shè)計了對象初始化函數(shù),我們需要使用這一函數(shù)來初始化chamber對象變量。初始化函數(shù)需要如下參數(shù):

??StepperObjectType *stepper, //步進電機對象

??DriveModeType driveMode, //驅(qū)動模式

??StepperModeType runMode, //運行模式

??uint8_t period, //速度控制周期

??StepperPhaseActionType action, //相位操作回調(diào)函數(shù)

??StepperDelaymsType delayms //延時操作回調(diào)函數(shù)

??第1個參數(shù)為我們需要初始化的步進電機對象。而驅(qū)動模式、運行模式為枚舉,根據(jù)實際使用要求輸入即可。而速度周期為初始速度設(shè)定,只要不是0的整數(shù)就可以。主要需要考慮的是后面兩個函數(shù)指針。其原型定義如下:

??typedef void (*StepperPhaseActionType)(uint8_t cmd);

??typedef void (*StepperDelaymsType)(uint32_t period);

??根據(jù)函數(shù)指針的原型定義,以及我們項目中具體用到的硬件配置,我們可以實現(xiàn)相位操作函數(shù)為:

/*步進電機相位操作*/
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);
}

??而延時函數(shù)我們直接使用HAL_Delay,所以我們就可以實現(xiàn)步進電機對象的初始化操作如下:

/*步進電機對象初始化*/
  StepperInitialization(&chamber,   //步進電機對象
?              Half_Step,     //驅(qū)動模式
?              Mode_Speed,     //運行模式
?              10,          //速度控制周期
?              PhaseOperation,  //相位操作回調(diào)函數(shù)
?              HAL_Delay    //延時操作回調(diào)函數(shù)
?                );

3.2、基于對象進行操作

??初始化之后,我們就可以使用該對象來實現(xiàn)我們想要的操作了。我們設(shè)計一個應(yīng)用函數(shù)調(diào)用相關(guān)驅(qū)動實現(xiàn)操作。

??我們可以實現(xiàn)位置控制模式如下:

??StepperPositionControl(&chamber,5000,Direct_CW);

??我們可以實現(xiàn)速度控制模式如下:

??StepperSpeedControl(&chamber);

??當(dāng)然具體的操作模式需要在初始化函數(shù)中配置。

4、結(jié)論

??在本篇中我們設(shè)計并實現(xiàn)了基于ULN2003A的步進電機驅(qū)動程序。我們設(shè)計的測試示例運行正常。事實上該驅(qū)動在我們的項目中已經(jīng)實際使用,到目前為止運行還算穩(wěn)定。

??我們開篇說是面向低電壓的小功率的步進電機,但實際上如果我們通過ULN2003A控制MOS管是可以實現(xiàn)高電壓大功率的步進電機的,但我們是直接使用ULN2003A達林頓管所以才限定為低電壓小功率的步進電機。

??使用驅(qū)動是需要注意,該驅(qū)動方式不支持很高的運行速度。速度高時會出現(xiàn)力矩過小而堵轉(zhuǎn)的情形。我們實驗中所采用的電機一般控制在250Hz以下都可以穩(wěn)定運行。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 步進電機
    +關(guān)注

    關(guān)注

    150

    文章

    3041

    瀏覽量

    146840
  • 達林頓管
    +關(guān)注

    關(guān)注

    1

    文章

    34

    瀏覽量

    16116
  • 驅(qū)動設(shè)計
    +關(guān)注

    關(guān)注

    1

    文章

    109

    瀏覽量

    15233
  • ULN2003A
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    8017
收藏 人收藏

    評論

    相關(guān)推薦

    達林頓晶體ULN2003應(yīng)用電路及中文資料

    ,適應(yīng)于各類要求高速大功率驅(qū)動的系統(tǒng)。ULN2003A電路是美國Texas Instruments公司和Sprague公司開發(fā)的高壓大電流達林頓晶體陣列電路,文中介紹了它的電路構(gòu)成、
    發(fā)表于 05-31 13:46

    ULN2003A的使用問題

    `ULN2003A驅(qū)動多少個直流馬達?我用的時候驅(qū)動兩個就不行了。一個是PWM信號控制的一個是一直全速轉(zhuǎn)動。。但是接上ULN2003A后兩個都在全速轉(zhuǎn)動。PWM的那個沒有調(diào)到速。。
    發(fā)表于 05-01 20:41

    ULN2003A驅(qū)動步進電機

    `ULN2003A驅(qū)動步進電機,C51,C語言,附:PROTEUS仿真文件,與KEIL源代碼.自己親手制作,親測可用.`
    發(fā)表于 07-10 16:53

    哪種型號的達林頓驅(qū)動電流較大的步進電機

    剛開始學(xué)步進電機,不知道用哪種達林頓驅(qū)動效果比較好、、希望輸出電流能大些,自己查到的比如ULN2003A等,它們的輸出電流都只有500mA
    發(fā)表于 07-30 11:05

    達林頓ULN2003/2004與之相配的KEC

    大,灌電流可達500mA,并且能夠在關(guān)態(tài)時承受50V 的電壓,輸出還可以在高負載電流并行運行。ULN2003輸入電壓=5V,適用于TTL COMS,由達林頓組成驅(qū)動電路。通常單片機
    發(fā)表于 11-21 10:47

    DSP2812通過ULN2003A控制步進電機程序

    哪位大神有DSP2812通過ULN2003A控制步進電機的程序,可否給一份?
    發(fā)表于 02-01 16:49

    ULN2003A驅(qū)動步進電機的原理圖

    ?! ∠旅娼榻B一種驅(qū)動步進電機驅(qū)動ULN2003A,它是一種新型的七路高耐壓、大電流達林頓
    發(fā)表于 01-13 16:26

    ULN2003A達林頓管有哪些基本功能?

    基于ULN2003A達林頓動。1、功能概述??我們先來了解一下基本的功能。ULN2003A達林頓
    發(fā)表于 07-07 06:20

    用AT89C51的中斷和ULN2003A來分別控制跑馬燈和步進電機

    本次學(xué)習(xí)應(yīng)用AT89C51的中斷和ULN2003A來分別控制跑馬燈和步進電機,我們暫時稱這個電路為——旋轉(zhuǎn)木馬!??!哈哈哈哈哈?。。。ㄆ鋵崨]半毛錢關(guān)系)電路:P1中的五個IO口用來控制LED燈,P2
    發(fā)表于 12-08 07:59

    ULN2002A,ULN2003A,ULN2003AI,UL

    The ULN2002A, ULN2003A, ULN2003AI, ULN2004A, ULQ2003A, and ULQ2004
    發(fā)表于 08-30 11:35 ?77次下載

    ULN2003驅(qū)動步進電機

    80c51的ULN2003驅(qū)動步進電機源碼
    發(fā)表于 09-01 15:01 ?157次下載

    基于ULN2003及單片機驅(qū)動步進電機的應(yīng)用案例

    本資料介紹了ULN2003 的特點與電路結(jié)構(gòu) , 采用單片機連接 ULN2003 組成的驅(qū)動系統(tǒng)來驅(qū)動步進
    發(fā)表于 09-01 10:53 ?74次下載
    基于<b class='flag-5'>ULN2003</b>及單片機<b class='flag-5'>驅(qū)動</b><b class='flag-5'>步進</b><b class='flag-5'>電機</b>的應(yīng)用案例

    基于ULN2003步進電機驅(qū)動

    基于ULN2003A達林頓實現(xiàn)對步進電機驅(qū)動。 1、功能概述 ??我們先來了解一下基本的功能
    發(fā)表于 03-16 10:50 ?8次下載
    基于<b class='flag-5'>ULN2003</b>的<b class='flag-5'>步進</b><b class='flag-5'>電機</b><b class='flag-5'>驅(qū)動</b>

    ESP32設(shè)備驅(qū)動-ULN2003步進電機驅(qū)動

    ULN2003A 是一個由七個 NPN 達林頓晶體組成的陣列,能夠提供 500 mA、50 V 輸出。 它具有用于切換感性負載的共陰極反激二極。 它可以采用 PDIP、SOIC、S
    發(fā)表于 05-16 15:14 ?8次下載
    ESP32設(shè)備<b class='flag-5'>驅(qū)動</b>-<b class='flag-5'>ULN2003</b><b class='flag-5'>步進</b><b class='flag-5'>電機</b><b class='flag-5'>驅(qū)動</b>

    使用ULN2003A步進電機驅(qū)動例程

    今天要講的是步進電機驅(qū)動例程,硬件電路中采用的是ULN2003A來進行步進電機
    的頭像 發(fā)表于 11-09 09:58 ?4958次閱讀
    使用<b class='flag-5'>ULN2003A</b>的<b class='flag-5'>步進</b><b class='flag-5'>電機</b><b class='flag-5'>驅(qū)動</b>例程