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