ESP32C3を搭載したSeeed XIAO ESP32C3のアナログ入力について、データシート等資料の確認と手元で実測を行った結果をまとめておきます。
忙しい人のためのまとめ
- A0,A1,A2の中から選べ。A3は極力使うな。
- 分解能はスペック上12bitだがフルでは使えない。
- 外付けADCがおすすめ。
ピンアサインの確認
アナログ入力として使用できるのは、下図左側の列の上から4つ。A0,A1,A2,A3と書かれているピンです。
https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/ より引用
ピンの割り当ては以下のようになっています。
XIAO-ESP32C3 A0 : ADC1_CH2
XIAO-ESP32C3 A1 : ADC1_CH3
XIAO-ESP32C3 A2 : ADC1_CH4
XIAO-ESP32C3 A3 : ADC2_CH0
データシートによれば、ADC1については工場出荷時にキャリブレーション済みですが、ADC2はキャリブレーション無とのことです。
また、ADC2は無線機能との同時利用ができませんので、ADC1に接続されているA0,A1,A2から選ぶのが無難です。実際に試しましたが、WiFi機能を有効にした状態でA3のanalogReadをするとエラーが表示されます。
一番簡単なスケッチ例
接続されているピンの電圧を読み取り、シリアルに出力するスケッチは以下のようになります。
void setup() { Serial.begin(9600); pinMode(A1,ANALOG);//A0 A1 A2 A3から選べる analogSetAttenuation(ADC_0db); //analogSetAttenuation(ADC_2_5db); //analogSetAttenuation(ADC_6db); //analogSetAttenuation(ADC_11db); //default } void loop() { int v =analogRead(A1);//A0 A1 A2 A3から選べる Serial.println(v); delay(500); }
アッテネーターの設定
analogSetAttenuation(~);
でアッテネーターを利用することができます。選べるのは、ADC_0db,ADC_2_5db,ADC_6db,ADC_11dbの3つです。いずれの場合も出力は0~4095の12bit整数です。
数字が大きくなるほど、大きな入力に対応できますが分解能が悪くなりますので、用途に応じて選んでください。
ちなみに、データシートによると、それぞれの設定による最大値は以下のようになっています。
- ATTEN0(ADC_0db):750mV
- ATTEN1(ADC_2_5db):1050mV
- ATTEN2(ADC_6db):1300mV
- ATTEN3(ADC_11db):2500mV
実測結果
各アッテネーターの設定で入力/出力を実測してみた結果は次の通りです。
メーカーのいう上限値付近までは直線性もそんなに悪くないように見えます。ただ入力電圧が0でも一定の出力があることと、フルに12bit(4096段階)使えるわけではないことには注意が必要です。
ADC_0db
ADC_2_5db
ADC_6db
ADC_11db
補足
12bitというのは多いようで、意外と少ないので厳密な測定が必要な用途にはI2Cなどで外付の専用ADCを使った方が良いです(ADS1115など)。実際、今回の測定中も値がかなりぶれていましたので目分量で中央値を読み取っています。
ACEIRMC 3個セット ADS1115 4チャンネル 16ビット I2C ADC モジュール ゲインアンプ Arduino Rpiと互換
参考リンク先
〇ESP32C3とXIAO-ESP32C3のピン割り当ての一覧表です。
〇ESP32C3のデータシートです。XIAO ESP32C3ではピン数の制限などからESP32C3のすべての機能が利用できるわけではないので注意してください。
https://files.seeedstudio.com/wiki/Seeed-Studio-XIAO-ESP32/esp32-c3_datasheet.pdf
以上です。
コメント