ULN2003是高耐壓、大電流復合晶體管陣列,由七個硅NPN 復合晶體管組成。一般(ban)采用DIP—16 或SOP—16 塑料封裝(zhuang)。
ULN2003的主(zhu)要特點:
ULN2003 的每一對達林頓都串聯一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數據。ULN2003 工作電壓高,工作電流大,灌電流可達500mA,并且能夠在關態時承受50V 的電壓,輸出還可以在高負載電流并行運行。ULN2003的作用ULN2003是大電流驅動陣列,多用于單片機、智能儀表、PLC、數字量輸出卡等控制電路中,可直接驅動繼電器等負載。輸入5VTTL電平,輸出可達500mA/50V。
簡單地說,ULN2003其實就是用來放大電流的,增加驅動能力。比如說單片(pian)機(ji)輸(shu)(shu)出引(yin)(yin)腳一般輸(shu)(shu)出就幾mA,是無法驅動電機(ji)、繼電器或者電磁閥(fa)的(de),像要讓直(zhi)流(liu)電機(ji)轉需要500mA,而(er)用ULN2003放大后(hou),可以通過單片(pian)機(ji)的(de)輸(shu)(shu)出引(yin)(yin)腳直(zhi)接控(kong)制這些設備。
?
ULN2003的引腳圖和功能 ULN2003的引腳圖ULN2003的引腳功能 引腳1:CPU脈沖輸入端,端口對應一個信號輸出端;引腳2:CPU脈沖輸入端;引腳3:CPU脈沖輸入端;引腳4:CPU脈沖輸入端;引腳5:CPU脈沖輸入端;引腳6:CPU脈沖輸入端;引腳7:CPU脈沖輸入端;引腳8:接地;引腳9:該腳是內部7個續流二極管負極的公共端,各二極管的正極分別接各達林頓管的集電極。用于感性負載時,該腳接負載電源正極,實現續流作用。如果該腳接地,實際上就是達林頓管的集電極對地接通;引腳10:脈沖信號輸出端,對應7腳信號輸入端;引腳11:脈沖信號輸出端,對應6腳信號輸入端;引腳12:脈沖信號輸出端,對應5腳信號輸入端;引腳13:脈沖信號輸出端,對應4腳信號輸入端;引腳14:脈沖信號輸出端,對應3腳信號輸入端;引腳15:脈沖信號輸出端,對應2腳信號輸入端;引腳16:脈沖信號輸出端,對應1腳信號輸入端。
?
ULN2003工作原理驅動應用電路ULN2003是高(gao)耐壓、大電(dian)流復(fu)合晶(jing)體管陣列,由七個硅NPN 復(fu)合晶(jing)體管組成,每一對達林(lin)頓都(dou)串聯一個2.7K 的(de)(de)(de)基極電(dian)阻,在(zai)5V 的(de)(de)(de)工作電(dian)壓下它(ta)能與(yu)TTL 和(he)CMOS 電(dian)路(lu)直接相連(lian),可以直接處理原先需要標準(zhun)邏輯(ji)緩沖器(qi)來(lai)處理的(de)(de)(de)數(shu)據。
LN2003也是一個7路反向器電路,即當輸入端為高電平時,ULN2003輸出端為低電平;當輸入端為低電平時,ULN2003輸出端為高電平。
ULN2003是一個(ge)非(fei)門電路,包含7個(ge)單(dan)(dan)元(yuan),單(dan)(dan)獨每個(ge)單(dan)(dan)元(yuan)驅動(dong)電流最zydxb達500mA,9腳(jiao)(jiao)可以懸空。比如1腳(jiao)(jiao)輸入,16腳(jiao)(jiao)輸出(chu),你的負載接在VCC與16腳(jiao)(jiao)之間,不用9腳(jiao)(jiao)。
根據上面(mian)的(de)原理(li),ULN2003的(de)驅(qu)動應用電路的(de)基本示例(li)圖,各個引腳的(de)功能都標注在(zai)上面(mian):
這里需要注意的是:盡管按照官方文獻要求,控制電壓輸入需要在5V,其實只需要超過2.5V的電平信號基本都能夠算作是高電平。也就是說,3.3V的單片機的IO口的高電平輸出就能夠直接來進行ULN2003的控制輸入了。
再介紹(shao)一(yi)個實際例程的ULN2003的驅(qu)動應用電(dian)路:
整體看下來:引(yin)(yin)腳(jiao)1-7是輸(shu)入信號;引(yin)(yin)腳(jiao)10-16是輸(shu)出信號,引(yin)(yin)腳(jiao)8接(jie)(jie)地,引(yin)(yin)腳(jiao)9接(jie)(jie)VCC。
引腳1輸入RL信號,相對應的輸出引腳16控制的是一個繼電器。當引腳1輸入高電平,繼電器開啟;引腳2-5輸入D、C、B、A信號,相對應的輸出引腳15、14、13、12作為四相來控制四相五線步進電機;引腳6輸入SPK信號,相對應的輸出引腳11控制的是一個喇叭。當引腳6輸入高電平,喇叭開啟;引腳7輸入M0T信號,相對應的輸出引腳10控制的是一個直流電機。當引腳6輸入高電平,直流電機啟動。這個(ge)時候(hou)大概就能理解(jie)ULN2003的本質了:
由于單片機的引腳輸出電流太低了,無法驅動大部分的設備。而ULN2003只相當于是一個開關,設備(負載)的供電是在外圍電路上,而它能夠通過微弱的單片機輸出電流來控制外圍電路的開閉。這某種程度上也可以說是,放大電流,增加驅動能力。
?
STM32驅動步進電機 硬件連接 單片機:STM32F103ZET6步進電機:28BYJ-48驅動電路:ULN2003芯片的驅動板【TELESKY】5V 步進電機馬達+ ULN2003驅動板5V測試模塊板 (1套)引腳連接:IN1:PC3、IN2:PC2、IN3:PC0、IN4:PC13、OUT1:步進電機4、OUT2:步進電機3、OUT3:步進電機2、OUT4:步進電機1、步進電機5:VCC電源正極(5V)、GND:共地、COM:VCC電源正極(5V)。5V直流電源:STM32F103ZET6開發板上的5V電壓引腳(下圖中的VCC)。之前提到:STM32的IO口高電平3.3V能夠作為ULN2003的控制輸入信號,這里再強調一次。
具體(ti)的硬件連接的圖(tu)如(ru)下所示:
STM32控制程序
步進電機是一種將電脈沖轉化為角位移的執行設備。通俗一點講:當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(即步進角)。我們可以通過控制脈沖個數來控制角位移量,從而達到準確定位的目的;同時我們可以通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。
28BYJ48型步(bu)進(jin)(jin)電(dian)(dian)機是四(si)相(xiang)八拍電(dian)(dian)機,電(dian)(dian)壓(ya)為DC5V~DC12V。當對步(bu)進(jin)(jin)電(dian)(dian)機按一(yi)(yi)定順(shun)序施加一(yi)(yi)系列連(lian)續(xu)不(bu)斷的(de)(de)(de)控(kong)制脈沖(chong)時,它(ta)可以連(lian)續(xu)不(bu)斷地轉(zhuan)動。每一(yi)(yi)個(ge)脈沖(chong)信(xin)號使得步(bu)進(jin)(jin)電(dian)(dian)機的(de)(de)(de)某一(yi)(yi)相(xiang)或兩相(xiang)繞組的(de)(de)(de)通(tong)(tong)(tong)電(dian)(dian)狀態(tai)改變一(yi)(yi)次,也就對應(ying)轉(zhuan)子(zi)(zi)轉(zhuan)過(guo)一(yi)(yi)定的(de)(de)(de)角度。當通(tong)(tong)(tong)電(dian)(dian)狀態(tai)的(de)(de)(de)改變完成一(yi)(yi)個(ge)循環(huan)時,轉(zhuan)子(zi)(zi)轉(zhuan)過(guo)一(yi)(yi)個(ge)齒距(ju)。四(si)相(xiang)步(bu)進(jin)(jin)電(dian)(dian)機可以在不(bu)同(tong)的(de)(de)(de)通(tong)(tong)(tong)電(dian)(dian)方式下運行,常(chang)見的(de)(de)(de)通(tong)(tong)(tong)電(dian)(dian)方式有單(單相(xiang)繞組通(tong)(tong)(tong)電(dian)(dian))四(si)拍(A-B-C-D-A……),雙(shuang)(雙(shuang)相(xiang)繞組通(tong)(tong)(tong)電(dian)(dian))四(si)拍(AB-BC-CD-DA-AB……),四(si)相(xiang)八拍(A-AB-B-BC-C-CD-D-DA-A……)。
所以說,要想啟動步進電機只需要依次給各個相輸入高電平信號就可以了。注意,當給某一相輸入信號的時候,其他相要重新置0。也就是說,同一時刻只能保持有一個相。
#include "stm32f10x.h"#include "delay.h"//引腳連接//IN1:PC3、IN2:PC2、IN3:PC0、IN4:PC13、//步進電機初始化函數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);//默認低電平GPIO_ResetBits(GPIOC,GPIO_Pin_0);GPIO_ResetBits(GPIOC,GPIO_Pin_2);GPIO_ResetBits(GPIOC,GPIO_Pin_3);}//步進電機正轉函數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(); }}
?