コンテンツ†
コメント†
LEDの光の強さを変える†
LED編では、LEDのOn/Offを切り替えるプロジェクトを作りました。
しかしこれだけでは、点くか点かないかの二択です。
豆電球のように薄暗く光らせたり、ゆっくりと明るくさせたりするには[PWM]モジュールを使います。
PWMとは†
PWMとは、Pulse Width Modulationの略です。
主に、周期的な矩形パルス波(デジタル信号)を発生させるために利用します。
PWMには重要なパラメータが3つほどあります。
Clock†
クロックの周期は、PWMモジュールの動作タイミングの基底となります。
より周波数の高いクロックを用いれば、より時間的に細かい矩形パルス波を発生させることができます。
Period†
Periodは、パルス波の周期を指定するパラメータです。
パルス波の周期は、具体的な秒数でなく、クロック何回分と等しくなるか、という形で与えます。
上図の例では、1周期がクロック5回分と等しいので、Period=5[cycle]です。
Pulse Width†
Pulse Widthは、パルス波1周期分において"1"の区間の長さを指定するパラメータです。
Periodと同じく、クロックの回数で与えます。
上図の例では、"1"の区間がクロック3回分と等しいので、PulseWidth=3[cycle]です。
もっと詳しく知りたい場合はデータシートを見ましょう。
モジュールを右クリックすると閲覧できます。
LEDの光の強さ†
上は、大まかな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の明るさを制御するのです。
ハードウェアの設定†
新しいプロジェクトを作成します。
[User Modules]ツリーから、[PWM8]モジュールを探し出してダブルクリックします。
デジタルブロックに[PWM8_1]が設置されます。
PWMに利用するクロックの設定をおこないます。
クロックは、左上の[Global Resources]ウィンドウでおこないます。
PSoCには、[System Clock]と呼ばれる、おおもととなるクロックがあります。デフォルトの[System Clock]の周波数は24[MHz]です。
まず、これを分周器を任意に(1〜16)分周することによって、[VC1]というクロックを作成できます。
そして、[VC1]をもう一度(1〜16)分周し、[VC2]も作成することができます。
また、少し変わり物の[VC3]もあります。[VC3]は分周するクロックを選択することができ、さらに分周も1〜255分周までできます。
これらをうまく利用して、システムに必要な周波数のクロックを生成します。
細かいことを書いていますが、実はLEDの光の強さを制御するだけならクロックの周波数はあまり関係ないです。
なので、適当なクロックを与えてしまってもかまいません。
ただし、通信用モジュールなどの場合は、このクロックで通信速度が決まったりするので、とても重要です。
[PWM8_1]の設定をします。
出力するピンの設定をします。
いずれかのLEDが接続されているピンをクリックすると、ピンの設定がポップします。
以下のように設定してください。
設定項目 | 値 | 意味 |
Select | GlobalOutOdd_... | ピンの接続先 |
Drive | Strong | ピンドライブの設定(Strongはデジタル出力の設定) |
設定が完了すると、右側のピンから緑色の線へ配線が伸びているのがわかります。
青色の線と緑色の線を接続します。
PWM8_1の下にある青い線をクリックすると、接続先を設定するウィンドウが表れます。
先ほど伸ばした箇所に接続されるように設定します。
最後に、[PWM8_1]と青い線を接続します。
[PWM8_1]の[CompareOut]の項目から、接続先を選択します。
ソフトウェアの設定†
プログラムを書きます。
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編