こんにちは。岩本です。今週もマウスやっていきます。
今回はESP32のADC機能を使ってみたいと思います。
ADC機能を使えば、バッテリの残量の監視やセンサの電圧監視ができるみたいです。
今回は、とりあえず電圧が測定できるのかを確認していきます。
参考サイト
・ESP32マウスPart.31 ADCでバッテリ電圧を計測
使用部品
今回はちゃんと計測できているかの確認なので、身近にあった抵抗と可変抵抗を使いました。本番ではセンサーに置き換えます。
・抵抗10kΩ
・可変抵抗10kΩ
確認方法
今回抵抗の変化に伴う電圧を測定したいため、分圧して電圧を測りたいと思います。なお、R1に可変抵抗を入れています。

プログラム
参考サイトのものをお借りしてテスト用に修正しました。
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
#define DEFAULT_VREF 1100 // eFuseメモリのVrefを使うため、このデフォルト値は使用されない
// 公式マニュアル:
// https://docs.espressif.com/projects/esp-idf/en/stable/api-reference/peripherals/adc.html
void app_main()
{
// ADC1_CH0はSENSOR_VPピンの機能
static const adc_unit_t unit = ADC_UNIT_1;
static const adc_channel_t channel = ADC_CHANNEL_0;
// 11dB減衰を設定。フルスケールレンジは3.9V
// マニュアルより、
// 6dBで正確な値が取れる電圧範囲は0.15 ~ 1.75V
// 11dBで正確な値が取れる電圧範囲は0.15 ~ 2.45V
// よって、11dB減衰を設定する
static const adc_atten_t atten = ADC_ATTEN_DB_11;
// ADCの分解能を12bit (0~4095)に設定
static const adc_bits_width_t width = ADC_WIDTH_BIT_12;
// ADCのユニットとチャンネルの設定
adc1_config_width(width);
adc1_config_channel_atten(channel, atten);
// ADCの特性を設定
esp_adc_cal_characteristics_t *adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
while (1) {
uint32_t adc_reading = 0;
static const int NO_OF_SAMPLES = 64; // 平均値を求めるためのサンプル数
// ADCの変換結果のばらつきを抑えるため、
// 結果を複数回取得して、平均値を求める
for (int i = 0; i < NO_OF_SAMPLES; i++) {
adc_reading += adc1_get_raw((adc1_channel_t)channel);
}
adc_reading /= NO_OF_SAMPLES;
// ADCの変換結果(0 ~ 4095)を電圧値 mV に変換
uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);
//
float sensor_voltage = voltage ;
float original_voltage = 3300 ;
float resistanceB = 10 ;
float resistanceA = (( original_voltage / sensor_voltage) * resistanceB) - resistanceB ;
printf("Raw: %d\tVoltage: %dmV\tResistance: %fkΩ\n",
adc_reading, voltage, resistanceA);
// 1秒待機
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
結果
結果、下図のようにいい感じに電圧測定できました。後はセンサーを買うだけ。。。

以上本日はここまで。
