M5Stackでアナログ電圧を出力したい機会がありました。
M5Stackで使われているESP32には、直接アナログ電圧を出力できる「DAコンバータ」が搭載されている他、「PWM信号」を出力することもできます。
「PWM(Pulse Width Modulation)」とは,出力のオンオフを高速に繰り返すことによって電圧を調整する方法のことです。
今回は、これらの出力信号をオシロスコープで観測してみたいと思います。
スケッチはこちらです。
#include <M5Stack.h>
void setup() {
M5.begin();
// PWM用設定
pinMode(16, OUTPUT);
ledcSetup(0, 100000, 8); // 0ch, 100kHz, 8bit
ledcAttachPin(16, 0);
// DAC用設定
pinMode(26, OUTPUT);
}
void loop() {
M5.update();
for(int val=0; val<255; val++) {
ledcWrite(0, val); // PWM出力
dacWrite(26, val); // DAC出力
delay(4);
}
for(int val=255; val>0; val--) {
ledcWrite(0, val); // PWM出力
dacWrite(26, val); // DAC出力
delay(4);
}
}
DAコンバータでアナログ電圧を出力するには「dacWrite()」を使います。使用できる出力端子は「25」「26」のみです。「0〜255」で出力するアナログ電圧値を指定します。
PWM出力には「LEDコントロール(LEDC)」を使います。「ledcSetup()」でチャネル番号、PWM信号の周波数、分解能を設定した後、「ledcAttachPin()」で設定したチャネルに出力端子を割り当てます。その後「ledcWrite()」で設定したチャネルからPWM信号を出力します。
今回は、PWM信号の周波数=100kHz、分解能はDAコンバータと同じ8ビットとしました。「0〜256」で出力するアナログ電圧値を指定します。
ふたつの信号をオシロスコープで観測してみました。
黄色がDAコンバータ出力、水色がPWM出力です。
DAコンバータではアナログ電圧が出力されていますが、PWMは振幅3.3Vのパルス波形です。
パルス波形をアナログ波形にするため、100Ωの抵抗と47μFのコンデンサでローパスフィルタをつくり、PWM出力に取り付けました。
観測した波形はこちらです。
DAコンバータとPWMの出力波形がほぼ同等になりました。
アナログ出力、PWM出力ともに常時「128(1.65V程度)」の一定電圧を出力するようスケッチを変更し、両者のノイズを観測してみました。
PWMの出力波形(水色)には、ローパスフィルタで使っているコンデンサの寄生成分によると思われる30mV程度の変動がありますが、ノイズの振幅としてはDAコンバータ出力と同程度でした。
今回の用途では、アナログ電圧に対してそれほど高い精度は求められておらず、「DAコンバータ」「PWM信号」のいずれでも問題なく適用できそうな感触が得られました。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。