ESP32-DevKitC ESP-WROOM-32開発ボードでPWM RCサーボを動かす (MCPWMを使用)
ESP32で前回GPIOの設定をしてLチカや入力割り込みをしてみたが、今度はPWMを出力してRCサーボを動かしてみる。esp-idfでmcpwm_servo_controlというテンプレートを使用して、MCPWMというESP32の周辺機能の使い方も学んでみる。
テンプレートを実行
テンプレートを開く
新しいプロジェクトでテンプレートを開く。peripherals -> mcpwm -> mcpwm_servo_control のテンプレートを使用する。
テンプレートを開いたら、「Lunch in "Ran" mode 」でビルドして書き込み、実行する。
配線
実行した動画
前回記事
RCサーボを動かすテンプレート
ESP32のMCPWMのテンプレートを下に示す。
このテンプレートではPin18からPWM出力する設定になっている。
また、初期設定ではPWM周波数を50 Hz 、最大パルス幅が2000 μs、最小パルス幅が1000 μs、動作角度90 deg. という設定になっている。この設定を使用するRCサーボに合わせないと、RCサーボの動作角度が思い通りにならない。
mcpwm_servo_control_example.c · GitHub
API: MCPWM の解説(RCサーボを動かす部分のみ)
ESP32のPWMを出力するMCPWMユニットという周辺機能が2つある。それぞれ3相のPWMを出力できる。また、BLDC等を制御するためのホールセンサ入力、モータドライバからのエラー信号入力、タイマ入力をGPIO経由でMCPWMユニットに取り込むことができる。A,Bの組み合わせを1シグナルと呼び、それぞれ PWMxA
, PWMxB
とラベルされている。また、3相はそれぞれの相でタイマーを所持しており0-2でナンバリングされている。
参考元:MCPWM - ESP32 - — ESP-IDF Programming Guide v4.2 documentation
MCPWMのGPIO初期設定関数 mcpwm_gpio_init
MCPWMでGPIOを使用するにはまず、GPIOの初期設定をする。
esp_err_t mcpwm_gpio_init(mcpwm_num, io_signal, gpio_num)
戻り値 esp_err_t 正常時 ESP_OK 入力パラメータ異常時 ESP_ERR_INVALID_ARG
引数
mcpwm_num : MCPWMユニットを選択(0-1)
io_signal :どのMCPWMのシグナルか選択
6出力:( MCPWMxA , MCPWMxB )
9入力:(SYNC_x, FAULT_x, CAP_x)
※xはタイマー番号(0-2)
gpio_num:MCPWMの設定をするGPIOの選択:
例えば、GPIO16に設定したときは16を入力する。
MCPWMの初期設定関数(mcpwm_init)
esp_err_t mcpwm_init(mcpwm_num, timer_num, *mcpwm_conf)
戻り値 esp_err_t 正常時 ESP_OK 入力パラメータ異常時 ESP_ERR_INVALID_ARG
引数
mcpwm_num : MCPWMユニットを選択(0-1)
timer_num :どのMCPWMのタイマーか選択 タイマー番号(0-2)の数値入力
またはMCPWM_TIMER_0
~MCPWM_TIMER_2
で入力
mcpwm_conf:MCPWMの設定が入っている構造体を入力:
MCPWM設定構造体(mcpwm_config_t)
struct mcpwm_config_t
メンバー
uint32_t frequency
MCPWMの周波数[Hz]
float cmpr_a
MCPWMxAのDuty比を%で入力
float cmpr_b
MCPWMxBのDuty比を%で入力
mcpwm_duty_type_t duty_mode
Dutyのモード設定
MCPWM_DUTY_MODE_0
通常のDuty:値が大きいとON幅が大きくなる
MCPWM_DUTY_MODE_1
反転Duty:値が小さいとON幅が小さくなる
counter_mode
MCPWMのカウンターを選択
MCPWM_UP_COUNTER
カウントアップ設定
MCPWM_DOWN_COUNTER
カウントダウン設定
MCPWM_UP_DOWN_COUNTER
同期クロックを使用する設定、周期はMCPWM周波数の半分が設定される
Duty比設定関数_%(mcpwm_init)
初期設定からDuty比を%単位で変更するときに使用する関数。
esp_err_t mcpwm_set_duty(mcpwm_num , timer_num , gen , duty)
戻り値 esp_err_t 正常時 ESP_OK 入力パラメータ異常時 ESP_ERR_INVALID_ARG
引数
mcpwm_num : MCPWMユニットを選択(0-1)
timer_num :どのMCPWMのタイマーか選択 タイマー番号(0-2)の数値入力
またはMCPWM_TIMER_0
~MCPWM_TIMER_2
で入力
gen:ジェネレータ選択 (MCPWMxA or MCPWMxB)
duty:Duty比入力 %を浮動小数点で入力 (0.0 - 100.0)
Duty比設定関数_us(mcpwm_init)
初期設定からDuty比をus単位で変更するときに使用する関数。
esp_err_tmcpwm_set_duty_in_us(mcpwm_num , timer_num, gen, duty_in_us)
戻り値 esp_err_t 正常時 ESP_OK 入力パラメータ異常時 ESP_ERR_INVALID_ARG
引数
mcpwm_num : MCPWMユニットを選択(0-1)
timer_num :どのMCPWMのタイマーか選択 タイマー番号(0-2)の数値入力
またはMCPWM_TIMER_0
~MCPWM_TIMER_2
で入力
gen:ジェネレータ選択 (MCPWMxA or MCPWMxB)
duty_in_us:Duty比入力 us単位で整数入力