EnsekiTT Blog

EnsekiTTが書くブログです。

ESP-WROOM-32のMCPWMのDeadTimeがわからんから全部試した話

つまりなにしたの?
僕はDeadTimeの説明がピンとこないアホの子だったことがよくわかったので、MCPWMのDeadTimeの設定によって何がどう変わるのか確認してみた。
MCPWM — ESP-IDF Programming Guide v3.0-dev-745-gc4e65d6 documentation
f:id:ensekitt:20170922175225j:plain

基本設定

  • 周波数 1000Hz
  • AのDuty比 50%
  • BのDuty比 50%

mcpwm_deadtime_enable(MCPWM_UNIT_0, MCPWM_TIMER_0, ここを変えていく, 2000, 2000);

mcpwm_deadtime_enableの引数は

mcpwm_num: set MCPWM unit(0-1)
timer_num: set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
dt_mode: set deadtime mode
red: set rising edge delay = red*100ns
fed: set rising edge delay = fed*100ns

でdt_modeを変えていく
Redとfedはそれぞれ2000で0.2ミリ秒ずつずらした。

波形の見方

オシロスコープのチャンネルはAが上、Bが下。
トリガーをAの立ち上がりに設定。

以下8種類

  • デフォルトはこちら

f:id:ensekitt:20170922175247j:plain

  • MCPWM_BYPASS_RED

f:id:ensekitt:20170922175328j:plain
Bの立ち下がりが遅れてます

  • MCPWM_BYPASS_FED

f:id:ensekitt:20170922175359j:plain
Aの立ち上がりが遅れてます

  • MCPWM_ACTIVE_HIGH_MODE

f:id:ensekitt:20170922175504j:plain
Aの立ち上がりが遅れてBの立ち下がりが遅れてます

  • MCPWM_ACTIVE_LOW_MODE

f:id:ensekitt:20170922175516j:plain
反転したAの立ち上がりが遅れて反転したBの立ち下がりが遅れてます
反転してるからホントはトリガを立ち下がりにするとそれっぽく見える見たい。

  • MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE

f:id:ensekitt:20170922175536j:plain
Aの立ち上がりが遅れて、反転したBの立ち下がりが遅れています
あとComplimentって書いてあるけどComplementじゃないのかな…そういうもん?

  • MCPWM_ACTIVE_LOW_COMPLIMENT_MODE

f:id:ensekitt:20170922175547j:plain
反転したAの立ち上がりが遅れて、Bの立ち下がりが遅れています

  • MCPWM_ACTIVE_RED_FED_FROM_PWMXA

f:id:ensekitt:20170922175557j:plain
わかんない※反省ポイント。Aを基準にAとBの立ち上がりと立ち下がりを遅らせてるらしい。

  • MCPWM_ACTIVE_RED_FED_FROM_PWMXB

f:id:ensekitt:20170922175620j:plain
わかんない※反省ポイント。Bを基準にAとBの立ち上がりと立ち下がりを遅らせてるらしい。

使ったコードはこちら

#include <stdio.h>
#include "string.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_attr.h"
#include "soc/rtc.h"
#include "driver/mcpwm.h"
#include "soc/mcpwm_reg.h"
#include "soc/mcpwm_struct.h"

#define GPIO_PWM0A_OUT 19   //Set GPIO 19 as PWM0A
#define GPIO_PWM0B_OUT 18   //Set GPIO 18 as PWM0B

static void mcpwm_example_gpio_initialize()
{
    printf("initializing mcpwm gpio...\n");
    mcpwm_pin_config_t pin_config = {
        .mcpwm0a_out_num = GPIO_PWM0A_OUT,
        .mcpwm0b_out_num = GPIO_PWM0B_OUT,
    };
    mcpwm_set_pin(MCPWM_UNIT_0, &pin_config);
}

static void mcpwm_example_config(void *arg)
{
    mcpwm_example_gpio_initialize();

    printf("Configuring Initial Parameters of mcpwm...\n");
    mcpwm_config_t pwm_config;
    pwm_config.frequency = 1000;    //frequency = 1000Hz
    pwm_config.cmpr_a = 50.0;       //duty cycle of PWMxA = 50.0%
    pwm_config.cmpr_b = 50.0;       //duty cycle of PWMxb = 50.0%
    pwm_config.counter_mode = MCPWM_UP_COUNTER;
    pwm_config.duty_mode = MCPWM_DUTY_MODE_0;
    mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config);
    mcpwm_deadtime_enable(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_ACTIVE_RED_FED_FROM_PWMXB, 2000, 2000);
    vTaskDelete(NULL);
}

void app_main()
{
    printf("Testing MCPWM...\n");
    xTaskCreate(mcpwm_example_config, "mcpwm_example_config", 4096, NULL, 5, NULL);
}

反省(※)

一応振る舞いはわかったけど、わかった上でDuty比は50にしなければよかった
RedとFedはそれぞれ違う値にすればよかった
フレーズだけで実験してみてたし字面的に違う感じはしてたけど
「それやりたいことと違うと思うよ」って後輩が教えてくれました。
ありがとうございます!!!DCモータ作るときは使います!!!!

終わってから見つけた

https://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf
超詳しく書いてあったね。つらいね。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。