こんにちは。岩本です。今週もマウスやっていきます。
今回は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)); } }
結果
結果、下図のようにいい感じに電圧測定できました。後はセンサーを買うだけ。。。
以上本日はここまで。