ESP32-S3をPlatformIO Arduino版でADC‥キャリブレーションは?

カテゴリー: ESP32  タグ:

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

結構かかる

お気軽にコメントをどうぞ。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)