在这篇文章中,我们将使用16 × 2液晶显示器和Arduino构建一个数字电流表。我们将了解使用分流电阻测量电流的方法,并实现基于Arduino的设计。所提出的数字电流表可以测量从0到2安培(绝对最大)的电流,具有合理的精度。
电流表的工作原理
有两种类型的电流表:模拟电流表和数字电流表,它们的工作原理是截然不同的。但是,它们有一个共同的概念:分流电阻器。
分流电阻器是在测量电流时,在源和负载之间有非常小的电阻的电阻器。
让我们看看模拟电流表是如何工作的,这样就更容易理解数字电流表了。
一个电阻R很低的分流电阻,假设有某种模拟表连接在电阻上,它的偏转与通过模拟表的电压成正比。
现在让我们从左边传递一些电流。i1为进入分流电阻R前的电流,i2为通过分流电阻后的电流。
电流i1将大于i2,因为它通过分流电阻降低了一小部分电流。分流电阻之间的电流差在V1和V2处产生非常小的电压。
电压的量将由那个模拟计来测量。
通过分流电阻产生的电压取决于两个因素:流过分流电阻的电流和分流电阻的值。
如果通过分流器的电流较大,产生的电压也就较大。如果分流器的值高,则分流器两端的电压发展就更大。
分流电阻必须是非常小的值,它必须具有较高的额定功率。
一个小值的电阻确保负载得到足够的电流和电压的正常运行。
同时,分流电阻必须具有较高的额定功率,以便在测量电流时能够承受较高的温度。通过分流管的电流越高,产生的热量就越多。
现在你应该已经了解了模拟电表的基本原理。现在让我们来看看数字设计。
现在我们知道,如果有电流流动,电阻器将产生电压。从图中V1和V2是点,我们将电压样本送到微控制器。
计算电压到电流的转换
现在让我们看看简单的数学,我们如何将产生的电压转换成电流。
欧姆定律:I = V/R
我们知道分流电阻器R的值,将其输入到程序中。
通过分流电阻产生的电压为:
V = v1 - v2
或
V = V2 - V1(测量时避免负号,负号取决于电流方向)
我们可以化简这个方程,
I = (v1 - v2)/ r
或
I = (v2 - v1)/ r
在代码中输入上面的一个方程,我们可以找到当前的流量,并将显示在LCD上。
现在我们来看看如何选择分流电阻器的值。
Arduino内置了10位模拟数字转换器(ADC)。它可以在0到1024步或电压水平检测从0到5V。
因此,这个ADC的分辨率将是5/1024 = 0.00488伏特或每步4.88毫伏。
所以4.88毫伏/2毫安(安培计的最小分辨率)= 2.44或2.5欧姆电阻。
我们可以使用4个10欧姆,2瓦特的电阻并联得到2.5欧姆,这是在原型中测试的。
那么,我们怎么能说拟议的电流表的最大测量范围是2安培。
ADC只能测量0到5 V。以上任何情况都会损坏微控制器中的ADC。
从测试原型中我们观察到,在两个模拟输入点V1和V2;当电流被测值X mA时,模拟电压读取X/2(在串行监视器中)。
例如,如果电流表读数为500毫安,串行监视器上的模拟值则为250步或电压水平。该ADC可以容忍1024步或5 V的最大,所以当电流表读取2000毫安,串行监视器读取约1000步。接近1024。
任何高于1024的电压水平都会损坏Arduino中的ADC。为了避免这一点,在2000毫安之前,警告信息将提示LCD说断开电路。
到目前为止,你应该已经了解了拟议中的电流表是如何工作的。
现在让我们来看看结构细节。
原理图:
提出的电路非常简单,初学者友好。按电路图施工。调整10K电位器以调整显示对比度。
您可以通过USB或9v电池直流插孔为Arduino供电。四个2瓦电阻将耗散热量均匀比使用一个2.5欧姆电阻8- 10瓦电阻。
当没有电流通过时,显示器可能会读取一些小的随机值,你可以忽略它,这可能是由于测量终端的杂散电压。
注意:不要颠倒输入负载的极性。
程序代码:
//------------------ 项目由R.GIRISH ------------------//
# include < LiquidCrystal.h >
#定义input_1 A0
#定义input_2 A1
液晶显示器(12,11,5,4,3,2);
int AnalogValue = 0;
int PeakVoltage = 0;
浮动AverageVoltage = 0;
float input_A0 = 0;
float input_A1 = 0;
Float output = 0;
浮动分辨率= 0.00488;
Unsigned long sample = 0;
Int threshold = 1000;
无效的设置()
{
lcd.begin(16日2);
Serial.begin (9600);
}
无效循环()
{
PeakVoltage = 0;
(样品= 0;示例< 5000;示例+ +)
{
AnalogValue = analogRead (input_1);
如果(PeakVoltage < AnalogValue)
{
PeakVoltage = AnalogValue;
}
其他的
{
delayMicroseconds (10);
}
}
input_A0 = PeakVoltage *分辨率;
PeakVoltage = 0;
(样品= 0;示例< 5000;示例+ +)
{
AnalogValue = analogRead (input_2);
如果(PeakVoltage < AnalogValue)
{
PeakVoltage = AnalogValue;
}
其他的
{
delayMicroseconds (10);
}
}
input_A1 = PeakVoltage *分辨率;
输出= (input_A0 - input_A1) * 100;
输出=输出* 4;
而(analogRead (input_A0) > =阈值)
{
lcd.clear ();
lcd.setCursor (0,0);
液晶显示器。打印(达到最大);
lcd.setCursor (0,1);
lcd.print(“限制! !”);
延迟(1000);
lcd.clear ();
lcd.setCursor (0,0);
液晶显示器。打印(“现在断开! !”);
延迟(1000);
}
而(analogRead (input_A0) > =阈值)
{
lcd.clear ();
lcd.setCursor (0,0);
液晶显示器。打印(达到最大);
lcd.setCursor (0,1);
lcd.print(“限制! !”);
延迟(1000);
lcd.clear ();
lcd.setCursor (0,0);
液晶显示器。打印(“现在断开! !”);
延迟(1000);
}
lcd.clear ();
lcd.setCursor (0,0);
液晶显示器。打印(“数字电流表”);
lcd.setCursor (0,1);
lcd.print(输出);
液晶显示器。打印(“马”);
系列。print(" voltage Level at A0 = ");
以analogRead (input_A0));
系列。print(" voltage Level at A1 = ");
以analogRead (input_A1));
以 ("------------------------------");
延迟(1000);
}
//------------------ 项目由R.GIRISH ------------------//
如果您对这个基于Arduino的数字电流表电路项目有任何具体的问题,请在评论区表达,您可能会得到快速的回复。
谢谢你的文章。我非常喜欢它们。不过,我对这个问题有一个小小的更正。基尔霍夫电流定律(KCL)告诉我们I1一定等于I2。
问候,
谢谢理查德,但是很抱歉你似乎曲解法律,根据基尔霍夫电流定律的电流的代数和电路网络中的一个结点总是零…因此i1和i2将肯定不同但代数和为零满足法律…我希望这是有意义的!
所示的分流电路中没有电流支路。只有一个电流流过分流电阻。因此,I1和I2是相同的。请更正邮寄内容。不管怎样,流过分流器的电流是V1-V2/R,其中R是分流电阻。arduino的草图是正确的。
这篇文章可能是考虑到这样一个事实:如果电流通过I1和接地用电流表检查,然后通过I2和接地,我们会发现电流的差异,其中I2读数将小于I1。
i = V /分流
这是一个很棒的教程。有没有一种方法可以测量较小的电流;在微安范围内?
你好,妮可,
谢谢,
不,你不能用这个电路测量微安,因为arduino有有限的ADC分辨率。
可能有外部模块,可以帮助你测量微安培。
问候
亲爱的兄弟,
请帮助我建立4通道电压表使用aurdrino uno板与LCD 16 x2(直接测量自动范围0至50v直流,没有任何选择开关,即0-5v和5-50v)
谢谢你!
(Deepak)
Hi Deepak,这个想法已经在很多网站上出现了,请搜索“4通道Arduino电压表”,你可以找到很多。
嗨赃物,
我试着构建这个电路,并上传代码到Arduino Uno,但目的只是在我的lcd上得到以下字体
nnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnn
并使用arduino uno上的LCD键盘屏蔽来瞄准。(arduinolearning.com/wp-content/uploads/2014/12/lcd-keypad-shield.jpg)