Arduino 使用 SCT013 量電流(ADS1115)
量電流方式有串聯方式與非接觸式,一般非接觸式都是使用霍爾電流感應方式量測,但因為使用感應電流方式取得一定比率的電流再回推實際值,這會因為環境因素影響準確性,但非接觸式有個好處如其名稱一樣,我們不需要變更線路設計就能量測到電流此篇為Arduino 使用 SCT013 量電流進階版本,主要是加上16位元解析度的ADC模組,及差分輸入解決電流只能只能量超過0.5A。
準備工作
下面列出硬體方面的準備工作如下:
Arduin UNO
SCT013
ADS1115
這是一款4通道 ADS1115 16位元解析度ADS類比轉數位模組,細節規格可以參考Adafruit ADS1115或是TI官網ADS1115
此次是要利用它具有差分輸入的方式輸入具有正負波型的資訊,省掉像Arduino 使用 SCT013 量電流文中需要增加提升電壓的電路,加上高解析度16位元可以讓量測的電流更精確。
SCT013 with ADS1115 for Arduino 電路
SCT013輸出是電流的方式,但ADS1115 IN是量電壓方式,所以需要另外接電路將電流轉換成電壓,而且電流帶有正負電壓的正弦波,最後會以差分輸入的方式取得轉換值:
實際連接如下:
安裝 Adafruit ADS1X15 Library
下載Adafruit_ADS1X15,解壓後安裝至Arduino的Library中,成功的話可以看到如下圖:
如果不清楚Library怎麼下載及安裝可以參考Arduino遙控大金(daikin)冷氣中的下載Arduino_IRremote_Daikin
說明。
撰寫範例程式
範例程式如下,將它貼至新建的專案
//-----------start----------- // #include <Wire.h> #include <Adafruit_ADS1015.h> Adafruit_ADS1115 ads; // double sqI,sumI; double sampleI; double Irms; double squareRoot(double fg) { double n = fg / 2.0; double lstX = 0.0; while (n != lstX) { lstX = n; n = (n + fg / n) / 2.0; } return n; } double calcIrms(unsigned int Number_of_Samples, float multiplier,double ical) { for (unsigned int n = 0; n < Number_of_Samples; n++) { sampleI = (double)ads.readADC_Differential_0_1(); sqI = sampleI * sampleI; sumI += sqI; } Irms = squareRoot(sumI / Number_of_Samples) * multiplier * ical; sumI = 0; //-------------------------------------------------------------------------------------- return Irms; } void setup() { Serial.begin(115200); Wire.begin(); /* ADS1115 @ +/- 4.096V gain (16-bit results) 0.125mV Step*/ ads.setGain(GAIN_ONE); ads.begin(); Serial.println(); Serial.println("current meter"); } void loop() { double Irms = calcIrms(64, 0.125F,4.5) / 100; Serial.print(Irms*110.0); // Apparent power Serial.print(" "); Serial.println(Irms); // Irms delay(1000); } //------------end------------
電流計算使用calcIrms
Function,參數依序為:
取樣次數 輸入為64以上階行,愈小速度愈快
解析度最小電壓 依照ADS115的模式來決定解析度最小電壓,Library範例中所提示:
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
Danny使用GAIN_ONE
,所以解析度最小電壓為:0.125mV。
- 校正值,範例使用
4.5
,使用時可以利用勾表配合調整該數值大小,例如:先將校正值輸入1,再依照勾表量出的值/量電流輸出大小
所得的值為校正值輸入。
輸出結果:
左邊數據為使用計算後使用的瓦數(W),右邊值為電流大小(A)
注意事項
如果你量測的電流小於60A,可以更換成100歐姆的電阻讓ADS1115讀取電壓的範選大一點會更準。
參考資料
使用前可以看一下如何使用鉤錶來量測電流?
影片了解勾表型的互感器使用方式:
Arduino ADS1115 Module Getting Started Tutorial
ADS1115 Module with CT/Grove Connectors from whatnick on Tindie
更新資訊
日期 | 內容 |
---|---|
2016/12 | 新增文章 |