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 | 新增文章 |