在這篇文章中,我們將使用 16 x 2 LCD 顯示屏和 Arduino構建一個數字電流表。我們將了解使用分流電阻器測量電流的方法,并實現基于Arduino的設計。所提出的數字電流表可以以合理的精度測量0至2安培(絕對最大值)的電流。
電流表的工作原理
電流表有兩種類型:模擬電流表和數字電流表,它們的工作原理彼此不同。但是,它們都有一個共同的概念:分流電阻器。
分流電阻器是在測量電流時在源極和負載之間放置電阻非常小的電阻器。
讓我們看看模擬電流表的工作原理,然后更容易理解數字電流表。
電阻R非常低的分流電阻器,假設電阻器上連接某種模擬儀表,其偏轉與通過模擬儀表的電壓成正比。
現在讓我們從左側傳遞一些電流。i1是進入分流電阻R之前的電流,i2是經過分流電阻后的電流。
電流 i1 將大于 i2,因為它通過分流電阻器損失了一小部分電流。分流電阻器之間的電流差在V1和V2處產生非常小的電壓。
電壓量將由該模擬儀表測量。
分流電阻器兩端產生的電壓取決于兩個因素:流過分流電阻器的電流和分流電阻器的值。
如果通過分流器的電流更大,則產生的電壓會更高。如果分流器的值很高,則分流器上產生的電壓更高。
分流電阻器必須非常小,并且必須具有更高的額定功率。
一個小值電阻器可確保負載獲得足夠的電流和電壓以正常工作。
此外,分流電阻器必須具有更高的額定功率,以便在測量電流時能夠承受更高的溫度。通過分流器的電流越高,產生的熱量就越多。
到現在為止,您已經了解了模擬儀表的工作原理。現在讓我們繼續(xù)數字設計。
到目前為止,我們知道如果有電流流動,電阻器將產生電壓。圖中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 歐姆電阻。
我們可以并聯(lián)使用四個 10 歐姆、2 瓦的電阻器來獲得在原型中測試過的 2.5 歐姆。
那么,我們怎么能說建議的電流表的最大可測量范圍是 2 安培。
ADC只能測量0至5 V,即。上述任何情況都會損壞微控制器中的ADC。
從測試的原型中,我們觀察到,在V1點和V2點的兩個模擬輸入處;當電流測量值為X mA時,模擬電壓讀取X/2(在串行監(jiān)視器中)。
例如,如果電流表讀數為 500 mA,則串行監(jiān)視器上的模擬值讀取 250 步或電壓電平。ADC可承受高達1024步或最大5
V,因此當電流表讀數為2000 mA時,串行監(jiān)視器的讀數約為1000步,接近1024步。
任何高于 1024 電壓電平的內容都會損壞 Arduino 中的 ADC。為了避免這種情況,在2000
mA之前,LCD上將提示一條警告消息,指出斷開電路。
到現在為止,您已經了解了建議的電流表的工作原理。
現在讓我們繼續(xù)討論構造細節(jié)。
示意圖:
建議的電路非常簡單且對初學者友好。按照電路圖構造。調整 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.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);
}
-
電流
+關注
關注
40文章
6846瀏覽量
132111 -
Arduino
+關注
關注
188文章
6468瀏覽量
186957 -
LCD顯示屏
+關注
關注
1文章
91瀏覽量
13297 -
數字電流表
+關注
關注
0文章
6瀏覽量
7468
發(fā)布評論請先 登錄
相關推薦
評論