2025年6月20日金曜日

2色 8×8 マトリクスLEDを使う(その6)

 LEDの明るさはTB62706BFに付ける外部抵抗(R-EXT)で決まるが、この抵抗は桁毎に固定抵抗をハンダ付けしているため容易に明るさを変更できない。 一方設置の自由度を増すため明るさは可変にしたい。

そこで(その4)で述べたようにイネーブル信号をパルス幅変調(PWM)して明るさを可変にする事とした。 当初は2ms毎のラスタースキャンを起動しているTimer2をトリガーにTimer1とCLCを組み合わせてPWMを作る事を考えたが、やってみるとどうも上手く行かない。理由は不明だがTimer1にクロック(Fosc)が供給されないのだ。そこでCCPを使う事とした。CCPは元々Timer2と組み合わせてPWMを作る事が出来るようになっている。

この回路の動作の中心はクロック(Fosc/4)でカウントUPされる8ビットのTMR2である。TMR2の値がPR2と同じになると、 次のクロックでTMR2は0にリセットされる。すなわちPR2+1の周期のカウンタとなる。またこの時R-S・FFがSETされPWMのパルスがスタートする。さらにこのタイミングで割り込みを発生させることが出来る。

CCPでは10ビットのCCPRと10ビットに拡張されたTMR2とが比較され(10ビットのTMR2がFoscで駆動されていると考えると分かり易い)、一致するとR-S・FFがリセットされPWMのパルスが終了する。この動作が成り立つためには 0< CCPR <(PR2*4)の関係が成立している必要がある。

最初からCCPを使えばよかったように思われるが、そうしなかったのには理由がある。TMR2による2ms毎の割込み処理の中では先ず1行分のデータを作成し、次にSPIインターフェイスでデータをLEDの各桁まで届け、最後にラッチさせることでその行データがLEDを光らせる。つまり割り込みから実際の表示(ラッチ)迄の処理である程度の時間を取られる。一方明るさを制御するPWM信号はラッチを起点としたいが、実際は割り込みが起点となり処理に時間を取られるので望む結果が得られない。そこで処理の順番を変更し、割込みと同時にラッチを行うことでPWMの起点と整合させる事とした。その後次の割込みに向けて行データを用意し各桁へ届けて割込み処理を終える。このデータのラッチ(表示)は次の割込みの頭で行う。

 この方法でPWMパルスのデユーティ比は概ねCCPR/(PR2*4)である。この式から分かるがPR2が小さい場合にはPWMの細かい制御は出来ない。具体的にはリフレッシュレートが2msのときPR2は7なので3~4%単位での制御となる。

 (続く)

0 件のコメント:

コメントを投稿