一 硬件

    1. 小风扇--------就是一个直流电机,直流小马达,一般只有两个引脚,上电就能转,正负极反接则反向转动,可以通过电机驱动板对转速进行控制,不过由于普通电机转速过快,所以,一般不直接用在智能小车上【1】。我自己尝试了一下,用UNO的5v接风扇一端,风扇另一端接GND,只要板子一通电,风扇也不用控制就转了。当然,如果需要调速,还需要用电机驱动板。

2. ULN2003电机驱动芯片

    

       元件如上图所示,卖家给的清单上写的是ULN2803步进电机,这下子就把小白的我给搞晕了,后来仔细看嵌在中间的那个芯片,依稀看到是ULN2003。外围这些引脚应该是商家搞的,每家出来的应该不一样(如下),但核心芯片一致。

    芯片介绍:“ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据”【2】,说实话,看不懂。

具体引脚图如下:

LN2003芯片引脚介绍【3】
引脚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脚信号输入端。

       不得不吐槽一下卖家给的教程,连线图看不清具体的接口,倒是有视频操作,但是我一看,直接是成品,截图如下,这样的视频没有意义呀

 只能根据上面的引脚介绍和网络搜索自己尝试捣鼓,最终成功的连线图如下,至少达到了调速的试验目的。

二 代码

功能:旋转电位器控制小风扇转速,代码如下:

//调节电位器,读出不同的分压值,以此输出不同的PWM信号(不同的电压)
//可用于控制元件的亮度或转速(直接控制LED的亮度,也可以通过ULN2003控制风扇转速)

const int analogInPin = A0; // 模拟输入引脚
const int analogOutPin = 9; //PWM输出引脚,接LED正极或ULN2003的某个IO口
int ULNoutpin = A1;//ULN2003输出引脚,接风扇一端,也接UNO模拟引脚,进行数据读取

int sensorValue = 0; // 电位器电压值
int pwmValue = 0; // 模拟量输出值(PWM)

void setup()
{
  //pinMode(analogOUTPin,OUTPUT);//省略这句,后续analogWrite()依然有效
  Serial.begin(9600); //初始化串口波特率为9600
}

void loop()
{

  sensorValue = analogRead(analogInPin); // 读取模拟量值
  pwmValue = map(sensorValue, 0, 1023, 0, 255); // 模拟值进行数据变换,便于后续PWM口输出
  analogWrite(analogOutPin, pwmValue); // 输出对应的PWM值,不同的电压对应不同的转速或LED不同的亮度
  int ulnout = analogRead(ULNoutpin);//读取ULN2003输出端的模拟值

  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\t pwm = ");
  Serial.print(pwmValue);
  Serial.print("\t ulnout = ");
  Serial.println(ulnout);

  delay(2); //延迟2毫秒
}

      可以发现,这个代码几乎和前面用电位器控制LED灯的亮度是一样的。因为本质都是一样的旋转电位器,改变A0口模拟输入值,数据变换成对应的pwmValue,再对相应的数字引脚pin用函数analogWrite(pin,pwmValue),从而输出占空比不同的PWM信号,起到输出不同电压的效果。只不过我不懂ULN2003的作用,所以在上面的电路中,从ULN2003的16号引脚又引了一根线接到模拟口A1并读取,所以在代码中多了一两行A1口模拟值读取的内容。

三 疑问

    虽结果是达到旋转电位器控制风扇转速的实验目的了,但这次感觉疑问是比较多的。最困扰的两个问题分别是风扇怎么才能转和ULN2003的功能和作用是什么

第一个问题其实困扰的不是风扇,我尝试了5v和GND直接接到风扇两根线上,通电就转了,那我的理解是风扇两端有5v的电压就OK了,但是当我把风扇接5v的线改到数字接口,则不管用digitalWrite(pin,HIGH)还是analogWrite(pin,255)都不能使风扇转起来,换句话说,UNO输出的高电平或是模拟输出5V都不是真正的电源5V?这个我没有明白。

另外风扇调速的话从最后的结果看就是一端接5V,一端接了ULN2003的输出信号(PWM信号?)

第二个问题主要还是对ULN2003内部不理解【3】,模拟电路知识全忘了,下面的内容不懂。

ULN2003,内部是7个达林顿管,可以看出来,每个达林顿管是两个三极管组合起来了,相当于一个NPN三极管。IN端加控制电压,OUT端接负载,输出是低电平有效,达林顿管又称复合管。他将两个三极管串联,以组成一只等效的新的三极管。这只等效三极管的放大倍数是原二者之积,因此它的特点是放大倍数非常高。达林顿管的作用一般是在高灵敏的放大电路中放大非常微小的信号,如大功率开关电路。在电子学电路设计中,达林顿接法常用于功率放大器和稳压电源中。

勉强的理解就是信号通过ULN2003可以得到放大,但不知道这个信号具体指的是什么?电压或电流?所以电路和代码里加了ULN2003的输出信号读取,结果截图如下

sensor为电位器读取到的模拟值,pwm是把sensor值用map()转换后的值,ulnout就是pwm值输入ULN2003后从对面接口输出的模拟值

     三个图可以看出,sensor和pwm值确实是匹配的,旋转电位器增大读取的分压值变大,pwm值也相应增大,此时试验效果也就是风扇转速也是越来越快的,但是与风扇一端直接相连的ulnout值就让我看不懂了,三个图并没有看出有明显变大的趋势,那到底怎么样的输入信号(ulnout)才能让风扇变快呢?。当然了,ULN2003一端输入pwm值,另一端输出ulnout值,好似信号放大了,但是这个PWM值是用map函数强行转换的,按我的理解ulnout值应该和sensor值来比较,两边对比好像除了第一张图(低速),反而变小了。想了想,这个UNO的模拟口都是模拟量转换成0~1023的,不理解其内部机制,所以我的理解也许那里不对吧。

【1】https://mc.dfrobot.com.cn/thread-2535-1-1.html

【2】https://baike.baidu.com/item/ULN2003/2412863?fr=aladdin

【3】https://www.arduino.cn/thread-91049-1-1.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐