M5Stack用ADCユニット v1.1 (U013-V11)

概要

ADC性能を調べるため本命のADCユニットを触ってみました。内蔵とEXT.IOは3.3Vまでの測定でしたがADCユニットは12Vまで測定可能です。

製品

M5Stack用ADCユニット v1.1
M5Stack用ADCユニット の後継品です。M5Stack用の16 bit ADコンバーターユニットで、自己校正機能を備えたADS1110を搭載、M5Stack本体内蔵のADコンバーターより低速ですが高分解能です。GROVE互換インターフ...

上記の製品になります。センサーがADS1100からADS1110に微妙に変わって、精度が向上しています。

普通のサイズのユニットで0Vから12Vまで計測可能です。

Groveコネクタは赤いのでI2Cですね。

測定するターミナルはHT3.96端子になります。国内だとあまり購入できないコネクタなので注意してください。

HT396K-3.96-2P Cixi Kefa Elec | C577777 - LCSC Electronics
HT396K-3.96-2P Cixi Kefa Elec UShttps://www.lcsc.com/product-detail/Pluggable-System-Terminal-Block_Cixi-Kefa-Elec-HT396K-3-96-2P_C577777.html.0733 - 250V 15A 2 1.5 1 14~28 3.96mm 1x2P Orange Plug P=3.96mm Pluggable System Termi...

たぶんこのへんの部品だと思いますが確認していません。

572.0¥ 5% OFF|15edgkのターミナルブロック、プラスチック配線プラグ、ht3.96、ht396k、ht3.96k、2p3p4p 12p、3.96mm、50個| | - AliExpress
Smarter Shopping, Better Living! Aliexpress.com

AliExpressだとこれかな。少ない量を安く売っているところはなかったみたいです。

利用してみる

#include "M5_ADS1100.h"

ADS1100 ads;

void setup(void) {
  Serial.begin(115200);
  Wire.begin(26, 32);

  ads.getAddr_ADS1100(ADS1100_DEFAULT_ADDRESS);
  ads.setGain(GAIN_ONE);
  ads.setMode(MODE_CONTIN);
  ads.setRate(RATE_8);
  ads.setOSMode(OSMODE_SINGLE);
  ads.begin();
}

void loop(void) {
  byte error;
  int8_t address = ads.ads_i2cAddress;

  Wire.beginTransmission(address);
  error = Wire.endTransmission();
  if (error == 0) {
    int16_t result;
    Serial.println("Getting Differential Reading from ADS1100");
    Serial.println(" ");
    result = ads.Measure_Differential();
    Serial.print("Digital Value of Analog Input between Channel 0 and 1: ");
    Serial.println(result);
    Serial.println(result / 32768 * 2048 / 100 * (510 + 100));
    char data[20] = { 0 };
    sprintf(data, "%d", result);
    Serial.println("-----------");
  } else {
    Serial.println("ADS1100 Disconnected!");
    Serial.println("-----------");
  }

  delay(1000);
}

ライブラリのスケッチ例ですとADC値までしか表示せず、実際の電圧への式が公開されていませんでした。回路図をみて「result / 32768 * 2048 / 100 * (510 + 100)」の変換式を作っています。

ADC値から電圧への変換方法

このセンサーは内部に2.048Vの基準電圧を持っています。その電圧が16ビットである32,767になると思われます。

m5-docs
The reference docs for M5Stack products. Quick start, get the detailed information or instructions such as IDE,UIFLOW,Ar...

上記に回路図があるので中身を確認します。

https://docs.m5stack.com/en/unit/Unit-ADC_V1.1

回路図を見ると入力を510kΩと100kΩの抵抗で分圧しています。そのため510+100の610分の100の電圧を計測していることになります。約0.16倍となります。つまり12Vを入力すると12*0.16で1.92VがADCに入ることになります。逆に計算すると2048/100*610 = 12.493VぐらいがADC上限値になる計算です。

「ADC値 / ADCMAX * 基準電圧 / 分圧抵抗2 * (分圧抵抗1 + 分圧抵抗2)」

上記を実際の数値に変換して

「result / 32768 * 2048 / 100 * (510 + 100)」

の計算式ができました。

SCPIへの組み込み

上記に組み込んで自動計測してみました。

  // Analog In(ADS RAW)
  scpi.RegisterCommand("ARADSIn?",
                       [](SCPI_C commands, SCPI_P parameters, Stream& interface) {
                         int16_t result = 0;
                         int8_t address = ads.ads_i2cAddress;
                         Wire.beginTransmission(address);
                         byte error = Wire.endTransmission();
                         if (error == 0) {
                           result = ads.Measure_Differential();
                         }
                         interface.println(result);
                       });

とりあえずはシンプルに取得のみしました。

計測

若干ずれがありますが、きれいに取れています。

入力電圧測定値ADC値
02260
1,0001,0322,707
2,0002,0365,342
3,0003,0417,979
4,0004,04710,616
5,0005,05313,256
6,0006,05915,893
7,0007,06418,530
8,0008,07121,170
9,0009,07623,807
10,00010,08126,444
11,00011,09129,092
12,00012,09731,730

データの抜粋です。若干オフセットがあるようでした。このへんは分圧を使っている関係で個体差がでてくると思います。

入力電圧ADC値無補正1Vでの補正値3Vでの補正値6Vでの補正値12Vでの補正値
060220000
1,0002,7071,0321,0001,0031,0031,003
2,0005,3422,0361,9952,0012,0022,001
3,0007,9793,0412,9923,0003,0013,001
4,00010,6164,0473,9883,9994,0004,000
5,00013,2565,0534,9854,9995,0015,000
6,00015,8936,0595,9815,9986,0005,999
7,00018,5307,0646,9786,9976,9996,998
8,00021,1708,0717,9757,9978,0007,999
9,00023,8079,0768,9718,9968,9998,998
10,00026,44410,0819,9689,9959,9989,997
11,00029,09211,09110,96810,99811,00211,000
12,00031,73012,09711,96411,99812,00212,000

0V時のADC値60と、わかっている電圧のときのADC値をもとに補正してみました。

1V時はADC値が2,707ですので「(ADC値-60)/(2707-60)*1000」で計算しています。ADCのMAXからだいぶ下の方で測定していますのであまり補正されていません。

同じように3V、6V、12VのADC値を使って補正したいます。

入力電圧測定値誤差1Vでの補正値誤差3Vでの補正値誤差6Vでの補正値誤差12Vでの補正値誤差
0220000
1,000320333
2,00036-5121
3,00041-8011
4,00047-12-10-0
5,00053-15-110
6,00059-19-20-1
7,00064-22-3-1-2
8,00071-25-3-0-1
9,00076-29-4-1-2
10,00081-32-5-2-3
11,00091-32-220
12,00097-36-220

差分だけ抜き出した表が上記になります。

グラフ化しました。オレンジの測定値は計算上の値です。個体差を補正していないのでどんどん値がずれています。1Vでの補正もMAXが12Vなのでちょっと補正が取り切れていないですね。12Vが一番よい成績ですが、3Vとか5Vとかの用意しやすい基準電圧で補正かけるだけで精度があがりそうです。

まとめ

端子付きで安いADCはなかなかないので便利なユニットです。この他にももう1つ電圧計ユニットもあるのですが、そちらは絶縁されている関係で3,000円を超える価格でちょっと使いにくいと思います。

たとえばDC電源系の測定には大電流が流れるのでADCユニットではなく、絶縁されている上記の電圧計ユニットが好ましいです。ただこの写真の一式で1万円近くの費用がかかっています。

また、マルチメーター系の商品もM5Stackで準備中のようですのでその手の製品でもいいのかもしれません。

UARTでの接続になりますが、上記のような電子負荷も電圧計として利用可能です。

コメント