在这篇文章中,我们将使用 16 x 2 LCD 显示屏和 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 至 5V 的 0 至 1024 步长或电压电平。
因此,该ADC的分辨率为每步5/1024 = 0.00488伏或4.88毫伏。
因此,4.88 毫伏/2 mA(电流表的最小分辨率)= 2.44 或 2.5 欧姆电阻。
我们可以并联使用四个 10 欧姆、2 瓦的电阻器来获得在原型中测试过的 2.5 欧姆。
那么,我们怎么能说建议的电流表的最大可测量范围是 2 安培。
ADC只能测量0至5 V,即。上述任何情况都会损坏微控制器中的ADC。
从测试的原型中,我们观察到,在V1点和V2点的两个模拟输入处;当电流测量值为X mA时,模拟电压读取X/2(在串行监视器中)。
例如,如果电流表读数为 500 mA,则串行监视器上的模拟值读取 250 步或电压电平。ADC可承受高达1024步或最大5
V,因此当电流表读数为2000 mA时,串行监视器的读数约为1000步,接近1024步。
任何高于 1024 电压电平的内容都会损坏 Arduino 中的 ADC。为了避免这种情况,在2000
mA之前,LCD上将提示一条警告消息,指出断开电路。
到现在为止,您已经了解了建议的电流表的工作原理。
现在让我们继续讨论构造细节。
示意图:
建议的电路非常简单且对初学者友好。按照电路图构造。调整 10K 电位计以调整显示对比度。
您可以通过 USB 或带有 9 V 电池的 DC 插孔为 Arduino 供电。与使用一个 2.2 欧姆电阻器和 5-8 瓦电阻相比,四个 10
瓦电阻器将均匀散热。
当没有电流通过时,显示器可能会读取一些小的随机值,您可以忽略它,这可能是由于测量端子上的杂散电压。
注意:不要反转输入负载电源极性。
程序代码:
//------------------Program Developed by R.GIRISH------------------//
#include 《LiquidCrystal.h》
#define input_1 A0
#define input_2 A1
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int AnalogValue = 0;
int PeakVoltage = 0;
float AverageVoltage = 0;
float input_A0 = 0;
float input_A1 = 0;
float output = 0;
float Resolution = 0.00488;
unsigned long sample = 0;
int threshold = 1000;
void setup()
{
lcd.begin(16,2);
Serial.begin(9600);
}
void loop()
{
PeakVoltage = 0;
for(sample = 0; sample 《 5000; sample ++)
{
AnalogValue = analogRead(input_1);
if(PeakVoltage 《 AnalogValue)
{
PeakVoltage = AnalogValue;
}
else
{
delayMicroseconds(10);
}
}
input_A0 = PeakVoltage * Resolution;
PeakVoltage = 0;
for(sample = 0; sample 《 5000; sample ++)
{
AnalogValue = analogRead(input_2);
if(PeakVoltage 《 AnalogValue)
{
PeakVoltage = AnalogValue;
}
else
{
delayMicroseconds(10);
}
}
input_A1 = PeakVoltage * Resolution;
output = (input_A0 - input_A1) * 100;
output = output * 4;
while(analogRead(input_A0) 》= threshold)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Reached Maximum”);
lcd.setCursor(0,1);
lcd.print(“Limit!!!”);
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Disconnect now!!”);
delay(1000);
}
while(analogRead(input_A0) 》= threshold)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Reached Maximum”);
lcd.setCursor(0,1);
lcd.print(“Limit!!!”);
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Disconnect now!!”);
delay(1000);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“DIGITAL AMMETER”);
lcd.setCursor(0,1);
lcd.print(output);
lcd.print(“ mA”);
Serial.print(“Volatge Level at A0 = ”);
Serial.println(analogRead(input_A0));
Serial.print(“Volatge Level at A1 = ”);
Serial.println(analogRead(input_A1));
Serial.println(“------------------------------”);
delay(1000);
}
全部0条评论
快来发表一下你的评论吧 !