ESP32のADCを使用して電圧を測定する

投稿者: | 9月 15, 2022

電圧を測定してみました。analogRead()で値を取得できますが、かなりズレがあります。ズレを計測したところ、このようになりました。4番目のピンに510 Ωと100 Ωで分圧したものを接続しています。

この図から分かるように切片を持った1次的なズレをしていることがわかったので、2点の値を計測すれば、正しい値が出力されるようなプログラムを書いてみました。

const int inpin = 4; //測定ピン
const int R1 = 510; //プラス側の抵抗値
const int R2 = 100; //マイナス側の抵抗値

const float inV1 = 4; //校正に使用した電圧
const float ESP32ValueV1 = 4;//校正に使用した電圧の表示値
const float inV2 = 15; //校正に使用した電圧
const float ESP32ValueV2 = 15;//校正に使用した電圧の表示値

//読み取り値=katamuki*入力値+seppenn を計算する
const float katamuki = (ESP32ValueV2 - ESP32ValueV1) / (inV2 - inV1); //傾きの算出
const float seppenn = ESP32ValueV1 - (katamuki * inV1); //切片の算出
const float Xsettenn = - seppenn / katamuki; //X軸との交点

void setup() {
  Serial.begin(115200);
  Serial.println();
  
  Serial.print("MaxVoltage:"); //最大入力電圧の表示
  Serial.println(3.3 * (R1 + R2) / R2);
  Serial.print("kousei:"); //読み取り値=katamuki*入力値+seppenn の表示
  Serial.print("ESP32Value = ");
  Serial.print(katamuki);
  Serial.print("*inV + ");
  Serial.println(seppenn);
  Serial.print("MinVoltage:"); //最小測定可能電圧の表示
  Serial.println(Xsettenn);

  delay(5000);
}

void loop() {
  float pinrawV = analogRead(inpin); //inpinの値を読み込む
  float voltage = (pinrawV * (R1 + R2) / (R2 * 1000) - seppenn) / katamuki; //電圧の計算
  if (voltage <= Xsettenn){voltage = 0;} //校正した結果、0V以下になった際の処理
  Serial.println(voltage); //電圧値を出力
  delay(1000);
}

const float ESP32ValueV1 = 4;と、const float ESP32ValueV2 = 15;の部分の値(V1の方を4Vを入力した時の値、V2を15Vの値を入力した際の値)を表示値にすることで校正することができます。
なお、使用しているピンはGPIO4でADC2に接続されています。ADC2はWiFiやBluetoothなどの無線を使用すると使用できなくなる(値が0になる)ので注意してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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