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の行数で済む
2 | #include "freertos/FreeRTOS.h" |
8 | analogSetAttenuation(ADC_0db); |
9 | analogReadResolution(12); |
20 | for ( int i = 0; i < AVENUM; i++) { |
21 | data = analogReadMilliVolts(ADCIN); |
26 | printf ( "volt:%dmV\r\n" ,total); |
キャリブレーションは?
キャリブレーションのAPIが見つからないが、そのまま同じ個体でESP-IDF版のキャリブレーションした変換データと今回のArduino版とをプログラム書き換えて比較。
明示的にキャリブレーションしなくても、内部でやっていた
グラフが重なっているので、ESP-IDF版とArduino版での違いはほとんどわからない。Arduinoモードでは自動的にキャリブレーションしているようだ
オフセットがマイナス側に10mV程度あるのもほぼ同じ。別の個体でもこの傾向は同じです
変換精度に関してはキャリブレーションしたデータを使えることが分かったのでよかった
変換時間は?
analogSetSamples()関数がコード補完では見当たらず、廃止されたのかもしれない。純粋に毎回ADCチャネルをセットしてアクイジョン待ちし、一回のサンプリングをしているようだ。
CPUフル速度で、パルスを出してオシロで観察してみた
analogReadMilliVolts()関数:約90us
analogRead()関数:約60us
結構かかる