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; const int buttonPin2 = 2; const int motorPin = 9;
int buttonState1 = 0; int buttonState2 = 0; int outputValue = 0; int a1 = 0;
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); Serial.print("output="); Serial.println(outputValue); if(outputValue<=500){ if(buttonState1 == HIGH) { a1 += 20; analogWrite(motorPin, a1); delay(1000); } if(buttonState2 == HIGH) { a1 -= 20; analogWrite(motorPin, a1); delay(1000); } } }
|
- 但是由于代码本身没有按键去抖动的保护,按下按键后,作用到电机的结果有延迟,或者速度控制不是很稳定。后续可以进一步改进,提高系统稳定性。
- analogRead()读取到的电机接口状态在0-1023之间,尽管初始化时已经通过analogWrite()将状态设为0,但是一开始读取到的接口状态并非0而是334左右,这意味着一开始作用到电机上的电压约为384/1024*5=1.631V,可能是ULN2003驱动板的作用,这个现象还可以继续深入探索。