VScode PlatformIOでのESP32コーディングはArduino版で行うことが多くなってきた。そこでESP32-S3のADC設定した過去記事「PlatformIO版ESP-IDF V6に移行する – ADC」をArduino版で再コーティングしてみました
対象はESP32-S3-WROOM-1-N16R8です
ESP-IDF版ではADCのキャリブレーション用構造体をセットしAPIを実行するとゲイン誤差が数%→1%以下に収まった、というものでしたが、Arduino版ではどうか?、という顛末です
Arduino版で単発/連続変換やキャリブレーションなど細かい設定は?
※今回確認のPlatformIOは「v6.1.1.15」、Arduino版は「Arduino Core for the #ESP32 v2.0.16」です。
細かい変換モードは設定できないようです。そのかわり、
- 入力アッテネータ
- 解像度
をセットできます
基準電圧は1.1V。それ以上の電圧変換の場合は入力アッテネータを0dB 以外の
- ADC_2_5db
- ADC_6db
- ADC_11db
にセットしますが、その分分解能が落ちることになります
今回は1V未満の応用なのでアッテネータは0dBです
※出典「Lang-Shipさんの記事」より
コーティング行数は6分の1に
とりあえず、VScodeのコード補間を利用してさっとコーティング。ESP-IDF版のコードは前の記事を参照されたい
Arduinoの簡潔なAPIのおかげでESP-IDFの6分の1の行数で済む
#include <Arduino.h>
#include "freertos/FreeRTOS.h"
#define ADCIN 8
void setup(void) {
pinMode(ADCIN,INPUT);
analogSetAttenuation(ADC_0db); // Input Attenuator:0db(through)
analogReadResolution(12); // ADC Resolution:12
}
#define AVENUM 50
void loop() {
int data;
int total = 0;
while(1) {
while (1) {
total = 0;
for (int i = 0; i < AVENUM; i++) {
data = analogReadMilliVolts(ADCIN); // Read MilliVolts
total += data;
vTaskDelay(1);
}
total /= AVENUM;
printf("volt:%dmV\r\n",total);
vTaskDelay(300);
}
}
}
キャリブレーションは?
キャリブレーションのAPIが見つからないが、そのまま同じ個体でESP-IDF版のキャリブレーションした変換データと今回のArduino版とをプログラム書き換えて比較。
明示的にキャリブレーションしなくても、内部でやっていた
グラフが重なっているので、ESP-IDF版とArduino版での違いはほとんどわからない。Arduinoモードでは自動的にキャリブレーションしているようだ
オフセットがマイナス側に10mV程度あるのもほぼ同じ。別の個体でもこの傾向は同じです
変換精度に関してはキャリブレーションしたデータを使えることが分かったのでよかった
変換時間は?
analogSetSamples()関数がコード補完では見当たらず、廃止されたのかもしれない。純粋に毎回ADCチャネルをセットしてアクイジョン待ちし、一回のサンプリングをしているようだ。
CPUフル速度で、パルスを出してオシロで観察してみた
analogReadMilliVolts()関数:約90us
analogRead()関数:約60us
結構かかる