目次>5章 第2ステップ(色々な実験)>(3)LEDの明るさを序所に変える

LEDの明るさを序所に変える

更新日2005.9.5

(1)LEDを点滅させる」を改造して、緑のLEDの明るさを序所に変えるプログラムを作ってみます。

実験回路
実験回路は今まで使っていたものをそのまま使用します。
ただし、今回は緑のLED(RB0)のみ使用します。

LEDの明るさを変えるには
LEDは非常に高速にON(点灯)/OFF(消灯)できると言う特徴があります。
そして、人間の目には残像現象と言う特性があります。
この2つを組み合わせる事で、明るさが変わったように見せかけます。

具体的には、以下の図のようになります。

明るい
暗い

オンとオフの時間の割合を変えることで明るさを変化できます。
・オンの割合が大きい ・・ 明るい
・オフの割合が大きい ・・ 暗い

LEDの明るさを序所に変えるには(PWM方式)
オンとオフの割合を序所に変えることで明るさを変化させます。
とは言っても、アナログ的に変えることはできませんので、以下のように特定のパターンを繰り返すことになります。

(1)明るい
(2)薄明るい
(3)中間
(4)薄暗い
(5)暗い

このようにパルスの幅を変える方式を、PWM(Pulse Width Modulation:パルス幅変調)と言います。


では、プログラムをどのように作成すれば良いでしょう?
プログラムでは、次のようにON/OFFの時間を制御します。
1サイクルを12mSとし、
ON/OFFの判断は0.4mS毎に行います。

ここで言う「サイクル」は、1命令を実行するサイクルでは無く、一般的なサイクル(ONになる所から次にONになるまで)です。

この制御のために以下の3つのカウンタを使用します。

カウンタカウンタの用途
t_cycle1サイクルをカウントする(0〜30)
0.4mS毎に+1し、30になったら0に戻す
0に戻す時にRB0をONにする
t_widthRB0をONにしている時間(0〜30)
値が大きい程明るくなる
t_cycleが0に戻る時+1し、30になったら0に戻す
t_count0.4mS毎に+1し、t_widthと等しくなったらRB0をOFFにする
t_cycleが0に戻る時、t_countも0にする

プログラムのフローは以下の通りです。

0.4mS待つには、LEDを点滅させるで作成した、「0.4mS待つ」サブルーチンを使用します。

プログラム全体
上記の処理を組み込んだプログラムはこちらです。
メモ帳などのテキストエディタに取り込んで、LED4.ASMという名で保存し、MPLABでアセンブル&PICライタでPICに書き込んで動かしてみて下さい。

仕様通りに動作しましたか?