電流計 Ammeter Unit を使ってみた
jun-fu@bitengineers です。
去年の記事で植物発電や太陽光発電を試しています。発電量を把握することが重要なので、最近は電圧や電流をどう測るかという点に個人的感心が高まってます。
そんな折、ふと m5stack のストア を久しぶりに眺めてみたら Ammeter Unit という電流計が目に付いたので購入してみました。
今後活用できそうなので仕様や機能について書いておきたいと思います。
製品仕様
計測可能電流値 +4A/-4A、誤差 0.1%/FS、分解能 0.3mA とあるので、IoT ガジェットなどの趣味の範囲であれば十分な仕様だと思います。
ブロック図にあるように、基本的な動作原理は
電流が流れたときに 0.05Ωのシャント抵抗間に生じる電圧を ADC1115 で読み取り、I2C 通信越しに出力する
ようになってます。ただ、計測対象に電気的な影響を与えないようにADS1115 への電源として絶縁型 DC-DC の出力を用い、CA IS3020S という IC がI2Cも絶縁しているようです。
そして、ADS1115 の読み取り値に、EEPROM に書き込まれているファクトリキャリブレーション情報を用いて補正し精度を調整している、とあります。
ADS1115
Texas Instruments の 16bit A-D(Analog - Digital)変換 IC です。この製品の核と言っても良い部分がこの ADS1115 なので、ここを把握すれば大体の機能がわかります。個人的にも覚書としてざっくりと提供されている機能を列挙していきます。
起動
起動時は設定レジスタの初期値で起動し、起動直後は内部的には power-downの状態で A-D変換は行わない。I2C などのデジタル回路がアクティブ。
レジスタ
Address レジスタ: I2C での読み書き先のアドレスを書き込むのに使用する
Conversion レジスタ: A-D変換で得た値を格納する
Config レジスタ: 各種設定値を保持している
Threshold レジスタ: Lo/Hi しきい値。この製品では使用しない
Config レジスタは
OS(operational status or singleshot start)
MUX(input multiplexer config) この製品では使用しない
PGA(programmable gain amplifer)
MODE (singleshot or continuous)
DR(DataRate)
COMP_MODE (comparator mode) この製品では使用しない
COMP_POL (comparator polarity) この製品では使用しない
COMP_LAT (Latching comparator) この製品では使用しない
COMP_QUE (Comparator queue) この製品では使用しない
Comparator 系は ALERT pin 使用時の設定。この製品はAlert pin 未使用。
計測方法 (Mode)
Singleshot mode と Continuous mode があり、Singleshot mode は一回計測後 power-down になるので電力消費を抑えられる。連続的に計測する場合は Continuous mode を使用する。初期値は Singleshot modeで起動する。
Configレジスタの OS に1を書き込むか、MODE を Continuous mode にするとA-D変換開始する。
A-D変換で得られた値は Conversion レジスタに書き込まれている。
DataRate
内部でAD変換を行う速度を調整できる 8 ~ 860 SPS(sample / Sec)
860 SPS
475 SPS
250 SPS
128 SPS
64 SPS
32 SPS
16 SPS
8 SPS
FSR(Full Scale Range)
+-6.144V (LSB = 187.5uV)
+-4.096V (LSB = 125uV)
+-2.048V (LSB = 62.5uV)
+-1.024V (LSB = 31.25uV)
+-0.512V (LSB = 15.625uV)
+-0.256V (LSB = 7.8125uV)
EEPROM
Ammeter にはEEPROM が載っていて、工場出荷前にキャリブレーション情報が書き込まれているということで、ユーザは上書き非推奨。書き込んでしまうとキャリブレーション情報は失われます。
このキャリブレーション情報についてはコードがあるのでそこから読み取れます。
int16_t hope = 1;
int16_t actual = 1;
if (readCalibrationFromEEPROM(gain, &hope, &actual)) {
calibration_factor = fabs((double)hope / actual);
}
bool ADS1115::readCalibrationFromEEPROM(ADS1115Gain_t gain, int16_t* hope,
int16_t* actual) {
uint8_t addr = getPGAEEEPROMAddr(gain);
uint8_t buff[8];
memset(buff, 0, 8);
*hope = 1;
*actual = 1;
bool result = EEPORMRead(addr, buff, 8);
if (result == false) {
return false;
}
uint8_t xor_result = 0x00;
for (uint8_t i = 0; i < 5; i++) {
xor_result ^= buff[i];
}
if (xor_result != buff[5]) {
return false;
}
*hope = (buff[1] << 8) | buff[2];
*actual = (buff[3] << 8) | buff[4];
return true;
}
gain 毎にEEPROM 上のアドレスに書き込まれている "hope", "actual" 値を用いて "calibration_factor" を算出し、
return resolution * calibration_factor * getConversion() *
MEASURING_DIR;
上記のように計測した電流値の係数として用い補正している。
使ってみた所感
サンプルコードを動かしてみました。2A 付近で精度がでるような調整がされているのかのような画面ですが、なんとなくそれっぽい値が取れてます。
正確には精度を測ってませんが安定化電源でも試してみましたがそれっぽい値が取れてます。機材無くても ESP32 と、この Ammeter Unit があるだけで電流測れる、そんな気軽な用途が良いですね。
calibration_factor はちょっと謎が残りました。。
下記の図では PAG_4096 と PAG_256 が (Calibrated) とあるので、何かしら値が書き込まれているのかと思いきや、
PAG_4096, PAG_2048, PAG_256 の時は 1.0 でした。 PAG_512 では0.99937 など。。。
おわりに
それにしても、m5stack ストアは製品は多い。この Ammeter Unit はスイッチサイエンスでの発売日を見る限り "2020-12-07" とあるので、新製品ではないです。
見逃していたのか、もしくは視界には入っていても興味がなかったのか。。。
この記事が気に入ったらサポートをしてみませんか?