シロートがオシロスコープを使う
マイコンから出力される正弦波と矩形波をオシロスコープで観測。
オシロスコープ
Amazonで購入した安価なオシロスコープ(購入時6999円、執筆時点で売り切れ、入荷待ち)を使う。
マイコン
正弦波を作るため、DAコンバーターを持つM5Stackを利用した。
正弦波(Sin wave)
M5StackでDAコンバーターを使うサンプルコードを利用した。ESP32でのDAコンバーターの利用方法詳細は、Espressifの本家サイトに記載がある。小生の環境では、ArduinoフレームワークではこれらAPI群を使ったコードを利用できず、ESP-IDFフレームワークをPlatformIO環境下で利用しBuild。
ソースコード
# include "driver/dac.h"
void app_main() {
dac_cw_config_t config;
config.en_ch = DAC_CHANNEL_1;
config.freq = 2000; // Set frequency of cosine wave generator output. Range: 130(130Hz) ~ 55000(100KHz).
config.scale = DAC_CW_SCALE_8;
config.phase = DAC_CW_PHASE_0;
config.offset = 1;
dac_cw_generator_config(&config);
dac_cw_generator_enable();
dac_output_enable(DAC_CHANNEL_1);
}
本家サイトによると、130Hzから100KHz(?)の周波数を設定できるようだ。また、DAC_CHANNEL_1は、GPIO25に相当する。
環境ファイル(platformio.ini)
[env:m5stack-core2]
platform = espressif32
board = m5stack-core2
framework = espidf
結果
2kHz
50kHz
何故か低い周波数(例:200Hz)は、正しく表示されなかった。
矩形波(PWM)
こちらは、Arduinoフレームワークの利用。M5Stack(ESP32)には、analogWrite()が存在しない。ESP32をArduinoフレームワークで利用する際のPWM用のAPIが別途用意されているのでこれを利用。
ソースコード
int PIN = 2;
int PWMCH = 0;
void setup() {
pinMode(PIN, OUTPUT);
ledcSetup(PWMCH, 2000000, 8); // Hz, 8Bit
ledcAttachPin(PIN, PWMCH);
ledcWrite(PWMCH, 128); // 50%
}
void loop() {
}
ledcSetup()で周波数、ledcWrite()でデューティ比(例:128 -> 128/256: 50%)を指定する。
結果
20Hz, 25%
10KHz, 50%
200KHz, 75%
あまり高い周波数では正しく表示されず(オシロスコープの能力不足)。
まずはOK。