ULN2003是高耐壓、大電流復(fù)合晶體管陣列,由七個硅NPN 復(fù)合晶體管組成。一般采用DIP—16 或SOP—16 塑料封裝。
ULN2003的主要特點:
ULN2003 的每一對達(dá)林頓都串聯(lián)一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來處理的數(shù)據(jù)。ULN2003 工作電壓高,工作電流大,灌電流可達(dá)500mA,并且能夠在關(guān)態(tài)時承受50V 的電壓,輸出還可以在高負(fù)載電流并行運行。ULN2003的作用ULN2003是大電流驅(qū)動陣列,多用于單片機、智能儀表、PLC、數(shù)字量輸出卡等控制電路中,可直接驅(qū)動繼電器等負(fù)載。輸入5VTTL電平,輸出可達(dá)500mA/50V。
簡單地說,ULN2003其實就是用來放大電流的,增加驅(qū)動能力。比如說單片機輸出引腳一般輸出就幾mA,是無法驅(qū)動電機、繼電器或者電磁閥的,像要讓直流電機轉(zhuǎn)需要500mA,而用ULN2003放大后,可以通過單片機的輸出引腳直接控制這些設(shè)備。
?
ULN2003的引腳圖和功能 ULN2003的引腳圖ULN2003的引腳功能 引腳1:CPU脈沖輸入端,端口對應(yīng)一個信號輸出端;引腳2:CPU脈沖輸入端;引腳3:CPU脈沖輸入端;引腳4:CPU脈沖輸入端;引腳5:CPU脈沖輸入端;引腳6:CPU脈沖輸入端;引腳7:CPU脈沖輸入端;引腳8:接地;引腳9:該腳是內(nèi)部7個續(xù)流二極管負(fù)極的公共端,各二極管的正極分別接各達(dá)林頓管的集電極。用于感性負(fù)載時,該腳接負(fù)載電源正極,實現(xiàn)續(xù)流作用。如果該腳接地,實際上就是達(dá)林頓管的集電極對地接通;引腳10:脈沖信號輸出端,對應(yīng)7腳信號輸入端;引腳11:脈沖信號輸出端,對應(yīng)6腳信號輸入端;引腳12:脈沖信號輸出端,對應(yīng)5腳信號輸入端;引腳13:脈沖信號輸出端,對應(yīng)4腳信號輸入端;引腳14:脈沖信號輸出端,對應(yīng)3腳信號輸入端;引腳15:脈沖信號輸出端,對應(yīng)2腳信號輸入端;引腳16:脈沖信號輸出端,對應(yīng)1腳信號輸入端。
?
ULN2003工作原理驅(qū)動應(yīng)用電路ULN2003是高耐壓、大電流復(fù)合晶體管陣列,由七個硅NPN 復(fù)合晶體管組成,每一對達(dá)林頓都串聯(lián)一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來處理的數(shù)據(jù)。
LN2003也是一個7路反向器電路,即當(dāng)輸入端為高電平時,ULN2003輸出端為低電平;當(dāng)輸入端為低電平時,ULN2003輸出端為高電平。
ULN2003是一個非門電路,包含7個單元,單獨每個單元驅(qū)動電流最zydxb達(dá)500mA,9腳可以懸空。比如1腳輸入,16腳輸出,你的負(fù)載接在VCC與16腳之間,不用9腳。
根據(jù)上面的原理,ULN2003的驅(qū)動應(yīng)用電路的基本示例圖,各個引腳的功能都標(biāo)注在上面:
這里需要注意的是:盡管按照官方文獻(xiàn)要求,控制電壓輸入需要在5V,其實只需要超過2.5V的電平信號基本都能夠算作是高電平。也就是說,3.3V的單片機的IO口的高電平輸出就能夠直接來進(jìn)行ULN2003的控制輸入了。
再介紹一個實際例程的ULN2003的驅(qū)動應(yīng)用電路:
整體看下來:引腳1-7是輸入信號;引腳10-16是輸出信號,引腳8接地,引腳9接VCC。
引腳1輸入RL信號,相對應(yīng)的輸出引腳16控制的是一個繼電器。當(dāng)引腳1輸入高電平,繼電器開啟;引腳2-5輸入D、C、B、A信號,相對應(yīng)的輸出引腳15、14、13、12作為四相來控制四相五線步進(jìn)電機;引腳6輸入SPK信號,相對應(yīng)的輸出引腳11控制的是一個喇叭。當(dāng)引腳6輸入高電平,喇叭開啟;引腳7輸入M0T信號,相對應(yīng)的輸出引腳10控制的是一個直流電機。當(dāng)引腳6輸入高電平,直流電機啟動。這個時候大概就能理解ULN2003的本質(zhì)了:
由于單片機的引腳輸出電流太低了,無法驅(qū)動大部分的設(shè)備。而ULN2003只相當(dāng)于是一個開關(guān),設(shè)備(負(fù)載)的供電是在外圍電路上,而它能夠通過微弱的單片機輸出電流來控制外圍電路的開閉。這某種程度上也可以說是,放大電流,增加驅(qū)動能力。
?
STM32驅(qū)動步進(jìn)電機 硬件連接 單片機:STM32F103ZET6步進(jìn)電機:28BYJ-48驅(qū)動電路:ULN2003芯片的驅(qū)動板【TELESKY】5V 步進(jìn)電機馬達(dá)+ ULN2003驅(qū)動板5V測試模塊板 (1套)引腳連接:IN1:PC3、IN2:PC2、IN3:PC0、IN4:PC13、OUT1:步進(jìn)電機4、OUT2:步進(jìn)電機3、OUT3:步進(jìn)電機2、OUT4:步進(jìn)電機1、步進(jìn)電機5:VCC電源正極(5V)、GND:共地、COM:VCC電源正極(5V)。5V直流電源:STM32F103ZET6開發(fā)板上的5V電壓引腳(下圖中的VCC)。之前提到:STM32的IO口高電平3.3V能夠作為ULN2003的控制輸入信號,這里再強調(diào)一次。
具體的硬件連接的圖如下所示:
STM32控制程序
步進(jìn)電機是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行設(shè)備。通俗一點講:當(dāng)步進(jìn)驅(qū)動器接收到一個脈沖信號,它就驅(qū)動步進(jìn)電機按設(shè)定的方向轉(zhuǎn)動一個固定的角度(即步進(jìn)角)。我們可以通過控制脈沖個數(shù)來控制角位移量,從而達(dá)到準(zhǔn)確定位的目的;同時我們可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,從而達(dá)到調(diào)速的目的。
28BYJ48型步進(jìn)電機是四相八拍電機,電壓為DC5V~DC12V。當(dāng)對步進(jìn)電機按一定順序施加一系列連續(xù)不斷的控制脈沖時,它可以連續(xù)不斷地轉(zhuǎn)動。每一個脈沖信號使得步進(jìn)電機的某一相或兩相繞組的通電狀態(tài)改變一次,也就對應(yīng)轉(zhuǎn)子轉(zhuǎn)過一定的角度。當(dāng)通電狀態(tài)的改變完成一個循環(huán)時,轉(zhuǎn)子轉(zhuǎn)過一個齒距。四相步進(jìn)電機可以在不同的通電方式下運行,常見的通電方式有單(單相繞組通電)四拍(A-B-C-D-A……),雙(雙相繞組通電)四拍(AB-BC-CD-DA-AB……),四相八拍(A-AB-B-BC-C-CD-D-DA-A……)。
所以說,要想啟動步進(jìn)電機只需要依次給各個相輸入高電平信號就可以了。注意,當(dāng)給某一相輸入信號的時候,其他相要重新置0。也就是說,同一時刻只能保持有一個相。
#include "stm32f10x.h"#include "delay.h"http://引腳連接//IN1:PC3、IN2:PC2、IN3:PC0、IN4:PC13、//步進(jìn)電機初始化函數(shù)void Motor_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//開啟時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_ResetBits(GPIOC,GPIO_Pin_13);//默認(rèn)低電平GPIO_ResetBits(GPIOC,GPIO_Pin_0);GPIO_ResetBits(GPIOC,GPIO_Pin_2);GPIO_ResetBits(GPIOC,GPIO_Pin_3);}//步進(jìn)電機正轉(zhuǎn)函數(shù)void Motorcw(void){GPIO_SetBits(GPIOC,GPIO_Pin_13);//依次高電平輸出GPIO_ResetBits(GPIOC,GPIO_Pin_0);GPIO_ResetBits(GPIOC,GPIO_Pin_2);GPIO_ResetBits(GPIOC,GPIO_Pin_3);delay_ms(10);GPIO_ResetBits(GPIOC,GPIO_Pin_13);GPIO_SetBits(GPIOC,GPIO_Pin_0);GPIO_ResetBits(GPIOC,GPIO_Pin_2);GPIO_ResetBits(GPIOC,GPIO_Pin_3);delay_ms(10);GPIO_ResetBits(GPIOC,GPIO_Pin_13);GPIO_ResetBits(GPIOC,GPIO_Pin_0);GPIO_SetBits(GPIOC,GPIO_Pin_2);GPIO_ResetBits(GPIOC,GPIO_Pin_3);delay_ms(10);GPIO_ResetBits(GPIOC,GPIO_Pin_13);GPIO_ResetBits(GPIOC,GPIO_Pin_0);GPIO_ResetBits(GPIOC,GPIO_Pin_2);GPIO_SetBits(GPIOC,GPIO_Pin_3);delay_ms(10);} int main(void){delay_init();//delay初始化函數(shù)Motor_Init(); while(1) {Motorcw(); }}
?