Yusuke Ebihara's website
Dotfiles Blog RSS

ESP32のADCで連続読み出しをする

2025/07/23

目次

ESP32のADCは、シングル読み取りモード(通常の analogRead )の他に連続読み出しモードがある。 ADC側で一定周期でサンプリングを実施してくれるモードであり、今回はサンプリング間隔を一定にしたかったため利用した。

開発には PlatformIO + Arduino core を利用している。

概要をつかむ

[ADC API ドキュメント](https://docs.espressif.com/projects/arduino-esp32/en/latest/api/adc.html を参照しながら実装する。

  1. analogContinous() で初期化
    • sampling_freq_hz サンプリング周波数、最終的に出力されるデータ
    • conversions_per_pin 上のサンプリング周波数の1周期あたり、何回計測を行うか何回分をまとめて1つのデータとするか
  2. analogContinuousStart() で連続読み出しを開始
  3. analogContinuousRead() で計測した値を読み出す
    • 第二引数でタイムアウトを指定 (ms)
    • データが読み出せれば true 、タイムアウトが発生すれば false が返される。

スケッチ例は以下のようになる。 以下の例では sampling_freq_hz = 1000conversions_per_pin = 20 なので、 1kHzでSerial.println が呼ばれ、またそれぞれの計測では20回のサンプリングが実施されておりその平均が出力される。 Serial.println は 1000/20 の 50 Hzで呼ばれる。

7/24 追記 conversions_per_pin について誤解していたので修正

void setup() {
  Serial.begin(115200); // Initialize the serial port

  pinMode(A0, INPUT);  // Set pin A0 as input
  
  uint8_t pins[] = {A0};  // Define the pins to read
  size_t pinCount = sizeof(pins) / sizeof(pins[0]);
  uint32_t conversions_per_pin = 20;  // Set the number of conversions per pin
  uint32_t sampling_freq_hz = 1000;  // Set the sampling frequency in Hz

  // Start continuous analog reading
  analogContinuous(pins, pinCount, conversions_per_pin, sampling_freq_hz, NULL);
  analogContinuousStart();

  Serial.println("ADC initialization completed.");
}

void loop() {
  adc_continuous_data_t *buffer = nullptr;  // Buffer to hold ADC data

  if (analogContinuousRead(&buffer, 1000)) {
    // Read the latest data from the buffer
    adc_continuous_data_t *data = &buffer[0];

    Serial.println(data->avg_read_mvolts);
  }
}

なお、周波数指定の範囲は 20 kHz~2 MHz となっている(esp-idf/components/soc/esp32/include/soc/soc_caps.h at master · espressif/esp-idf)。

バージョンの問題

上記の方針でコードを書こうとしたが、 analogContinous などの関数が定義されておらずコンパイルエラーとなる。

調べてみたところ、ESP-IDFのバージョンがv3以降ではないとAPIが用意されていないっぽい。

PlatformIOでインストールされているバージョンはv2系となっている。 PlatformIOでは最新のesp-idfが使えないらしい。

PlatformIOフォークのplatformio/platform-espressif32 では最新版がメンテナンスされている。

platformio.ini のplatform欄に以下のように記述する。

platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip

これでコンパイルを通すことができ、実際に動作することを確認することができた。

References

コメント

Github Issue と連動しています。