在我們的項(xiàng)目中,經(jīng)常使用到低電壓小功率的步進(jìn)電機(jī),此類步進(jìn)電機(jī)若采用驅(qū)動(dòng)器控制不斷成本高也過(guò)于復(fù)雜,我們可以直接使用場(chǎng)效應(yīng)管或者達(dá)林頓管來(lái)實(shí)現(xiàn)對(duì)其的驅(qū)動(dòng)。在本篇中,我們就來(lái)討論一下基于ULN2003A達(dá)林頓管實(shí)現(xiàn)對(duì)步進(jìn)電機(jī)的驅(qū)動(dòng)。
1、功能概述
??我們先來(lái)了解一下基本的功能。ULN2003A達(dá)林頓管為7個(gè)輸出通道,當(dāng)導(dǎo)通時(shí)該通道連接到負(fù)端,所以非常適合于驅(qū)動(dòng)4相5線步進(jìn)電機(jī)。
1.1、ULN2003A達(dá)林頓管
??ULN2003A 器件是高電壓大電流達(dá)林頓晶體管陣列。每 款器件均由7個(gè)NPN 達(dá)林頓對(duì)組成,這些達(dá)林頓對(duì)具有高壓輸出,帶有用于開(kāi)關(guān)感性負(fù)載的共陰極鉗位二極管。 單個(gè)達(dá)林頓對(duì)的集電極電流額定值為500mA。將達(dá)林 頓對(duì)并聯(lián)可以提供更高的電流。應(yīng)用包括繼電器驅(qū)動(dòng)器、電錘驅(qū)動(dòng)器、燈驅(qū)動(dòng)器、顯示驅(qū)動(dòng)器(LED 和氣體放電)、線路驅(qū)動(dòng)器和邏輯緩沖器。其基本結(jié)構(gòu)圖如下:
1.2、步進(jìn)電機(jī)基本原理
??在我們的測(cè)試中,我們使用4相5線步進(jìn)電機(jī)。所謂4相5線步進(jìn)電機(jī)就是該電機(jī)具有4組線圈5根連接線,實(shí)際上可能不只5根線,但公共端不管抽出多少根線,實(shí)際狀態(tài)與1根無(wú)異。
??我們一般將這4組線圈記為A相、B相、C相和D相,當(dāng)然,也可以用別的稱呼,只要便于標(biāo)記分別就好。4相5線步進(jìn)電機(jī)一般采用單極性直流電源供電。只要對(duì)步進(jìn)電機(jī)的各相繞組按合適的時(shí)序通電,就能使步進(jìn)電機(jī)步進(jìn)轉(zhuǎn)動(dòng)。一般電機(jī)都會(huì)提供控制表,具體如下所示:
??結(jié)合ULN2003A結(jié)構(gòu)和4相5線步進(jìn)電機(jī)的驅(qū)動(dòng)要求,我們可以設(shè)計(jì)ULN2003A達(dá)林頓管驅(qū)動(dòng)4相5線步進(jìn)電機(jī)的驅(qū)動(dòng)電路。
1.3、步進(jìn)電機(jī)驅(qū)動(dòng)模式
??步進(jìn)電機(jī)的驅(qū)動(dòng)雖然按照電機(jī)的驅(qū)動(dòng)表就可以實(shí)現(xiàn),但實(shí)際的驅(qū)動(dòng)方式有多種,常見(jiàn)的如單波驅(qū)動(dòng)方式、全步驅(qū)動(dòng)方式、半步驅(qū)動(dòng)方式以及微步驅(qū)動(dòng)方式等。這里我們可以看一看前面三種比較簡(jiǎn)單的驅(qū)動(dòng)方式。
??單波驅(qū)動(dòng)方式又稱之為單四拍工作方式。此種方式按固定次序依次驅(qū)動(dòng)每一個(gè)線圈以達(dá)到使電機(jī)轉(zhuǎn)動(dòng)的目的。其波形如下:
??全步驅(qū)動(dòng)方式又稱之為雙四拍工作方式。此種方式按固定次序依次驅(qū)動(dòng)兩組線圈以達(dá)到使電機(jī)轉(zhuǎn)動(dòng)的目的。其波形如下:
??半步驅(qū)動(dòng)方式又稱之為八拍工作方式。此種模式實(shí)際上是前兩種模式的組合,以固定的次序依次激勵(lì)一組或兩組線圈以達(dá)到驅(qū)動(dòng)電機(jī)的目的。其波形如下:
??上述波形即是在單波驅(qū)動(dòng)方式、全步驅(qū)動(dòng)方式以及半步驅(qū)動(dòng)方式下使用示波器抓取的A相和C相的波形圖,基本可以展示這幾種驅(qū)動(dòng)工作方式波形特征。
2、驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
??我們已經(jīng)了解了ULN2003A驅(qū)動(dòng)4相5線步進(jìn)電機(jī)的基本工作情況,接下來(lái)我們就需要據(jù)此來(lái)實(shí)現(xiàn)ULN2003A驅(qū)動(dòng)4相5線步進(jìn)電機(jī)驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)。
2.1、對(duì)象定義
??我們依然是基于對(duì)象來(lái)實(shí)現(xiàn)相關(guān)的操作。所以我們首先要定義對(duì)象,出于適用性考慮,我們要定義對(duì)象的類型并將具體的對(duì)象實(shí)例化,接下來(lái)我們就來(lái)抽象對(duì)象類型和實(shí)例化對(duì)象的操作。
2.1.1、對(duì)象的抽象
??對(duì)于一個(gè)對(duì)象最主要包括屬性與方法兩方面內(nèi)容,所以我們先來(lái)考慮驅(qū)動(dòng)一個(gè)步進(jìn)電機(jī)對(duì)象具有哪些屬性和方法,并抽象出較為通用的步進(jìn)電機(jī)的對(duì)象類型。
??首先,我們來(lái)考慮對(duì)象的屬性情況。對(duì)電機(jī)的操作包括啟停命令、方向命令、運(yùn)行狀態(tài)、實(shí)際運(yùn)轉(zhuǎn)方向、節(jié)拍數(shù)、周期等,這些信息控制電機(jī)的運(yùn)轉(zhuǎn)并表征其具體工作狀態(tài),所以我們將其作為對(duì)象的屬性。驅(qū)動(dòng)模式和運(yùn)行模式用以配置電機(jī)的具體工作方式,所以我們也將其作為對(duì)象的屬性,以完成對(duì)象的配置。
??其次我們?cè)賮?lái)考慮對(duì)象的方法問(wèn)題。對(duì)相位的具體操作與具體的硬件平臺(tái)有關(guān),根據(jù)對(duì)應(yīng)的引腳定義相應(yīng)的相位引腳。這依賴于具體的硬件和軟件操作平臺(tái),所以我們將其定義為對(duì)象的方法。為了控制操作時(shí)序,我們需要延時(shí)處理,而延時(shí)操作函數(shù)同樣依賴于具體的軟硬件平臺(tái),所以我們也將其定義為對(duì)象的方法,通過(guò)回調(diào)函數(shù)的方式來(lái)實(shí)現(xiàn)。
??根據(jù)上述對(duì)對(duì)象屬性和方法的分析,我們可以定義步進(jìn)電機(jī)對(duì)象的類型如下:
/*定義步進(jìn)電機(jī)對(duì)象類型*/
typedef struct StepperObject {
uint8_t startStop; //啟動(dòng)停止命令
uint8_t runStatus; //運(yùn)行狀態(tài)
uint8_t directSet; //方向設(shè)定
uint8_t directRun; //當(dāng)前方向
uint8_t beat; //當(dāng)前節(jié)拍
uint8_t period; //速度控制周期
DriveModeType driveMode; //驅(qū)動(dòng)模式
StepperModeType runMode; //運(yùn)行模式
void (*PhaseAction)(uint8_t cmd);
void (*Delayms)(uint32_t period);
}StepperObjectType;
2.1.2、對(duì)象初始化
??我們定義了對(duì)象類型,可以實(shí)現(xiàn)基于對(duì)象的操作,但定義的對(duì)象變量需要進(jìn)行初始化才能讓不同的對(duì)象按照我們的配置的方式去運(yùn)行。所以在開(kāi)始對(duì)象的使用之前我們先對(duì)其進(jìn)行初始化,這就需要我們?cè)O(shè)計(jì)一個(gè)對(duì)象的初始化函數(shù)。
??這個(gè)初始化函數(shù),將構(gòu)造一個(gè)具體的操作對(duì)象。對(duì)于步進(jìn)電機(jī)來(lái)說(shuō),我們需要初始化其相關(guān)的參數(shù),如:工作模式、運(yùn)行模式以及相位操作函數(shù)等。具體的初始化函數(shù)如下:
/*步進(jìn)電機(jī)對(duì)象初始化*/
void StepperInitialization(StepperObjectType *stepper, //步進(jìn)電機(jī)對(duì)象
? DriveModeType driveMode, //驅(qū)動(dòng)模式
? StepperModeType runMode, //運(yùn)行模式
? uint8_t period, //速度控制周期
? StepperPhaseActionType action, //相位操作回調(diào)函數(shù)
? StepperDelaymsType delayms //延時(shí)操作回調(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、對(duì)象操作
??接下來(lái)我們考慮對(duì)步進(jìn)電機(jī)對(duì)象所要進(jìn)行的操作問(wèn)題。我們已經(jīng)將相位的具體面向硬件平臺(tái)的操作定義為對(duì)象的方法。我們需要實(shí)現(xiàn)對(duì)象在不同的模式下節(jié)拍操作的控制。具體實(shí)現(xiàn)如下:
//步進(jìn)電機(jī)節(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ū)動(dòng)的應(yīng)用
??我們已經(jīng)設(shè)計(jì)并實(shí)現(xiàn)了基于ULN2003A的步進(jìn)電機(jī)驅(qū)動(dòng)程序,接下來(lái)我們實(shí)現(xiàn)一個(gè)實(shí)例來(lái)驗(yàn)證這一驅(qū)動(dòng)程序設(shè)定是否符合要求。
3.1、聲明并初始化對(duì)象
??在開(kāi)始一切操作之前,首先我們需要一個(gè)對(duì)象。前面的設(shè)計(jì)中,我們已經(jīng)定義了一個(gè)StepperObjectType對(duì)象類型,所以我們使用它定義一個(gè)對(duì)象變量。
??StepperObjectType chamber;
??定義了chamber對(duì)象變量之后,還沒(méi)有辦法使用,因?yàn)槲覀冃枰獙?duì)其進(jìn)行初始化。前面我們已經(jīng)設(shè)計(jì)了對(duì)象初始化函數(shù),我們需要使用這一函數(shù)來(lái)初始化chamber對(duì)象變量。初始化函數(shù)需要如下參數(shù):
??StepperObjectType *stepper, //步進(jìn)電機(jī)對(duì)象
??DriveModeType driveMode, //驅(qū)動(dòng)模式
??StepperModeType runMode, //運(yùn)行模式
??uint8_t period, //速度控制周期
??StepperPhaseActionType action, //相位操作回調(diào)函數(shù)
??StepperDelaymsType delayms //延時(shí)操作回調(diào)函數(shù)
??第1個(gè)參數(shù)為我們需要初始化的步進(jìn)電機(jī)對(duì)象。而驅(qū)動(dòng)模式、運(yùn)行模式為枚舉,根據(jù)實(shí)際使用要求輸入即可。而速度周期為初始速度設(shè)定,只要不是0的整數(shù)就可以。主要需要考慮的是后面兩個(gè)函數(shù)指針。其原型定義如下:
??typedef void (*StepperPhaseActionType)(uint8_t cmd);
??typedef void (*StepperDelaymsType)(uint32_t period);
??根據(jù)函數(shù)指針的原型定義,以及我們項(xiàng)目中具體用到的硬件配置,我們可以實(shí)現(xiàn)相位操作函數(shù)為:
/*步進(jìn)電機(jī)相位操作*/
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í)函數(shù)我們直接使用HAL_Delay,所以我們就可以實(shí)現(xiàn)步進(jìn)電機(jī)對(duì)象的初始化操作如下:
/*步進(jìn)電機(jī)對(duì)象初始化*/
StepperInitialization(&chamber, //步進(jìn)電機(jī)對(duì)象
? Half_Step, //驅(qū)動(dòng)模式
? Mode_Speed, //運(yùn)行模式
? 10, //速度控制周期
? PhaseOperation, //相位操作回調(diào)函數(shù)
? HAL_Delay //延時(shí)操作回調(diào)函數(shù)
? );
3.2、基于對(duì)象進(jìn)行操作
??初始化之后,我們就可以使用該對(duì)象來(lái)實(shí)現(xiàn)我們想要的操作了。我們?cè)O(shè)計(jì)一個(gè)應(yīng)用函數(shù)調(diào)用相關(guān)驅(qū)動(dòng)實(shí)現(xiàn)操作。
??我們可以實(shí)現(xiàn)位置控制模式如下:
??StepperPositionControl(&chamber,5000,Direct_CW);
??我們可以實(shí)現(xiàn)速度控制模式如下:
??StepperSpeedControl(&chamber);
??當(dāng)然具體的操作模式需要在初始化函數(shù)中配置。
4、結(jié)論
??在本篇中我們?cè)O(shè)計(jì)并實(shí)現(xiàn)了基于ULN2003A的步進(jìn)電機(jī)驅(qū)動(dòng)程序。我們?cè)O(shè)計(jì)的測(cè)試示例運(yùn)行正常。事實(shí)上該驅(qū)動(dòng)在我們的項(xiàng)目中已經(jīng)實(shí)際使用,到目前為止運(yùn)行還算穩(wěn)定。
??我們開(kāi)篇說(shuō)是面向低電壓的小功率的步進(jìn)電機(jī),但實(shí)際上如果我們通過(guò)ULN2003A控制MOS管是可以實(shí)現(xiàn)高電壓大功率的步進(jìn)電機(jī)的,但我們是直接使用ULN2003A達(dá)林頓管所以才限定為低電壓小功率的步進(jìn)電機(jī)。
??使用驅(qū)動(dòng)是需要注意,該驅(qū)動(dòng)方式不支持很高的運(yùn)行速度。速度高時(shí)會(huì)出現(xiàn)力矩過(guò)小而堵轉(zhuǎn)的情形。我們實(shí)驗(yàn)中所采用的電機(jī)一般控制在250Hz以下都可以穩(wěn)定運(yùn)行。
-
步進(jìn)電機(jī)
+關(guān)注
關(guān)注
150文章
3110瀏覽量
147484 -
達(dá)林頓管
+關(guān)注
關(guān)注
1文章
34瀏覽量
16176 -
驅(qū)動(dòng)設(shè)計(jì)
+關(guān)注
關(guān)注
1文章
111瀏覽量
15285 -
ULN2003A
+關(guān)注
關(guān)注
0文章
7瀏覽量
8040
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論