つまりなにしたの?
僕はDeadTimeの説明がピンとこないアホの子だったことがよくわかったので、MCPWMのDeadTimeの設定によって何がどう変わるのか確認してみた。
MCPWM — ESP-IDF Programming Guide v3.0-dev-745-gc4e65d6 documentation
基本設定
- 周波数 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種類
- デフォルトはこちら
- MCPWM_BYPASS_RED
Bの立ち下がりが遅れてます
- MCPWM_BYPASS_FED
Aの立ち上がりが遅れてます
- MCPWM_ACTIVE_HIGH_MODE
Aの立ち上がりが遅れてBの立ち下がりが遅れてます
- MCPWM_ACTIVE_LOW_MODE
反転したAの立ち上がりが遅れて反転したBの立ち下がりが遅れてます
反転してるからホントはトリガを立ち下がりにするとそれっぽく見える見たい。
- MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE
Aの立ち上がりが遅れて、反転したBの立ち下がりが遅れています
あとComplimentって書いてあるけどComplementじゃないのかな…そういうもん?
- MCPWM_ACTIVE_LOW_COMPLIMENT_MODE
反転したAの立ち上がりが遅れて、Bの立ち下がりが遅れています
- MCPWM_ACTIVE_RED_FED_FROM_PWMXA
わかんない※反省ポイント。Aを基準にAとBの立ち上がりと立ち下がりを遅らせてるらしい。
- MCPWM_ACTIVE_RED_FED_FROM_PWMXB
わかんない※反省ポイント。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
超詳しく書いてあったね。つらいね。