ESP32 で 1MHz の高周波クロックが生成できるか試してました。波形はオシロスコープで確認しました。




最初に試してみたのは、サーボモーターをコントロールした方法。スケッチを以下に示します。


#include "esp_system.h"

void setup() {
ledcSetup(0, 1000000, 8); // 0ch, 1MHz, 8bit
ledcAttachPin(15, 0); // 15pin 0ch
ledcWrite(0, 128); // 0ch, duty 50% (128/256)
}

void loop() {
}



観測した波形がこちら。





1MHz にはほど遠いだいたい310kHz程度の上、波形をよくよく見るとパルス幅が不揃いで、安定した波形が得られていません。

で、いろいろと調べてみたら、ESP32 の PWM で高周波クロックを出力するには、HIGH_SPEED モードに設定する必要があるようです。スケッチを以下に示します。



#include "esp_system.h"
#include "driver/ledc.h"

void setup() {
ledc_timer_bit_t bit_num = (ledc_timer_bit_t) 3; // duty range = 2^3 = 8

// Enable LEDC PWM peripheral
periph_module_enable(PERIPH_LEDC_MODULE);

// Set Duty
int duty = pow(2, (int) bit_num) / 2; // (2^3) /2 = 4 : 50%

// setup the timer
ledc_timer_config_t clk_timer;
clk_timer.bit_num = bit_num; // 3
clk_timer.freq_hz = 1000000; // 1MHz
clk_timer.speed_mode = LEDC_HIGH_SPEED_MODE;
clk_timer.timer_num = LEDC_TIMER_0;
ledc_timer_config(&clk_timer);

// setup the pwm channel
ledc_channel_config_t pwm_channel;
pwm_channel.channel = LEDC_CHANNEL_0;
pwm_channel.duty = duty;
pwm_channel.gpio_num = GPIO_NUM_15;
pwm_channel.intr_type = LEDC_INTR_DISABLE;
pwm_channel.speed_mode = LEDC_HIGH_SPEED_MODE;
pwm_channel.timer_sel = LEDC_TIMER_0;
ledc_channel_config(&pwm_channel);

// Set the PWM to the duty specified
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, duty);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
}

void loop() {

}



波形を確認してみます。





比較的安定した波形が得られました。オシロスコープが MHz の信号を観測するには性能不足なので、少し誤差が出ていますが、ほぼ 1MHz のクロックが得られたようです。

ESP32はまだ出たばかりなので、使いこなすのはちょっと面倒ですね。
σ(^_^;





waves ESP32-DevKitC ESP-WROOM-32 ESP32 DevKitC V2 WiFi BLE 技適取得済 国内発送

  • 出版社/メーカー: waves(ウェイブス)
  • メディア: エレクトロニクス



waves ESP32 ESPDuino-32 (ESP-WROOM-32) 技適取得品

  • 出版社/メーカー: waves(ウェイブス)
  • メディア: おもちゃ&ホビー



SparkFun ESP32 Thing Development Workshop (English Edition)

  • 出版社/メーカー: PE Press
  • 発売日: 2017/04/09
  • メディア: Kindle版