ESP32で電圧測定をしてみるも、ちょっと問題が(内臓ADコンバータをanalogReadで使用)

Arduino/ESP32ADコンバータ,analogRead,測定,電圧

野暮用ですが、そろそろリポバッテリー用の電圧計を作らねば。

当面の目標は2セルか3セルのリポバッテリーの電圧状態を定期的に検知したいのですが、、、

もっとどんどん進むかと思っておりましたが、思いのほか勉強する事が多くなかなか進みませぬ。

電圧計を作るにはADコンバータの使い方からですし

わざわざマイコンを使うのですから、もっと機能を付けたくなりますし

しかし現状は、やっとこさトランジスタがどういうものかを知った程度で。

なんか前途多難ですn

なんとか気持ちを奮い立たせて、まずは低電圧でADコンバータを使ってみようと思います。

いきなり壊さない様に、まずは3.3Vからのチキンハート。

3.3Vですので、ESP32に内蔵のADコンバータにそのまま突っ込んでも大丈夫とは思いますが、、

将来的には12V以上の計測が目標ですので、分圧してやってみます。

まずは分圧

上限は3.3Vですのでどんな配分でも構わないと思いますが、、

先日Lチカした時に使った220Ωと330Ωの抵抗をそのまま使います。

抵抗の紙束から外すと見分けるのが大変ですので、なるべく再利用しようかと。

新しいの外すと、どれがどれだか判らなくなりそうですしおすし

一応テスターで計っておきます。

220Ωが217Ω(実測)、330Ωが328Ω(実測)でした。

電源を用意

電源は3.3Vを2種類用意します。

ESP32のボードから出ている3.3Vピンは3.27V(実測)

外付け電源の3.3Vは3.22V(実測)でした。

配線、回路図

適当に前回Lチカで使ったGPIO32を挿しておきます。

電源が外にあるとラクでいいですね

回路図はシンプルに、、、

330Ωと220Ωの順番で繋いでるので、GPIO32には3.3Vに対し1.32Vの電圧がかかる、、、筈
※ 220Ω / (330Ω + 220Ω) = 1.32V

たぶん、、、

何でも屠る感じの人が言ってた。

ESP32のADコンバータとスケッチを用意

さて、どんな感じで値が取れるのかさっぱりですので、とりあえずスケッチはシンプルに

#include <Arduino.h>
/*
	ADコンバータで電圧計テスト
*/
uint8_t adc_pin = 32;
uint8_t width_bit = 12;
float_t R1 = 330;
float_t R2 = 220;

void setup()
{
	// put your setup code here, to run once:
	// シリアル通信を開始
	Serial.begin(115200);

	// GPIOピンモードを設定 32をANALOGに
	pinMode(adc_pin, ANALOG);
}

// 電圧に変換する関数
float_t calcPartialtoV(uint16_t _adValue = 0)
{
	if (_adValue == 0)
		return 0;

	// 3.3Vを4096階調するらしいので素直に、、、
	float_t _voltage = 3.3 / 4096 * _adValue / float_t(R2 / (R1 + R2));
	return _voltage;
}

void loop()
{
	// analogReadで値を取得
	uint16_t adc_value = analogRead(adc_pin);

	// ひとまずは生の値を
	Serial.print("ADC Pin Value : ");
	Serial.println(adc_value);
	// 電圧に変換
	Serial.print("ADC Voltage : ");
	Serial.println(calcPartialtoV(adc_value));

	delay(1000);
}

さてじゃいきますか

外部電源をポチっと

うぇーい、、

なんぞこれ

多分ですけど

多分ですけど

GNDに落としてないので、俗に言う「浮いてる」ってやつじゃないですかねぃ

なるほど、固定しないとIOピンってのはこんなになるんですな・・・

恐ろしい

気を取り直して回路を修正

これでどうや。

再度ポチっと。

なんとなく値が安定した様な感じに。

平均で1392~1393くらいかな。

計算式はソースにありますがこんな感じ。

3.3V / 4096 * 1392 = 1.121484375
1.121484375 / ( R2 / R1 + R2 ) = 2.8037109375 V
※実測値:3.22V

んー? 0.42Vもテスターと違うンゴねぇ・・・

とりあえずこれは置いておいて、ESP32の3.3Vピンからも測ってみます。

1438~1440くらいなので1439くらいかな

3.3V / 4096 * 1439 = 1.1593505859375
1.1593505859375 / ( R2 / R1 + R2 ) = 2.89837646484375 V
※実測 3.27V

こちらもおよそ0.4V(0.38V)ほどテスターよりも低い。

何だかどちらもだいぶ低く出てますね。

ブレッドボード上の接触が悪いのもあるのでしょうけれど、ちょっと釈然としない数値。

折角ですので5Vも計測してみましたので載せておきます。

3.3V(外部)3.3V(ESP32)5V(外部)5V(ESP32)
analogRead1392143922052303
計算電圧2.80V2.90V4.45V4.65V
実測電圧3.22V3.274.77V4.91V
実測差0.42V0.38V0.32V0.26V

んー、なんだろう

ブレッドボードの接触が悪いのは仕方ないとしても、なんか釈然としませぬね

電圧が高くなれば少し差が減る感じですが、、

なんか係数的なものがズレてるんでしょうか

これだけの差があると、ちょっと誤差とは言えず実用は出来ないでするね。

もうちょっと調べてみます・・・