利用Arduino Mega的Analog端口无法驱动L298N电机芯片的解释

问题描述

在这里插入图片描述
Arduino与L298N驱动板的正常连线应为:
PWM Pin2——IN1 (仅低高输出)
PWM Pin3——IN2 (仅高低输出)
PWM Pin6——ENA (PWM输出)
OUT1——电机1脚
OUT2——电机2脚
VCC——电池﹢极
GND——电池-极与Arduino板GND
5V——Arduino板的5V输入

小Y同学提出了一个问题:把原本接到PWM Pin6的ENA口接到Analog端口,希望通过analogWrite函数来控制模拟端口输出电压的大小,实现电机的调速。但实际操作后只观察到了电机转与不转,而未能成功调速,这是为什么呢?

要回答这个问题,我们得了解L298N芯片的内部结构、操作过程与更深入地了解analogWrite函数。本文将针对以上两个问题,由L298的数据手册来解释EN、IN、OUT、VS、VSS口的作用,介绍L298的工作原理,并对AnalogWrite函数作用于做进一步的说明。

第一章 L298芯片

1.1 L298N芯片概述

在这里插入图片描述
L298 (L298N是其中的一个型号)是ST公司生产的一种集成芯片,封装是Multiwatt15或者PowerSO20(取决于具体型号),是一个高电压、大电流、被设计成兼容标准TTL逻辑电平(即数字IO口输出的高低电平)的双全桥(dual full-bridge),或称双H桥)驱动器。
在这里插入图片描述
L298N支持驱动继电器、电磁阀、直流电机等用电设备。2个使能输入引脚(Enable A [Pin6], Enable B [Pin11])可独立地控制相应的输入信号(Input 1-Input 4)是否有效,此外还提供额外的逻辑电平供电端(Vss)来确保能够使用较低的逻辑TTL电平(与供电电压Vs相比较低)来控制该芯片的输出(Output 1-Output 4)。

1.2 L298N电气属性

在这里插入图片描述
上图为L298N的电气属性,要注意的有如下几点:

  1. 芯片VS(引脚4)供电的电压不允许超过46V,也不允许低于逻辑电平+2.5V,而我们的VSS供电为5V,VS供电为12V,满足了L298N芯片的供电需求。
  2. 再考察ViL与ViH,Arduino波形数字信号输出为1 (5V)/0 (0V),比ViL的最大值低,比ViH的最小值大,因此通过Arduino的数字端口能够实现Input口的高低控制;
  3. 对于Ven口做同样的分析,与2相同,很容易得出相同的结论。此外,应当注意的是,对于L298芯片,最大的PWM波频率为40kHz,Arduino输出的PWM波频率980Hz,能够满足相应的EN口的控制需求。
    到此为止,我们简单介绍了一下L298芯片是如何应用的,以及说明了Arduino确实可以控制L298芯片。接下来我们将对L298驱动电机的过程进行说明。

第二章 L298工作原理

在这里插入图片描述
我们以左半侧为例,右半侧是相同的。现从左上角看起。左上角为VSS输入端(Pin9),输入给了Vref方框,为芯片的逻辑控制单元提供逻辑电平参考(reference)。再往下看,是一个逻辑“与”门。可以看到,逻辑“与”门有两个输入。逻辑与门的作用是:输出两个输入的逻辑与结果,当输入均为1(高电平)时,输出为1(1&1=1);当二者中至少有一个0(低电平)时,输出就为0(0&X=0,X表示0或者1)。再看两个逻辑“与”门的一个脚都接了EnA,这说明当EnA被置低(或称为拉低、写低)时,两个逻辑门都输出低电平。也就是三极管的基极被置低,在此电路中三极管截止,不具有电流放大的作用(这只是通俗的说法!详细内容详见模电的课本),从而也无法驱动电机运行。
当EnA为高电平时(即使能芯片,应当注意,不是所有芯片都是高电平代表使能!),与门的输出情况与In1/In2相同。当In1接高电平,In2接低电平时,可以画出电流的流向如图4所示,此时电机正转。要使电机反转,只需要将In1与In2的极性调转即可。
总结一下,要使得电机上有电流通过,需要:1. En口输入高电平;2. In1与In2口极性相反。此时配置的L298芯片只能够实现恒速驱动的功能,要想实现调速功能,请看下一部分“L298调速策略”

第三章 L298调速策略

所有调速策略的归结起来无非两种:调电流、或者调通电时间。而在L298的使用中,VSS、VS是固定的,En,Input口要么为高(5V),要么为低(0V),不易实现电流的调控 (事实上,可通过SENSE A/B引脚来监控电流,这是面向更高级的应用,在此不赘述)。通电的时间可通过改变逻辑“与”门输入端的高低电平时序(即高低电平的时间顺序,包括了持续时间及一个周期内的高低电平比例)来实现控制。
在这里插入图片描述

  1. 通过往En口加数字输出的PWM来调节电机转速:
    核心思想是通过一个PWM周期内的En引脚高低来控制电机输出电流的有无。显然,一个周期内75%时间通电和一个周期50%时间通电相比,75%的通电时间更长,有效功率更大,宏观表现就是速度更快。
  2. 通过往其中一个In口加数字输出的PWM来调节电机转速:
    与1的思想类似。当两个In同极性时,电机上没有电流通过,自然也不会工作。通过调节其中一个In口一个周期内的高低情况,也能够实现输出的通断。
  3. 为何往En口加模拟电压不能够调节电机转速:
    看到这里,相信大家已经明白了。往En口加不同的电压,逻辑“与”门的输出有且只有两种情况:情况1:比阈值高,输出同In口;情况2:比阈值低,输出低电平。所以,假设Arduino板能够输出可调的直流电压并输入En端口,0-阈值电压模拟电压输入都被识别为情况1,阈值电压-5V(模拟电压最大输出为5V) 模拟电压输入都被识别为情况2。表现出来的现象就是电机转与不转,而无法实现调速。应当注意,Arduino的Analog端口只允许输入Analog信号,而不允许输出Analog信号,analogWrite函数的数值>128时,输出高电平,<128时输出低电平。
    Tips:为了实现更大的电流输出,可考虑将两个输出并联起来使用,这样允许输出两倍的单通道电流。示例如下。
    在这里插入图片描述
    如果对电机功率、电池驱动能力、线宽的因素没有详细研究,不建议如此使用!烧坏电机、电池、引发火灾概不负责!

第四章 关于模拟输出与PWM输出的进一步说明

AnalogWrite函数在官方参考手册中的描述如下:
Writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call to analogWrite(), the pin will generate a steady square wave of the specified duty cycle until the next call to analogWrite() (or a call to digitalRead() or digitalWrite() on the same pin). The frequency of the PWM signal on most pins is approximately 490 Hz. On the Uno and similar boards, pins 5 and 6 have a frequency of approximately 980 Hz. Pins 3 and 11 on the Leonardo also run at 980 Hz.
On most Arduino boards (those with the ATmega168 or ATmega328), this function works on pins 3, 5, 6, 9, 10, and 11. On the Arduino Mega, it works on pins 2 - 13 and 44 - 46. Older Arduino boards with an ATmega8 only support analogWrite() on pins 9, 10, and 11.
The Arduino Due supports analogWrite() on pins 2 through 13, plus pins DAC0 and DAC1. Unlike the PWM pins, DAC0 and DAC1 are Digital to Analog converters, and act as true analog outputs.
You do not need to call pinMode() to set the pin as an output before calling analogWrite().
The analogWrite function has nothing to do with the analog pins or the analogRead function.

在这里插入图片描述
简而言之,analogWrite函数就是用于生成PWM波,通过其占空比的变化来实现有效电压的调节 (255代表100%为高电平,有效电压就是5V;128代表50%为高电平,有效电压为2.5V)。若能外加DAC(数模转换器),就能够实现真正意义上直流2.5V输出。Arduino Mega与Arduino Uno板上都没有DAC,而Arduino Due板上有两个DAC,故Arduino Mega与Arduino Uno只能实现有效电压为XX的直流输出,而Arduino Due能够实现直流输出。
大家可能以为通过analogWrite函数控制analog端口后就输出了直流电压,但恰恰相反,analog端口既不能输出可调的直流信号,也不能像digital端口那样输出PWM波。他只能输出5V/0V(要么全是5V,要么全是0V)的直流电压。
总结一下,对于mega与uno板,analog端口只能测量输入的模拟信号大小,而不能输出幅度可调的直流信号,甚至不能像digital端口一样输出一个有高有低的PWM波。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值