該存儲庫包含Arduino的Truerms C ++庫。使用此庫,可以計算ADC輸入信號的平均值和RMS (根平方)或有效值。該庫還計算了來自電壓和電流輸入信號的實體,明顯的功率和功率因數。從1.3版中,該項目添加了能量計量。
通過使用適當的輸入電路將測得的數量縮放到ADC的0-5V兼容電壓範圍內,可以用ARDUINO的ADC來測量電流的電壓和電壓表示。提供的解決方案使用一種簡單的方法來縮放測得的數量。用戶只需要定義AC輸入電壓和電流的全尺度峰值峰值值。當測得的數量的單元以伏特和安培定義定義時,計算出的功率為瓦特,而能量為ws(焦耳)。該庫很容易移植到其他平台。
實施以下圖書館類:
AverageRmsRms2PowerPower2平均計算來自ADC的許多輸入樣本(通常)的平均值。 RMS或RMS2旨在計算信號和功率或功率2的根平方值旨在計算電壓和電流輸入的功率。
RMS2和Power2在中斷服務程序中使用時的性能更好,通過在示例時間插槽中擴散處理負擔。一個RMS採集運行(掃描)的樣本數量定義為窗口。當自動基線恢復選項(BLR_ON)時, RMS2和Power2佔據了一個額外的樣本時間插槽(窗口長度+1)。
存在以下方法:
begin()start()stop()update()update1()update2()publish() 要快速啟動,請檢查庫隨附的示例Arduino草圖。
這些是成功實施的步驟:
begin() 。此方法用於初始化,它需要輸入以設置測量單元的縮放,採樣窗口的大小,所使用ADC的位數(或輸入信號)和採集模式(連續掃描/單掃描)。start()開始收購。update() (或update1() + update2() for Power2 )以恆定的速率重複。publish()獲取結果。對於Power2類update(),將其分解為update1()和update2() 。必須首先調用update1()以從輸入電壓和update2()處理樣本,以從輸入電流或VICA VECA(電壓電流)處理樣品。採樣電壓和電流通常用於多路復用ADC。
對於班級的平均用途:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
和:
range是交流輸入信號的最大預期全擺動(峰值峰值值)。window以整體樣品表示樣品窗口的長度。nob是輸入信號(ADC位深度)的位分辨率。使用預定義常數: ADC_8BIT , ADC_10BIT或ADC_12BIT 。mode將模式設置為連續掃描或單掃描。使用預先的常數CNT_SCAN或SGL_SCAN 。 void start(void);該方法開始採集連續掃描和單掃描模式。
void stop(void);此方法停止了收購。
void update(int instVal);分配當前的樣本值。
void publish(void);從上次完成的收購運行中發布結果。結果在下一定義的輸出變量中。
公共定義的變量是:
int instVal最後獲得樣品的值
float average - 平均值結果
bool acquire - 狀態位,在掃描尚待審查時為真。
對於類RMS或RMS2使用:
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
和:
range是交流信號的最大預期如圖(峰值峰值值)。window以整個樣本表示樣本窗口的長度。nob是輸入信號的位分辨率,通常這是ADC位深度。使用預定義常數: ADC_8BIT , ADC_10BIT或ADC_12BIT 。blr設置自動打開或關閉的基線恢復功能。使用預先的常數BLR_ON或BLR_OFF 。mode將模式設置為連續掃描或單掃描。使用預先的常數CNT_SCAN或SGL_SCAN 。 void start(void);該方法開始採集連續掃描和單掃描模式。
void stop(void);此方法停止了收購。
void update(int instVal);分配當前的樣本值。
void publish(void);從上次完成的收購運行中發布結果。結果在下一定義的輸出變量中。
公共定義的變量是:
int instVal最後獲得的樣品的值,當BLR_ON恢復為基線
float rmsVal RMS值結果
int dcBias ADC -units中的DCBIAS值。僅在blr_on時相關
bool acquire - 狀態位,如果掃描待定,則為真實
用於班級功率使用:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
和:
range1, range2是電壓和電流的交流信號(峰值峰值值)的最大預期全擺動。window以整個樣本表示樣本窗口的長度。nob是輸入信號的位分辨率,通常這是ADC位深度。使用預先限制的常數: ADC_8BIT , ADC_10BIT或ADC_12BIT 。blr設置自動打開或關閉的基線恢復功能。使用預先的常數BLR_ON或BLR_OFF 。mode將模式設置為連續掃描或單掃描。使用預先的常數CNT_SCAN或SGL_SCAN 。 void start(void);該方法開始採集連續掃描和單掃描模式。
void stop(void);此方法停止了收購。
void update(int instVal1, int instVal2);一次分配當前的樣品值(例如電壓和電流)。
void publish(void);從上次完成的收購運行中發布結果。結果在下一定義的輸出變量中。
公共定義的變量是:
int instVal1最後獲得的樣品(電壓)的值,恢復為blr_on時基線
int instVal2最後獲得的樣品(當前)的值,當Blr_on時還原為基線
float rmsVal1 -rms value1(電壓)
float rmsVal2 -rms value2(當前)
int dcBias1 ADC -units中的DCBIAS1值。僅在blr_on時相關
int dcBias2 adc -units中的dcbias2值。僅在blr_on時相關
float apparentPwr - 明顯的力量
float realPwr真正的力量
float pf功率因數
float energy - 淨能量
bool acquire - 狀態位,如果掃描待定,則為真實
對於類Power2使用:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
和:
range1, range2是電壓和電流的交流信號(峰值峰值值)的最大預期全擺動。window以整個樣本表示樣本窗口的長度。nob是輸入信號的位分辨率,通常這是ADC位深度。使用預先限制的常數: ADC_8BIT , ADC_10BIT或ADC_12BIT 。blr設置自動打開或關閉的基線恢復功能。使用預先的常數BLR_ON或BLR_OFF 。mode將模式設置為連續掃描或單掃描。使用預先的常數CNT_SCAN或SGL_SCAN 。 void start(void);該方法開始採集連續掃描和單掃描模式。
void stop(void);此方法停止了收購。
void update1(int instVal);為電壓分配當前的樣本值。
void update2(int instVal);為當前的當前示例值分配。在採樣循環中交替調用update1()和update2() 。
void publish(void);從上次完成的收購運行中發布結果。結果可從下一定義的輸出變量獲得。
公共定義的變量是:
int instVal1最後獲得的樣品(電壓)的值,恢復為blr_on時基線
int instVal2最後獲得的樣品(當前)的值,當Blr_on時還原為基線
float rmsVal1 -rms value1(電壓)
float rmsVal2 -rms value2(當前)
int dcBias1 ADC -units中的DCBIAS1值。僅在blr_on時相關
int dcBias2 adc -units中的dcbias2值。僅在blr_on時相關
float apparentPwr ,明顯的力量
float realPwr真正的力量
float pf功率因數
float energy - 淨能量
bool acquire - 狀態位,如果掃描待定,則為真實
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
論點的意思是:
完整的ADC範圍(0至5伏)表示信號峰值峰值值為700V。對於正弦波,這等於350V或247.5VRM的信號振幅。
RMS窗口為40個樣品,這意味著當以1000個樣本/秒選擇採樣率時,窗口覆蓋了兩個50Hz週期。
ADC位分辨率為10位(Arduino Uno)。
BLR_ON意味著基線修復已打開。為了捕獲ADC的交流信號,必須通過添加與ADC輸入電路的DC偏移電壓,將信號的零值轉移到ADC範圍的中點。之後,必須通過從獲得的ADC值中減去恆定值來糾正此偏移量。可以使用BLR_ON自動進行此校正,並且不需要校準。在圖1中,藍線表示最大縮放輸入信號,電壓搖擺為5V,並在2.5V上偏置。綠線顯示一個振幅為1V的輸入信號,並測量1V/sqrt(2)= 0.71VRM。

使用選項CNT_SCAN,採集設置為連續模式。完成最後一次掃描後,該收購將自動重新啟動。
致電gridVolt.update(adcVal);從主循環或中斷服務例程(ISR)。確保循環以恆定速率重複。
使用gridVolt.publish()獲取結果並獲得RMS值: float Voltage = gridVolt.rmsVal;
void loop() { // loop must run at 1kHz
...
adcValue = analogRead(AN0); // read the ADC.
gridVolt.update(adcValue);
counter++;
if(counter >= 500) { // publish every 0.5s
gridVolt.publish();
Voltage = gridVolt.rmsVal;
counter = 0;
}
...
while(loop_timer_not_expired) {1}
...
}
Measure_avg.ino此示例顯示瞭如何計算用ADC測量的信號的平均值。
Measure_rms.ino在此示例中,確定ADC輸入電壓的RMS值。
AC_powermeter.ino此示例演示了完整的AC -Power測量應用。它需要在兩個ADC通道上的輸入,電壓和電壓表示。它計算電壓和電流的RMS值,明顯的功率,實際功率和功率因數。
AC_powermeter_advanced.ino此示例還展示了完整的AC -Power測量應用程序。它以中斷為基礎,以獲得更好的穩定讀數。電壓和電流均在3kHz處採樣。當Arduino LED點亮時,ADC夾(輸入峰值電壓過高)或直流偏置範圍之外。
Energy_metering.ino顯示WH中的電壓,電流,實際功率和淨能量。
與Arduino ADC接口AC高電壓的最簡單方法是使用電壓傳感器,例如來自LEM USA Inc.的LV 25-P 25-P電壓傳感器。該換能器提供鍍鋅隔離,縮放和水平的速度和電平轉換。對於當前的感應, LEM還製造了LEM_LA55-P ,具有與電壓傳感器相同的優勢。
如果一個人更喜歡從離散組件中構建輸入縮放電路,則屬於Texas Instruments Incorporated的電壓源代碼逆變器參考設計的應用程序Note Note tiduay6c.pdf中給出了詳細的設計描述。請注意警告!提議的電路很容易適應Arduino的0-5V範圍。
在任何時候,都使用隔離變壓器來安全!
3相功率測量。
通過使用替代的Arduino-ide Sloeber,在開發此庫中節省了很多時間。 Sloeber是Eclipse的精彩Arduino插件。感謝Jantje及其貢獻者!