ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。一般采用DIP—16 或SOP—16 塑料封装。
ULN2003的主要特点:
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。
简单地说,ULN2003其实就是用来放大电流的,增加驱动能力。比如说单片机输出引脚一般输出就几mA,是无法驱动电机、继电器或者电磁阀的,像要让直流电机转需要500mA,而用ULN2003放大后,可以通过单片机的输出引脚直接控制这些设备。
ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
LN2003也是一个7路反向器电路,即当输入端为高电平时,ULN2003输出端为低电平;当输入端为低电平时,ULN2003输出端为高电平。
ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达500mA,9脚可以悬空。比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。
根据上面的原理,ULN2003的驱动应用电路的基本示例图,各个引脚的功能都标注在上面:
这里需要注意的是:尽管按照官方文献要求,控制电压输入需要在5V,其实只需要超过2.5V的电平信号基本都能够算作是高电平。也就是说,3.3V的单片机的IO口的高电平输出就能够直接来进行ULN2003的控制输入了。
再介绍一个实际例程的ULN2003的驱动应用电路:
整体看下来:引脚1-7是输入信号;引脚10-16是输出信号,引脚8接地,引脚9接VCC。
这个时候大概就能理解ULN2003的本质了:
由于单片机的引脚输出电流太低了,无法驱动大部分的设备。而ULN2003只相当于是一个开关,设备(负载)的供电是在外围电路上,而它能够通过微弱的单片机输出电流来控制外围电路的开闭。这某种程度上也可以说是,放大电流,增加驱动能力。
之前提到:STM32的IO口高电平3.3V能够作为ULN2003的控制输入信号,这里再强调一次。
具体的硬件连接的图如下所示:
步进电机是一种将电脉冲转化为角位移的执行设备。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时我们可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
28BYJ48型步进电机是四相八拍电机,电压为DC5V~DC12V。当对步进电机按一定顺序施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号使得步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A……),双(双相绕组通电)四拍(AB-BC-CD-DA-AB……),四相八拍(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();
}
}