So-net無料ブログ作成
検索選択

PSoC Creator で FM0+ の Lチカ (2) [FMx]このエントリーを含むはてなブックマーク#

FM0+ 評価ボード

前回の記事では、時間稼ぎループをソフトウェアで実現していたために、精密な「Lチカ」にはなりませんでした。 今回は、ハードウェアの力を借りて、「Lチカ」してみます。

使用するボードは、 FM0+ S6E1C-Series Starter Kit (FM0-64L-S6E1C3) です。

回路図に PWM を配置する

PWM を配置

プロジェクトを作成するところまでは、前回と同じです。 今回は、 PWM コンポーネントを配置します。 "Component Catalog" の "Digital" にある "PWM" を Drag&Drop で回路図に配置します。


Basic タブ

次にコンポーネントの設定を行います。 このプロジェクトでは、 PWM 出力を直接赤い LED に接続します。 その際に PWM 出力で使用される端子を Timer I/O A (TIOA) と呼びます。 Basic タブでは、"ConnectTIOA" を "true" に設定して TIOA 出力を有効にします。


PWM タブ

PWM タブでは、二項目を設定します。 まず、 "enPwmOutputPolarity" で出力の位相を設定します。 "Initially high" に設定すると、初期状態が HIGH になります。 TIOA に接続される LED は、電源とポート出力の間に接続されています。 そのため、負論理 (Active Low) 出力に設定します。

"enPwmPres" は、 PWM のクロックに使用されるプリスケーラの分周比を設定します。 今回は、クロックに比べて遅い点滅にするため、最大分周比である "1/2048" を使用します。 デフォルト状態でのクロック周波数は 8MHz なので、 PWM の駆動クロックは、約4kHzとなります。

これで回路図の設定は終わりです。 端子を表すコンポーネントがありませんが、設定で有効にした TIOA が使われることになります。

端子を割り当てる

端子の設定

次は、端子の割り当てを行います。 ここでは、 PWM の TIOA 端子をどこに割り当てるかを指定します。 割り当てるのは、赤い LED が接続されている P3D 端子です。 "PWM:TIOA" に "P3D" を設定します。

以上でハードウェアの設定を終わりです。 プログラムを記述する前に "Build" して、あらかじめ API を作成しておきます。

ソースコードの記述

ソースコード

次は、ソースコードの記述です。

#include "project.h"

#define     CYCLE       (8000000/2048/2)    // 0.5秒を作る分周比

int main(void) {
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    PWM_SetPinFunc_TIOA_OUT();                  // PWM の出力機能を有効にする
    Bt_Pwm_Init(&PWM_HW, &PWM_Config);          // PWM の初期設定
    Bt_Pwm_WriteCycleVal(&PWM_HW, CYCLE - 1);   // PWM 周期
    Bt_Pwm_WriteDutyVal(&PWM_HW, CYCLE / 2);    // PWM デューティー
    Bt_Pwm_EnableCount(&PWM_HW);                // PWM を起動する
    Bt_Pwm_EnableSwTrig(&PWM_HW);               // PWM にトリガをかける

    for (;;) {
        /* Place your application code here. */
    }
}

必要なのは、初期設定だけです。 まず、 "PWM_SetPinFunc_TIOA_OUT()" で PWM の TIOA に割り当てられた端子、すなわち P3D 端子を出力に設定します。 この関数は、 PWM コンポーネントのメソッドのように記述されています。

ところが、これ以降の関数ではメソッドという扱いにはなっていません。 次の "Bt_Pwm_Init()" は PWM の初期設定を行う関数ですが、引数としてタイマのレジスタアドレスである &PWM_HW を渡して、設定すべきタイマブロックを指定しています。 このレジスタアドレスを使って、各種レジスタを関数で設定するという仕組みです。 第二引数の &PWM_Config には、 PSoC Creator の設定ダイアログで設定したパラメータが格納されています。 設定ダイアログを見てわかるように、このパラメータには PWM の周期やデューティーといった情報は含まれてはいません。 これらの情報は、別途設定をすることになります。

"Bt_Pwm_WriteCycleVal()" と "Bt_Pwm_WriteDutyVal()" は、 PWM の周期とデューティーを設定します。 ここでも引数にレジスタアドレスを渡しています。 周期とデューティーの単位は、設定ダイアログで指定した約4kHzの PWM 駆動クロックです。 このプログラムでは、コンパイル時に設定値を計算させて、周期に0.5秒、デューティーにその半分 (50%) を設定しています。

"Bt_Pwm_EnableCount()" で、 PWM の動作を開始します。 ただし、この時には PWM カウンタは動き出しません。 カウンタが動きだすのは、 "Bt_Pwm_EnableSwTrig()" でトリガをかけた時です。 トリガを受けた PWM は、継続して LED を点滅させます。

ここで使用されている関数群は、 Peripheral Driver Library (PDL) ライブラリそのものです。 このライブラリの設計思想は、従来の PSoC の API とは異なっているので、注意が必要です。

ソースコードは、以上です。 "Build" して、 "Program" すると、 LED が点滅を始めます。 「Lチカ」できました。


nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。