0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi Pico C/C++ SDKのPWM用関数のまとめ

Last updated at Posted at 2021-05-21

#概要
Raspberry Pi Pico C/C++ SDKのPWM用関数のメモ
公式ドキュメントRaspberry Pi Pico C/C++ SDKの「4.1.17. hardware_pwm」をほとんど訳しただけです。

#レジスタ

//レジスタ構造体
typedef struct {
    pwm_slice_hw_t slice[NUM_PWM_SLICES]; //スライス設定
    io_rw_32 en; //有効/無効
    io_rw_32 intr; //割り込み要求
    io_rw_32 inte; //割り込み許可
    io_rw_32 intf; //強制割り込み
    io_rw_32 ints; //割り込みステータス
} pwm_hw_t;

//スライス設定
typedef struct pwm_slice_hw {
    io_rw_32 csr; //コントロール&ステータスレジスタ
        //bit7 :1カウント進み
        //bit6 :1カウント遅れ
        //bit5 :カウントモード
        //bit4 :カウントモード
        //bit3 :ChB極性
        //bit2 :ChA極性
        //bit1 :位相補正
        //bit0 :有効/無効
    io_rw_32 div; //分周比
        //bit11-4:整数部(単位は1)
        //bit3-0 :小数部(単位は1/16)
    io_rw_32 ctr; //PWMタイマカウント値
    io_rw_32 cc;  //PWMレベル値(デューティ)
        //bit31-16:ChB
        //bit15-0 :ChA
    io_rw_32 top; //PWMラップ値(周期)(ChA,B共通)
} pwm_slice_hw_t;

#関数

##static uint pwm_gpio_to_slice_num (uint gpio)

引数:uint gpio gpio番号(0-29)
戻り値:引数のgpio番号に対応するスライス番号(0-7)
    ( gpio >> 1 ) & 0x07
機能:指定されたgpio番号のスライス番号を取得

##static uint pwm_gpio_to_channel (uint gpio)

引数:uint gpio gpio番号
戻り値:引数のgpio番号に対応するチャンネル番号(0:A,1:B)
    gpio & 0x01
機能:指定されたgpio番号のスライス番号を取得

##static void pwm_config_set_phase_correct (pwm_config *c, bool phase_correct)

引数:pwm_config *c PWMコンフィグレーション構造体
     bool phase_correct 位相補正有無(0:無,1:有)
戻り値:なし
機能:PWMコンフィグレーション構造体に位相補正有無設定を書き込む
     ※位相補正:PWMタイマが1周期カウントした際に0に戻らずにカウントダウンすること。(周期が2倍になる)

##static void pwm_config_set_clkdiv (pwm_config *c, float div)

引数:pwm_config *c PWMコンフィグレーション構造体
     float div クロック分周(>=1)
戻り値:なし
機能:PWMコンフィグレーション構造体にクロック分周設定を書き込む
     ※フリーランニングモードでは周波数は clk_sys / div
       それ以外の場合ChBの入力で決まる?(よくわからない)

##static void pwm_config_set_clkdiv_int (pwm_config *c, uint div)

   pwm_config_set_clkdivの整数型版

##static void pwm_config_set_clkdiv_mode (pwm_config *c, enum pwm_clkdiv_mode mode)

引数:pwm_config *c PWMコンフィグレーション構造体
     enum pwm_clkdiv_mode mode カウントモード
                            0:フリーランニング
                            1:ChBの立ち上がり
                            2:ChBのHigh
                            3:ChBの立下り
戻り値:なし
機能:PWMコンフィグレーション構造体にカウントモード設定を書き込む

##static void pwm_config_set_output_polarity (pwm_config *c, bool a, bool b)

引数:pwm_config *c PWMコンフィグレーション構造体
     bool a ChAの極性(False:通常,True:反転)
     bool a ChBの極性(False:通常,True:反転)
戻り値:なし
機能:PWMコンフィグレーション構造体に極性設定を書き込む

##static void pwm_config_set_wrap (pwm_config *c, uint16_t wrap)

引数:pwm_config *c PWMコンフィグレーション構造体
     uint16_t wrap ラップ値(一周期分のカウント値)
戻り値:なし
機能:PWMコンフィグレーション構造体にラップ値(一周期分のカウント値)設定を書き込む

##static void pwm_init (uint slice_num, pwm_config *c, bool start)

引数:uint slice_num スライス番号(0-7)
     pwm_config *c PWMコンフィグレーション構造体
     bool start PWMスタートフラグ(False:スタートしない,True:スタート)
戻り値:なし
機能:PWMコンフィグレーション構造体の情報を反映しPWMスタートする

##static pwm_config pwm_get_default_config (void)

引数:なし
戻り値:pwm_config PWMコンフィグレーション構造体
機能:PWMコンフィグレーション構造体のデフォルト値を取得する
    位相補正:なし
    分周:1分周
    カウントモード:フリーランニング
    極性:通常
    ラップ値(一周期分のカウント値):0xFFFF

##static void pwm_set_wrap (uint slice_num, uint16_t wrap)

引数:uint slice_num スライス番号(0-7)
     uint16_t wrap ラップ値(一周期分のカウント値)
戻り値:なし
機能:ラップ値(一周期分のカウント値)を設定する
     ※ダブルバッファのためカウント中に変更した場合、
    ラップ(位相補正の場合はカウント0)後に反映される

##static void pwm_set_chan_level (uint slice_num, uint chan, uint16_t level)

引数:uint slice_num スライス番号(0-7)
     uint chan チャンネル番号(0:A,1:B)
     uint16_t level レベル値(デューティカウント値)
戻り値:なし
機能:レベル値(デューティカウント値)を設定する
     ※ダブルバッファのためカウント中に変更した場合、
    ラップ(位相補正の場合はカウント0)後に反映される

##static void pwm_set_both_levels (uint slice_num, uint16_t level_a, uint16_t level_b)

    pwm_set_chan_levelのChA,ChB同時設定版

##static void pwm_set_gpio_level (uint gpio, uint16_t level)

    pwm_set_chan_levelのスライス番号,Ch番号ではなくgpio番号で設定する版

##static uint16_t pwm_get_counter (uint slice_num)

引数:uint slice_num スライス番号(0-7)
戻り値:なし
機能:PWMタイマのカウント値を取得する

##static void pwm_set_counter (uint slice_num, uint16_t c)

引数:uint slice_num スライス番号(0-7)
     uint16_t c カウント値
戻り値:なし
機能:PWMタイマへカウント値セットする

##static void pwm_advance_count (uint slice_num)

引数:uint slice_num スライス番号(0-7)
戻り値:なし
機能:PWMタイマカウント値を1カウントインクリメントさせる
   ※完了するまで無限ループ

##static void pwm_retard_count (uint slice_num)

引数:uint slice_num スライス番号(0-7)
戻り値:なし
機能:PWMタイマカウント値を1カウント遅らせる
   ※完了するまで無限ループ

##static void pwm_set_clkdiv_int_frac (uint slice_num, uint8_t integer, uint8_t fract)

引数:uint slice_num スライス番号(0-7)
    uint8_t integer クロック分周整数部
    uint8_t fract クロック分周小数部
戻り値:なし
機能:クロック分周を8bitの整数部,4bitの小数部で設定

##static void pwm_set_clkdiv (uint slice_num, float divider)

    pwm_set_clkdiv_int_fracのfloat版

##static void pwm_set_output_polarity (uint slice_num, bool a, bool b)

引数:uint slice_num スライス番号(0-7)
     bool a ChAの極性(False:通常,True:反転)
     bool a ChBの極性(False:通常,True:反転)
戻り値:なし
機能:極性を設定する

##static void pwm_set_clkdiv_mode (uint slice_num, enum pwm_clkdiv_mode mode)

引数:uint slice_num スライス番号(0-7)
     enum pwm_clkdiv_mode mode カウントモード
                            0:フリーランニング
                            1:ChBの立ち上がり
                            2:ChBのHigh
                            3:ChBの立下り
戻り値:なし
機能:カウントモード設定をする

##static void pwm_set_phase_correct (uint slice_num, bool phase_correct)

引数:uint slice_num スライス番号(0-7)
     bool phase_correct 位相補正有無(0:無,1:有)
戻り値:なし
機能:位相補正有無設定をする
     ※位相補正:PWMタイマが1周期カウントした際に0に戻らずにカウントダウンすること。(周期が2倍になる)

##static void pwm_set_enabled (uint slice_num, bool enabled)

引数:uint slice_num スライス番号(0-7)
     bool enabled PWM有効/無効(0:無効,1:有効)
戻り値:なし
機能:PWM有効/無効を設定する

##static void pwm_set_mask_enabled (uint32_t mask)

引数:uint slice_num スライス番号(0-7)
     uint32_t mask PWM有効/無効マスク(0:無効,1:有効)
                   ※bit番号とスライス番号が対応している
戻り値:なし
機能:PWM有効/無効を全スライス同時設定する

##static void pwm_set_irq_enabled (uint slice_num, bool enabled)

引数:uint slice_num スライス番号(0-7)
     bool enabled PWM割り込み有効/無効(0:無効,1:有効)
戻り値:なし
機能:PWM割り込み有効/無効を設定する

##static void pwm_set_irq_mask_enabled (uint32_t slice_mask, bool enabled)

引数:uint slice_num スライス番号(0-7)
     uint32_t mask PWM割り込み有効/無効マスク(0:無効,1:有効)
                   ※bit番号とスライス番号が対応している
戻り値:なし
機能:PWM割り込み有効/無効を全スライス同時設定する

##static void pwm_clear_irq (uint slice_num)

引数:uint slice_num スライス番号(0-7)
戻り値:なし
機能:PWM割り込み要求をクリアする

##static uint32_t pwm_get_irq_status_mask (void)

引数:なし
戻り値:全PWM割り込みステータス
機能:全PWM割り込みステータスを取得する

##static void pwm_force_irq (uint slice_num)

引数:uint slice_num スライス番号(0-7)
戻り値:なし
機能:PWM割り込みを強制的に実施する
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?