明日は我が身の備忘録(あすびぼ)

自分向け備忘録です。頻繁に更新は難しいでしょうね

ESP32でADC2と DACを使う (ESP32-DevKitC+ESP-IDF)

前回ADC1を使用してみたので、今回はADC2を使用してみる。これであらかたADCについて分かったはず。今回もテンプレートで用意されているプロジェクトを動かしてみる。ついでにDACも動かす。

f:id:kirikoshokunin:20210408213550p:plain:w300

テンプレートを開く

f:id:kirikoshokunin:20210408193405p:plain:w300
Template の Peripherals->adc2 を選択

 配線

ADCテスト用に可変抵抗を3.3V、GND、GPIO27に接続して分圧した後の電圧をADCで読み取る。

DACテスト用にLEDをGPIO27に接続した。

動作

f:id:kirikoshokunin:20210408200428p:plain
起動後最初の通信で現在ADC,DAC設定されているピンが出力されている

書き込んでシリアルモニタでESP32の起動直後のメッセージを読むとADCとDACの設定端子の情報が出力される。これはADCのチャンネルからGPIO端子番号を出力する関数から得た情報だ。

その下から始まる数値の羅列は左側はDACの出力設定値、右側がADC2の入力値だ。

下の動画はDACでLEDを調光している様子。テンプレートの周期から8倍にしている。 youtu.be

テンプレートのプログラム

テンプレートのプログラムを下に示す。一部変更してある。

ADC2

ADC2を使用する。ADC2は前回述べた通りWiFiと一緒に使うことはできないし、設定できる端子も制約が多い。 どの関数を使う前にもまずヘッダファイルをインクルードする。

#include "driver/adc.h"

ADC2のGPIO端子出力関数

ADC2のチャンネルがどのGPIOに対応しているか出力してくれる関数。便利だけど書き込んでからわかるってどうなの...

adc2_pad_get_io_num(adc2_channel_tchannel, gpio_num_t *gpio_num)

channel :調べたいADC入力端子

*gpio_num:GPIOの番号を代入してほしい変数のアドレス(&でアドレスを渡す)

ADC2設定関数

ADC2もADC1と同様に設定関数で設定する必要がある。

esp_err_t adc2_config_channel_atten(adc2_channel_t  channel, adc_atten_t  atten)

channel :ADC入力端子

atten :減衰量設定

    0:減衰量0[dB]  推奨範囲 100~950[mV]

    1:減衰量2.5[dB]  推奨範囲 100~1250[mV]

    2:減衰量6[dB]  推奨範囲 150~1750[mV]

    3:減衰量11[dB]  推奨範囲 150~2450[mV]

ADC2値読み取り関数

 ADC2で端子に入力されている電圧を読み取るためには下の関数を用いる(ADCの生値)。

esp_err_tb  adc2_get_raw(adc2_channel_t  channel, adc_bits_width_t width_bit, int *raw_out)

channel :ADC入力端子

width_bit :ADC分解能設定

    0:9Bit

    1:10Bit

    2:11Bit

    3:12Bit

*raw_out :値を代入する変数のアドレス(&で渡す)

DAC

ESP32のDAC機能を使用する。ESP32のDACは8bitで分解能は小さいが、簡単なメロディーや正弦波を流すには使える。 その為の関数を使う前にヘッダファイルをインクルードする。

#include "driver/dac.h"

DACの端子設定

DACを使用するにはまず、DAC端子の設定をする必要がある。

下の関数で端子を設定する。

 dac_output_enable(dac_channel_t channel)

channel :DAC出力端子

    0 :GPIO25   1:GPIO26

DAC出力関数

dac_output_voltage(dac_channel_t  channel, uint8_t  dac_value)

channel :DAC出力端子

    0 :GPIO25     1:GPIO26

dac_value:出力電圧設定(8bit)