ULN2003驱动直流电机

ULN2003芯片

在 ULN2003 内部,有七个高耐压、大电流 NPN 达林顿管构成的反相器,输入 5V 的 TTL 电平,输出可达 500mA/50V。ULN2803 里面有八个反相器,它们的电气性能是相同的。
ULN2003有16个引脚,1B7B输入分别对应1C7C输出,1个GND,1个COM。

引脚8接地,引脚9是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用,作为驱动电流。如果该脚接地,实际上就是达林顿管的集电极对地接通。

直流电机

功能描述

通过加速和减速按键,能够控制负载/电机两端电压,改变电机转速。PWM频率一定时,脉冲宽度越大,占空比越大,提供给电机的平均电压越大,电机转速就越高。反之脉冲宽度越小,则占空比越小,提供给电机的平均电压越小,电机转速就低。

接线图

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 定义引脚
const int buttonPin1 = 7; //定义buttonPin1引脚为7,加速按键
const int buttonPin2 = 2; //定义buttonPin2引脚为2,减速按键
const int motorPin = 9; //定义motorPin引脚为9,驱动电机

int buttonState1 = 0;
int buttonState2 = 0;
int outputValue = 0;
int a1 = 0; //占空比,这里取0-255

void setup() {
//输入输出状态定义
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(motorPin, OUTPUT);
Serial.begin(9600); //定义串口波特率
}

void loop() {
// 串口监视器打印按键状态和电机转速
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
Serial.print("加速按钮=");
Serial.println(buttonState1);
Serial.print("减速按钮=");
Serial.println(buttonState2);
delay(1000);

outputValue=analogRead(motorPin); //outputValue:0~1023
Serial.print("output=");
Serial.println(outputValue);
if(outputValue<=500){
if(buttonState1 == HIGH) { //如果加速按键按下
a1 += 20; // a1的变化数值可以根据实际需求调整
analogWrite(motorPin, a1); //将a的值赋给motorPin
delay(1000); //延迟1s
}
if(buttonState2 == HIGH) { //如果减速按键按下
a1 -= 20;
analogWrite(motorPin, a1);
delay(1000);
}
}
}

  • 但是由于代码本身没有按键去抖动的保护,按下按键后,作用到电机的结果有延迟,或者速度控制不是很稳定。后续可以进一步改进,提高系统稳定性。
  • analogRead()读取到的电机接口状态在0-1023之间,尽管初始化时已经通过analogWrite()将状态设为0,但是一开始读取到的接口状态并非0而是334左右,这意味着一开始作用到电机上的电压约为384/1024*5=1.631V,可能是ULN2003驱动板的作用,这个现象还可以继续深入探索。