明日は我が身の備忘録(あすびぼ)

自分向け備忘録です。頻繁に更新は難しいでしょうね

ESP32-DevKitC ESP-WROOM-32開発ボードでPWM RCサーボを動かす (MCPWMを使用)

 ESP32で前回GPIOの設定をしてLチカや入力割り込みをしてみたが、今度はPWMを出力してRCサーボを動かしてみる。esp-idfでmcpwm_servo_controlというテンプレートを使用して、MCPWMというESP32の周辺機能の使い方も学んでみる。

f:id:kirikoshokunin:20210405004030j:plain:w300

テンプレートを実行

テンプレートを開く

 新しいプロジェクトでテンプレートを開く。peripherals -> mcpwm -> mcpwm_servo_control のテンプレートを使用する。

f:id:kirikoshokunin:20210404181621p:plain:w300
Template の mcpwm_servo_controlを選択

 テンプレートを開いたら、「Lunch in "Ran" mode 」でビルドして書き込み、実行する。

f:id:kirikoshokunin:20210404181727p:plain:w300
mcpwm_servo_control_example.cを開いた画面

配線

f:id:kirikoshokunin:20210404191439p:plain
ESP32とサーボモータの配線

実行した動画

youtu.be

前回記事

kirikoshokunin.hatenablog.com

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でナンバリングされている。

 

f:id:kirikoshokunin:20210404224835p:plain:w300
MCPWMユニット

参考元: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_0MCPWM_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_0MCPWM_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_0MCPWM_TIMER_2で入力

gen:ジェネレータ選択 (MCPWMxA or MCPWMxB)

duty_in_us:Duty比入力 us単位で整数入力