Raspberry Pi PicoでPWMを出力する(windows10 + VSCode)
今回はRaspberryPi PicoのハードウェアPWMを2本出力して、LEDをゆっくり点滅と可変抵抗で調光できるようにする。
MakeLists.txtに追加
まず"hardware/pwm.h"をインクルードする必要があるのでADCの際と同様に、MakeLists.txtのtarget_link_librariesに”hardware_pwm”を追加する。
PWM設定
RaspberryPi PicoはすべてのGPIOからPWMを出力することができる。 しかし、PWMのチャンネル数は8で1チャンネルに対してA,Bの2出力あるので別々のDuty比を設定できるピン数は16のみ。 別々の周期は8本のみ。
GPIOの機能設定
今回はGPIO0、GPIO1からPWMを出力するので下のようにGPIOの設定をする。
gpio_set_function(0, GPIO_FUNC_PWM);//GPIO0をPWM出力設定 gpio_set_function(1, GPIO_FUNC_PWM);//GPIO1をPWM出力設定
変数宣言
pwm_gpio_to_slice_num関数で引数に入れたGPIOに対して どのスライスが設定されているかを調べて"slice_num"に代入する ※PWMのチャンネルを”slice”と呼ぶらしい。
uint slice_num = pwm_gpio_to_slice_num(0); pwm_config config;
デフォルトの設定を取得
config = pwm_get_default_config();
PWM周期設定
今回は周期を2KHzに設定する。pwm_config_set_clkdivでPWMカウント周波数の設定を行う。pwm_config_set_wrapでPWMの周期の設定を行い、第2引数の値(上限16bit)までカウントするとカウントがリセットされて0に戻る。よって、今回は30000がDuty比設定の上限となる。
pwm_config_set_clkdiv(&config, 2.f); pwm_config_set_wrap(&config,30000);
Duty比設定
pwm_set_gpio_levelでDuty比の設定をする。第一引数がPWMを出力するGPIOの設定。第二引数がDuty比の設定で最大16bitを入力する。pwm_config_set_wrapで設定した値以上の値を入れてもDuty比100%以上にならないので注意。
pwm_set_gpio_level(0, pwm0_duty); //gpio0のDuty比を設定