コンテンツ


コメント

コメントはありません。 Comments/チュートリアル/PSoC_FirstTouch_PWM編

お名前:


LEDの光の強さを変える

LED編では、LEDのOn/Offを切り替えるプロジェクトを作りました。
しかしこれだけでは、点くか点かないかの二択です。
豆電球のように薄暗く光らせたり、ゆっくりと明るくさせたりするには[PWM]モジュールを使います。

PWMとは

PWMとは、Pulse Width Modulationの略です。
主に、周期的な矩形パルス波(デジタル信号)を発生させるために利用します。


 wiki_pwm_i_01.png
PWMには重要なパラメータが3つほどあります。

Clock

クロックの周期は、PWMモジュールの動作タイミングの基底となります。
より周波数の高いクロックを用いれば、より時間的に細かい矩形パルス波を発生させることができます。

Period

Periodは、パルス波の周期を指定するパラメータです。
パルス波の周期は、具体的な秒数でなく、クロック何回分と等しくなるか、という形で与えます。
上図の例では、1周期がクロック5回分と等しいので、Period=5[cycle]です。

Pulse Width

Pulse Widthは、パルス波1周期分において"1"の区間の長さを指定するパラメータです。
Periodと同じく、クロックの回数で与えます。
上図の例では、"1"の区間がクロック3回分と等しいので、PulseWidth=3[cycle]です。


もっと詳しく知りたい場合はデータシートを見ましょう。
モジュールを右クリックすると閲覧できます。

LEDの光の強さ

 wiki_pwm_i_02.png
上は、大まかなLEDの電流-電圧特性を表しています。
ある電圧値VFよりも大きな電圧が加わると、急に電流が流れ出します。
電流が流れていないときはLEDは消灯状態で、電流が流れているときに点灯します。


マイコンから電圧VF付近の微妙なアナログ電圧を出力させれば、LEDの明るさを制御できるかもしれません。
ですが、わりと手間がかかります。(D/A変換が必要。)


そこでよく用いられるのが、PWMです。PWMはデジタルのパルス波を出力するモジュールです。
パルス波の周期に対する、"1"の時間の割合をデューティ比と呼びます。
ずっと"0"のままの信号はデューティ比0%です。この信号をLEDに与えるとLEDは消灯します。
ずっと"1"のままの信号はデューティ比100%です。この信号をLEDに与えるとLEDは点灯します。
デューティ比50%の信号は、"0"と"1"を同じ時間ずつだけ、繰り返すパルス信号になります。信号をLEDに与えるとLEDは点滅します。


もしこの点滅が人間の目で追いつけないほど早く繰り返される場合はどうなるでしょうか。
すると、1秒間の点灯時間が50%(0.5秒)、消灯時間が50%(0.5秒)となるわけですが、人間の目には50%くらいの明るさで光っているように見えます。


つまり、デジタル信号のデューティ比によって、LEDの明るさを制御するのです。

ハードウェアの設定

新しいプロジェクトを作成します。


 wiki_pwm_01.png
[User Modules]ツリーから、[PWM8]モジュールを探し出してダブルクリックします。
デジタルブロックに[PWM8_1]が設置されます。


 wiki_pwm_02.png
PWMに利用するクロックの設定をおこないます。
クロックは、左上の[Global Resources]ウィンドウでおこないます。
PSoCには、[System Clock]と呼ばれる、おおもととなるクロックがあります。デフォルトの[System Clock]の周波数は24[MHz]です。
まず、これを分周器を任意に(1〜16)分周することによって、[VC1]というクロックを作成できます。
そして、[VC1]をもう一度(1〜16)分周し、[VC2]も作成することができます。
また、少し変わり物の[VC3]もあります。[VC3]は分周するクロックを選択することができ、さらに分周も1〜255分周までできます。
これらをうまく利用して、システムに必要な周波数のクロックを生成します。


細かいことを書いていますが、実はLEDの光の強さを制御するだけならクロックの周波数はあまり関係ないです。
なので、適当なクロックを与えてしまってもかまいません。
ただし、通信用モジュールなどの場合は、このクロックで通信速度が決まったりするので、とても重要です。


 wiki_pwm_03.png
[PWM8_1]の設定をします。

項目意味
ClockVC2PWMモジュールに与えるクロック
EnableHighカウントを作動させるかどうか
CompareOut後で設定PWM波形の出力先
TerminalCountNoneカウント完了信号の出力先
Period255周期(クロック何個分かで設定)
PulseWidth127パルス幅(クロック何個分かで設定)
CompareTypeLess Than or Equal比較の方法(以下か未満か)
InterruptTypeTerminal Count割り込みの種類(今回は関係無し)
ClockSyncSync to SysClk同期するクロックの設定
InvertEnableNormalEnable信号を反転して解釈するかどうか



 wiki_pwm_04.png
出力するピンの設定をします。
いずれかのLEDが接続されているピンをクリックすると、ピンの設定がポップします。
以下のように設定してください。

設定項目意味
SelectGlobalOutOdd_...ピンの接続先
DriveStrongピンドライブの設定(Strongはデジタル出力の設定)



 wiki_pwm_05.png
設定が完了すると、右側のピンから緑色の線へ配線が伸びているのがわかります。


 wiki_pwm_06.png
青色の線と緑色の線を接続します。
PWM8_1の下にある青い線をクリックすると、接続先を設定するウィンドウが表れます。
先ほど伸ばした箇所に接続されるように設定します。


 wiki_pwm_07.png
最後に、[PWM8_1]と青い線を接続します。
[PWM8_1]の[CompareOut]の項目から、接続先を選択します。

ソフトウェアの設定

  wiki_pwm_08.png
プログラムを書きます。

void wait(int time){
 while(time--);
}

void main(void){
 BYTE width = 0;

 PWM8_1_Start();
 while(1){
  PWM8_1_WritePulseWidth(Width);
  Width = Width + 1;
  wait(1000);
 }
}



wait(int)という待ちのための関数を宣言しています。
さて、これが無かったらどうなるでしょうか。

関数の簡単な説明

PWM8_1_Start();

[PWM8_1]を起動します。

PWM8_1_WritePulseWidth(pulse_width);

周期波形のパルス幅を変更します。

PWM8_1_WritePeriod(period);

周期波形の周期を変更します。

練習問題

  • 赤色LEDが徐々に暗くなると同時に、青色LEDが徐々に明るくなるようにするにはどうしたら良いでしょうか。

リンク

チュートリアル
PSoC FirstTouch INTRO編
PSoC FirstTouch LED編
PSoC FirstTouch PWM編
PSoC FirstTouch ADC編


添付ファイル: filewiki_pwm_i_01.png 791件 [詳細] filewiki_pwm_i_02.png 764件 [詳細] filewiki_pwm_09.png 382件 [詳細] filewiki_pwm_04.png 868件 [詳細] filewiki_pwm_02.png 804件 [詳細] filewiki_pwm_06.png 883件 [詳細] filewiki_pwm_07.png 914件 [詳細] filewiki_pwm_03.png 863件 [詳細] filewiki_pwm_01.png 847件 [詳細] filewiki_pwm_08.png 853件 [詳細] filewiki_pwm_05.png 829件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-02 (日) 11:12:58