作為電子愛好者,我們常常依靠一些儀表或儀器來測量和分析電路。從簡單的萬用表到復雜的功率分析儀或DSOs,所有的儀表都有它們自己獨特的用途。這些儀表的大部分都有成品,我們可以根據特定的需要來購買。有時我們可能會想自己制作一個儀表。例如,當我們準備做一個太陽能光伏項目時,我們想計算負載的功耗,在這種情況下,我們就可以用一個像Arduino這樣的微控制器平臺來構建我們自己的功率計了。
構建自己的功率計不僅可以降低成本,還可以為我們提供更深入了解開發測試功能的途徑。例如,使用Arduino的功率計可以很容易地調整串口監視器上的監控結果,可以在串口上繪制圖形,可以添加SD卡在預定義的時間內自動記錄電壓、電流和功率的數值。
功率計材料清單
Arduino Nano
LM358運放
7805
LCD1602
0.22歐姆2瓦電阻
10k可調電阻
10k,20k,2.2k,1k電阻
0.1uF電容
測試負載
面包板
功率計電路圖
下面是arduino功率計項目的完整電路圖:
為了便于理解,我們把arduino功率計電路被分為兩個部分。電路的上半部分是測量單元,電路的下半部分是計算和顯示單元。該電路測量范圍適合于0-24V,考慮到太陽能光伏電池的規格,電流為0-1A。電路的基本原理是通過測量負載的電流和電壓,從而計算出負載所消耗的能量,并將測量值顯示在1602顯示器上。
下面,我們再把電路分成多個功能塊進行介紹,這樣我們就能更清楚地了解電路是如何工作的。
測量單元
測量單元包含一個分壓器可以幫助我們測量電壓;一個非反向的運算放大器幫助我們測量通過電路的電流。上述電路的分壓部分如下所示:
這里輸入電壓是由Vcc表示的,就像前面說的,我們正在設計從0到24V的電壓范圍的電路。但是像Arduino這樣的微控制器無法測量如此高的電壓值,它只能測量0-5v的電壓。因此,我們必須將0-24v的電壓(轉換)到0-5v。這因此我們通過使用一個分壓電路來實現,如下所示。10k和2.2k電阻形成了分壓電路,用下面的公式可計算出分壓器的輸出電壓。
Vout = (Vin × R2) / (R1 + R2)
電路圖中標記為Voltage的電壓可以從兩個電阻中間獲得,這個轉換后的電壓就可以被輸入到Arduino的模擬針中。接下來就是電流測量單元,我們知道微控制器只能讀取模擬電壓,所以我們需要將電流的值轉換成電壓。這時,可以通過在電路中添加一個電阻(并聯)來實現,根據歐姆定律,它會降低電壓值,這與流過它的電流成正比。這樣獲得的值會非常小,所以我們用一個運算放大器來放大它。電路如下所示:
分流電阻(SR1)的值是0.22歐姆。就像之前說的,我們設計的是0-1A的測量電路,基于歐姆定律,我們可以計算出這個電阻的電壓降,當最大的1A電流通過負載時,它的電壓會在0.2V左右。這個電壓對于微控制器來說是非常小的,我們使用一個運算放大器來將電壓從0.2V放大到到更高。這個放大器的增益是21,所以0.2*21=4.2v。計算運算放大器增益的公式如下所示:
Gain = Vout / Vin = 1 + (Rf / Rin)
在例子中,Rf的值是20k而Rin的值是1k,這樣我們就能獲得21的增益值。然后,將放大器的放大電壓輸入到一個由電阻1k和電容0.1uf組成的的RC濾波電路,過濾掉耦合噪聲。最后,將得到的電壓輸入到Arduino模擬針上。
測量單元最后的部分是電壓調節電路。由于實際輸入的電壓可能是可變的,而Arduino和運算放大器需要一個穩定的+5V來保證正常工作,因此我們用7805穩壓模塊并添加一個噪聲電容來進行電壓調節。電路如下:
計算和顯示單元
在測量單元中,我們將電壓和電流參數轉換成了0-5v,使之可以用在Arduino模擬輸入上。現在,我們需要將這些電壓信號與Arduino連接起來,并將1602液晶顯示器連接到Arduino上,這樣我們就可以查看最終結果了。
如上圖所示,Voltage針與Arduino模擬針A3相連,而Current針連接到Arduino模擬針A4,1602液晶顯示器的電源來自于7805輸出的+5 V,同時將1602其它信號針與Arduino的數字數字針相連,以4-bit模式工作,同時我們使用了一個電位計(10 k)連接到1602的 Con 針用來調節LCD的對比度。
Arduino編程部分
硬件部分討論結束后,現在輪到軟件部分了。軟件部分代碼的基本思路是讀取A3和A4上的模擬電壓,并計算電壓、電流和功率值,最后將其顯示在LCD屏幕上。下面我們將代碼分割成小段來解釋。和所有Arduino程序一樣,開始都是定義使用的引腳。在本例中,A3和A4針分別用于測量電壓和電流,數字針3,4,8,9,10和11用于與Arduino進行交互。
int Read_Voltage = A3;
int Read_Current = A4;
const int rs = 3, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11; //1602 LCD 連接針
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
included一個名為“liquid crystal”的頭文件。然后setup 函數中,初始化LCD顯示屏,并將串口顯示文本設置為“Arduino Wattmeter”,然后等待兩秒鐘。代碼如下所示:
void setup() {
lcd.begin(16, 2); //Initialise 16*2 LCD
lcd.print(“ Arduino Wattmeter”);
lcd.setCursor(0, 1);
lcd.print(“-Circuitdigest”);
delay(2000);
lcd.clear();
}
在主循環函數中,我們使用analogread函數來讀取A3和A4的電壓值。我們知道Arduino ADC的輸出值是0-1203,因為它有一個10位的ADC,這個值必須被轉換成0-5v,可以通過乘以(5/1023)來完成。在硬件介紹部分,我們已經完成從0-24v到0-5v的電壓轉換,以及0-1a到0-5v的轉換。所以現在我們要用一個乘數把這些值恢復到實際值。可以通過將其與乘數值相乘來完成。乘數的值可以用硬件部分提供的公式來計算,或者如果你已知電壓和電流值,你可以實際計算它。本例遵循了后一種選擇,因為它在現實中往往更準確。所以乘數的值是6.46和0.239。因此,代碼如下所示:
float Voltage_Value = analogRead(Read_Voltage);
float Current_Value = analogRead(Read_Current);
Voltage_Value = Voltage_Value * (5.0/1023.0) * 6.46;
Current_Value = Current_Value * (5.0/1023.0) * 0.239;
如何提高測量精度?
上述計算實際電壓和電流值的方法可以很好地工作。但是也有一個缺點,那就是測量的ADC電壓和實際電壓之間的關系不是線性的,因此得到的結果不會非常精確。為了提高精確度,我們可以用已知的一組值來建立測量的ADC值的集合,然后利用這些數據,使用線性回歸方法推導出乘數方程。一旦我們計算出了實際電壓和實際電流值,我們就可以用公式計算出功率(P=V*I)。然后使用下面的代碼在LCD上顯示這三個值。
lcd.setCursor(0, 0);
lcd.print(“V=”); lcd.print(Voltage_Value);
lcd.print(“ ”);
lcd.print(“I=”);lcd.print(Current_Value);
float Power_Value = Voltage_Value * Current_Value;
lcd.setCursor(0, 1);
lcd.print(“Power=”); lcd.print(Power_Value);
完整測試代碼
/*
* Wattmeter for Solar PV using Arduino * Dated: 2-10-2018 * Website: www.basemu.com * Translation to:circuitdigest.com * Power LCD and circuitry from the +5V pin of Arduino whcih is powered via 7805 * LCD RS -> pin 2 * LCD EN -> pin 3 * LCD D4 -> pin 8 * LCD D5 -> pin 9 * LCD D6 -> pin 10 * LCD D7 -> pin 11 * Potetnital divider to measure voltage -> A3 * Op-Amp output to measure current -> A4 */ #includeint Read_Voltage = A3; int Read_Current = A4; const int rs = 3, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); void setup() { lcd.begin(16, 2); lcd.print(" Arduino Wattmeter"); lcd.setCursor(0, 1); lcd.print(" With Arduino "); delay(2000); lcd.clear(); } void loop() { float Voltage_Value = analogRead(Read_Voltage); float Current_Value = analogRead(Read_Current); Voltage_Value = Voltage_Value * (5.0/1023.0) * 6.46; Current_Value = Current_Value * (5.0/1023.0) * 0.239; lcd.setCursor(0, 0); lcd.print("V="); lcd.print(Voltage_Value); lcd.print(" "); lcd.print("I=");lcd.print(Current_Value); float Power_Value = Voltage_Value * Current_Value; lcd.setCursor(0, 1); lcd.print("Power="); lcd.print(Power_Value); delay(200); }
-
功率計
+關注
關注
2文章
222瀏覽量
30249 -
Arduino
+關注
關注
188文章
6481瀏覽量
189440
發布評論請先 登錄
相關推薦
使用Arduino構建一個數字羅盤
如何使用Arduino和OLED設計一個GPS車速表

如何制作一個Arduino pH計

使用RDA5807構建一個Arduino FM收音機

如何使用MPU6050和Arduino構建一個數字量角器

如何使用加速度計構建一個基于Arduino的地震探測器

評論