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

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

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

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

測定するターミナルはHT3.96端子になります。国内だとあまり購入できないコネクタなので注意してください。
たぶんこのへんの部品だと思いますが確認していません。
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になると思われます。
上記に回路図があるので中身を確認します。

回路図を見ると入力を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値 |
|---|---|---|
| 0 | 22 | 60 |
| 1,000 | 1,032 | 2,707 |
| 2,000 | 2,036 | 5,342 |
| 3,000 | 3,041 | 7,979 |
| 4,000 | 4,047 | 10,616 |
| 5,000 | 5,053 | 13,256 |
| 6,000 | 6,059 | 15,893 |
| 7,000 | 7,064 | 18,530 |
| 8,000 | 8,071 | 21,170 |
| 9,000 | 9,076 | 23,807 |
| 10,000 | 10,081 | 26,444 |
| 11,000 | 11,091 | 29,092 |
| 12,000 | 12,097 | 31,730 |
データの抜粋です。若干オフセットがあるようでした。このへんは分圧を使っている関係で個体差がでてくると思います。
| 入力電圧 | ADC値 | 無補正 | 1Vでの補正値 | 3Vでの補正値 | 6Vでの補正値 | 12Vでの補正値 |
|---|---|---|---|---|---|---|
| 0 | 60 | 22 | 0 | 0 | 0 | 0 |
| 1,000 | 2,707 | 1,032 | 1,000 | 1,003 | 1,003 | 1,003 |
| 2,000 | 5,342 | 2,036 | 1,995 | 2,001 | 2,002 | 2,001 |
| 3,000 | 7,979 | 3,041 | 2,992 | 3,000 | 3,001 | 3,001 |
| 4,000 | 10,616 | 4,047 | 3,988 | 3,999 | 4,000 | 4,000 |
| 5,000 | 13,256 | 5,053 | 4,985 | 4,999 | 5,001 | 5,000 |
| 6,000 | 15,893 | 6,059 | 5,981 | 5,998 | 6,000 | 5,999 |
| 7,000 | 18,530 | 7,064 | 6,978 | 6,997 | 6,999 | 6,998 |
| 8,000 | 21,170 | 8,071 | 7,975 | 7,997 | 8,000 | 7,999 |
| 9,000 | 23,807 | 9,076 | 8,971 | 8,996 | 8,999 | 8,998 |
| 10,000 | 26,444 | 10,081 | 9,968 | 9,995 | 9,998 | 9,997 |
| 11,000 | 29,092 | 11,091 | 10,968 | 10,998 | 11,002 | 11,000 |
| 12,000 | 31,730 | 12,097 | 11,964 | 11,998 | 12,002 | 12,000 |
0V時のADC値60と、わかっている電圧のときのADC値をもとに補正してみました。
1V時はADC値が2,707ですので「(ADC値-60)/(2707-60)*1000」で計算しています。ADCのMAXからだいぶ下の方で測定していますのであまり補正されていません。
同じように3V、6V、12VのADC値を使って補正したいます。
| 入力電圧 | 測定値誤差 | 1Vでの補正値誤差 | 3Vでの補正値誤差 | 6Vでの補正値誤差 | 12Vでの補正値誤差 |
| 0 | 22 | 0 | 0 | 0 | 0 |
| 1,000 | 32 | 0 | 3 | 3 | 3 |
| 2,000 | 36 | -5 | 1 | 2 | 1 |
| 3,000 | 41 | -8 | 0 | 1 | 1 |
| 4,000 | 47 | -12 | -1 | 0 | -0 |
| 5,000 | 53 | -15 | -1 | 1 | 0 |
| 6,000 | 59 | -19 | -2 | 0 | -1 |
| 7,000 | 64 | -22 | -3 | -1 | -2 |
| 8,000 | 71 | -25 | -3 | -0 | -1 |
| 9,000 | 76 | -29 | -4 | -1 | -2 |
| 10,000 | 81 | -32 | -5 | -2 | -3 |
| 11,000 | 91 | -32 | -2 | 2 | 0 |
| 12,000 | 97 | -36 | -2 | 2 | 0 |
差分だけ抜き出した表が上記になります。

グラフ化しました。オレンジの測定値は計算上の値です。個体差を補正していないのでどんどん値がずれています。1Vでの補正もMAXが12Vなのでちょっと補正が取り切れていないですね。12Vが一番よい成績ですが、3Vとか5Vとかの用意しやすい基準電圧で補正かけるだけで精度があがりそうです。
まとめ
端子付きで安いADCはなかなかないので便利なユニットです。この他にももう1つ電圧計ユニットもあるのですが、そちらは絶縁されている関係で3,000円を超える価格でちょっと使いにくいと思います。

たとえばDC電源系の測定には大電流が流れるのでADCユニットではなく、絶縁されている上記の電圧計ユニットが好ましいです。ただこの写真の一式で1万円近くの費用がかかっています。
また、マルチメーター系の商品もM5Stackで準備中のようですのでその手の製品でもいいのかもしれません。
UARTでの接続になりますが、上記のような電子負荷も電圧計として利用可能です。





コメント