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

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

Raspberry Pi PicoでPWMを出力する(windows10 + VSCode)

f:id:kirikoshokunin:20210418213215p:plain:w350
 
 今回は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比を設定

ソースコード

動作

youtu.be

前回記事

kirikoshokunin.hatenablog.com