我正在使用arduino Uno通过简单的1/3电阻分压器读取A0引脚的电压(5v适用于分压器,A0获得5v的1/3)。有一个继电器连接到D1引脚。
(我最终的目标是测量15v,这就是使用分压器诊断问题的原因)
我注意到当继电器打开时,A0读数高于应有的值。我不确定原因是什么,并且喜欢理解它。
有关电路的说明:
A0:用于测量电压的模拟引脚。
D1:用于控制继电器的数字引脚。
电阻分压器:R1 = 2k,R2 = 1k。 R1连接到5v(arudino Uno 5v输出)。 A0连接到R2,因此,A0应该得到5v的1/3,即1.67v。
很少有测量来诊断问题:
Vmesaure_all:R1 + R2上的手动电压测量值。
Vmeasure_r1:仅对R2进行手动电压测量,即A0的输入电压。
Vcode_r1_A0:arduino A0模拟读取。
A)接力已关闭:
Vmeasure_r1 = 1.67v(1.67 * 3 = 5.01)
Vmesaure_all = 5.03v
Vcode_r1_A0 = 339(339 * 3 = 1017)
以上所有都是有道理的。
B)接力开启:
Vmeasure_r1 = 1.63v(1.63 * 3 = 4.89v。确定。因为它与Vmesaure_all几乎相同所以有意义)
Vmesaure_all = 4.91v(继电器是负载,如果测量R1 + R2的电压会使电压下降。我认为是预期的)
Vcode_r1_A0 = 345(为什么高于339,这是继电器A0读取??? )
我无法解释这一点。如果使用此值计算R1 + R2上的电压,则与继电器关闭相比,您将获得更高的电压(要测量的电压)。
我希望Vcode_r1_A0是< 339。
我做了很少的实验,并且上面描述了一致的行为。为什么呢?
答案 0 :(得分:2)
是的,这些数字是有道理的。模数转换器(ADC)本身不是绝对电压表。 ADC具有参考电压并且正在计算相对于该参考电压的数字值。 Arduino通过函数analogReference()
为您提供参考电压选择默认行为是模拟参考是电源电压引脚,标称值为5.0 V.但这会导致您的问题:
If Vcc changes while the analog input stays the same, the digital value changes.
If Vcc drops, the digital value will increase.
换句话说,ADC只能与其参考电压一样精确。
ATmega芯片的电压基准不随Vcc变化。如果设置INTERNAL参考,则满量程1024数字现在为1.1 V。
analogReference(INTERNAL);
x = analogRead(A0);
// now x = 1024 is A0 = 1.1 V
使用此代码,数字值将更准确,对Vcc不敏感。权衡是满量程范围大大降低到1.1 V.为了适应这个缩小的范围,您需要添加一个分压器。因为您已经打算这样做,所以应该使用内部参考并调整分频器的电阻值。
但是,你将Vcc降低0.1 V!你注意到芯片是热的还是燃烧的气味?确认继电器线圈汲取的电流是否在引脚的额定值范围内。通常,人们使用晶体管或驱动器芯片(例如ULN2003)为继电器负载供电。还要注意,将继电器和电机等感应负载直接连接到数字引脚会因为关闭线圈时的反激电压而破坏这些引脚。