HiFiveでLチカ ~PWMを使ってみる~
今回はHiFive 1 rev bのPWMを利用したいと思います。Freedom studioに入っているサンプルをもとにより簡潔なコードを作成しました。
PWMに関するAPI
Freedom studioで用意されているAPIは以下のサイトが参考になります。
sifive.github.io
しかし、PWMに関するAPIはここに掲載されていません。サンプルプログラムやヘッダーファイルを見ながら用いるAPIを確認しました。
struct metal_pwm *metal_pwm_get_device(unsigned int device_num)
PWMのデバイスハンドラを取得します。
inline int metal_pwm_enable(struct metal_pwm *pwm)
PWMの機能が使用できるように設定します。
戻り値
エラーがない場合は0
inline int metal_pwm_set_freq(struct metal_pwm *pwm, unsigned int idx, unsigned int freq)
PWMの周波数を設定します。
戻り値
エラーがない場合は0
inline int metal_pwm_set_duty(struct metal_pwm *pwm, unsigned int idx,
unsigned int duty, metal_pwm_phase_correct_t phase_corr)
PWMのデューティ比とPWMの位相補正の設定を行います。
引数
- pwm
PWMデバイスドライバ
- idx
PWM出力先の番号
- duty
PWM出力のデューティ比
- phase_corr
PWMの位相補正の指定
METAL_PWM_PHASE_CORRECT_DISABLEかMETAL_PWM_PHASE_CORRECT_ENABLEを選択
戻り値
エラーがない場合は0
inline int metal_pwm_trigger(struct metal_pwm *pwm, unsigned int idx, metal_pwm_run_mode_t mode)
指定した動作モードでPWMを起動します。
引数
- pwm
PWMデバイスハンドラ
- idx
PWM出力先の番号
- mode
PWMの動作モード
動作モードはMETAL_PWM_CONTINUOUS(ひたすらPWMの出力を繰り返す)とMETAL_PWM_ONE_SHOT(一度だけPWM出力を行う)から選択
サンプルプログラム
Freedom studioを立ち上げて適当なプロジェクトを作成します。プロジェクト内のメインプログラムに以下のプログラムを書き込みます。
/* Copyright 2019 SiFive, Inc */ /* SPDX-License-Identifier: Apache-2.0 */ #include <stdio.h> #include <metal/pwm.h> int main (void) { struct metal_pwm *pwm; unsigned long i; pwm = metal_pwm_get_device(2); if (pwm == NULL) { printf("PWM is null.\\n"); return 1; } metal_pwm_enable(pwm); metal_pwm_set_freq(pwm, 0, 2); metal_pwm_set_duty(pwm, 3, 50, METAL_PWM_PHASE_CORRECT_DISABLE); metal_pwm_trigger(pwm, 0, METAL_PWM_CONTINUOUS); return 0; }
HiFive 1 rev bとLEDの配線は以下の写真のようにしています。
設定した周波数とデューティ比に応じて光り方が変わります。動作周波数を高くすればLEDがデューティ比に応じた明るさに光ります。
終わりに
PWMが利用できるようになるとLチカだけでも光らせ方の幅が広がって楽しいと思います。PWMはタイマ割り込みとも密接に関係しているようなので深掘りしてみようと思います。