多機能 PWM 調光モジュールの製作 (2012/10/25/〜2012/11/16)

(Last update:2016/04/05)


回路図
実装例

(圧電ブザーの代わりに LED を実装)

【きっかけ】

 先の記事にも書いたが、カミさんの希望命令により 33年ぶりにキャンプに繰り出した管理人。キャンプに不慣れなこともあり、夜にロープに足をひっかけてコケそうになる事件が頻発 ^^;

 そこでロープの位置を教えてくれてくれる転倒防止用LED マーカーを作ろう、と思ったのがキッカケ。でもどうせ作るら多機能なものにして使い回しできるようにしておこう、と仕様検討を開始。


【仕様・機能】

・3つのモードを実装

  (1) 蛍点滅モード(蛍のように点滅、点灯時間、消灯時間を調節可能)
  (2) 常点灯モード(明るさを調節可能)
  (3) 明るさ自動追従モード(周囲の明るさに輝度が自動追従、いわゆるディマー機能)

・暗い時だけ動作する自動 ON/OFF 可能(10秒のヒステリシスあり)
・電源低電圧時に動作を停止する過放電防止機能あり(10秒のヒステリシスあり)
・設定は EEPROM に保存・復元


【ソフトウエア処理の概要】

・ハードウエア PWM で周期 250Hz のパルスを出力
・TMR2 : PR2 一致割り込みのタイミング (4ms) で PWM の DUTY を書き換える。蛍点滅の周期はこのタイミングを変更して実現
・TMR0 割り込み( 65ms毎)でキースキャン。キー操作に応じた処理はメイン側で
・メインルーチンで明るさを常時監視 → 省電力待機
・メインルーチンで低電圧を常時監視 → 省電力待機 強制電源 OFF (v2.5〜)
・電源 OFF で SLEEP 待機。ポート状態変化割り込みで SLEEP から復帰

 今回の一番のミソは、TMR2 : PR2 一致割り込みの回数を数えておき、設定回数に達したタイミングで DUTY 値を書き換えて周期変更をしている点。

 ・TMR2 : PR2 一致割り込みは 250Hz -> 4ms 毎発生
 ・このタイミングで DUTY( CCPR1L レジスタ値) を + 2 or - 2 する
 ・PR2 値は 249 なので、DUTY + 2 or - 2 するなら、124回 + 1(PR2 = 0 の場合)= 125 で、これが上昇と下降の都合 2回起きるので、最終的には 1回の点滅につき 250 回の DUTY 変更作業となる
 ・TMR2 : PR2 一致割り込みは 4ms なので、毎回 DUTY を書き換えると 4ms x 250 = 1秒となり、これが最短周期となる
 ・TMR2 : PR2 一致割り込みの回数をカウントし、所定の回数に達したら DUTY 変更することで点滅周期を伸ばす。例えば TMR2 : PR2 一致 2回で DUTY 書き換えなら 2秒周期、一致 3 回で DUTY 書き換えなら 3秒周期になる。

 基本的に PWM が 所定の周期ピッタリ終了した直後に、予め準備しておいた次周期の DUTY 値をレジスタに設定するのが原則で、このタイミングからあまりに外れると LED がちらつくなど違和感を感じる場合もある・・・・ハズ、たぶん。(肉眼では判らない?)

 また PWM 周期が 250Hz なのは秋月で売られている LED ドライバ LTC3202 と連携させるため。LTC3202 のデータシートには外部 PWM 信号で調光する回路が示されており、対応周期が 250Hz 〜 500Hz となっているため、応用性を考えて 250Hz にしてみた。


【モード解説】

 (1) 蛍点滅モード

  蛍のように DUTY パルスを変化させるモード。点灯時間、消灯時間を別個に設定できる。

  点灯時間: 1秒 〜 6秒、連続点灯の 7段階
  消灯時間: 0秒 〜 5秒の 6段階

  設定値は EEPROM に保存される。

  なお、このモードの「連続点灯」は輝度最大で固定。輝度を調節したければ下記常点灯モードにする必要がある。

  一応、本物の蛍の点滅周期(西日本 2秒、東日本 4秒)もあるので、緑 LED を使えばそこそこ蛍に見える・・・かも ^^;

 (2) 常点灯モード

  常に同じ DUTY パルスを出力するモード(=輝度一定)。DUTY は 3段階で調節可能。
  設定値は EEPROM に保存される。


 (3) 明るさ自動追従モード(ディマーモード)

  周囲の明るさに応じて自動的に PWM DUTY が変化するモードで、車載品等でディマー機能が欲しい場合に便利。
  周囲の明るさと PWM DUTY の関係は、

  周囲が暗い = DUTY 低い 〜 周囲が明るい = DUTY 高い

  となっているので、

  出力そのままでスイッチング → 周囲が暗い時に輝度最小、周囲が明るい時に輝度最大(車内インジケーター向き)
  出力を反転してスイッチング → 周囲が暗い時に輝度最大、周囲が明るい時に輝度最小(照明向き)

  となる。

  このモードは車載用ディーマー回路を想定し、最低 DUTY値 = 4% にクリッピングして真っ暗でも完全消灯しないようにしている。


【スイッチ操作】

LED 点灯状態 SW1 通常押し SW2 通常押し SW1 長押し SW2 長押し
点灯時間設定モード 蛍点滅 点灯時間↑ 点灯時間↓ 電源 ON/OFF モード変更
消灯時間設定モード 消灯時間↑ 消灯時間↓
常点灯モード 常点灯 DUTY(輝度) ↑ DUTY(輝度) ↓
明るさ自動追従モード 明るさ自動追従 (無効) (無効)

 設定値はいずれもローテート動作(最大値→最小値)。

 低電圧時は電圧が回復しない限りはキー操作は受け付けない。

 一方、昼モードで消灯中の場合は SW1 通常押しで強制的に点灯再開できるように変更してある。(v2.7〜)


【圧電ブザー(オプション)】

 圧電ブザーを実装すると

 ・キー操作時(BEEP 音 1回)
 ・省電力待機へ移行時(BEEP 音 2回)
 ・通常動作へ復帰時(BEEP 音 2回)

 にビープ音が鳴る。(4.1KHz, Duty 50% で約 100ms 駆動)

 ちなみにキー操作時の BEEP 音は若干音が割れてしまうのだが、これは 1MHz と比較的低クロックにもかかわらずそこそこの頻度で割り込み処理が入るため。要するに仕様(殴)。

 なお圧電ブザーの代わりに LED を実装するのもアリ。


【明るさ検出回路】

 明るさに対する感度はプルダウン抵抗で調整する。抵抗値は 10K(明るさにやや鈍感)〜 100KΩ(明るさに敏感)あたりが適切。車搭品などに組み込む場合は回路図のように VR にして感度を調節できるようにしておくことをオススメ。

 なお、明るさ検出が不要の場合はフォトトランジスタは省略できるが、プルダウン抵抗は必要。


【明るさ検出機能】

 周りが明るい場合、動作を最小限にして省電力待機する機能。常点灯モード、蛍点滅モードで有効。明るさ自動追従モードでは機能しない。

 フォトトランジスタからの出力を 8bit A/D 変換で読み込んで、A/D 変換値 30 以上なら昼間と判定。この状態が約10秒続くとクロックを 31KHz に落とし、PWM 出力とキー処理を停止。明るさ監視(と低電圧監視)のみ行い、周りが暗くなるまで待機する。

 逆に A/D 変換値 30以下が約10秒間続くと夜間と判定してクロックを 1MHz に戻し、PWM やキー処理などの通常処理を再開する。

 なおクロックダウン時の全消費電流は 1mA 以下。SLEEP ほど省電力ではないが、コイン電池でも使わない限りそれほど神経質になる消費電流ではないだろう。

 なお、明るさと低電圧検出(後述)の優先順位は

 低電圧検出 > 明るさ検出

 なので、低電圧で待機状態に入ったら、例え周りが暗くなっても電圧が回復するまで再起動しなくなる。


【低電圧検出機能(過放電防止機能)】

 ニッケル水素電池を電源に用いる場合、過放電を稼ぐための機能。

 電圧の監視自体はリセット IC に任せ、PIC 側ではヒステリシス処理を行う。具体的にはリセット IC からの出力を監視し、約10秒間 L 状態が続いたらクロックを 31KHz に落とし、PWM 出力、キー処理、A/D 変換を停止。以降、電圧監視のみ行い、約10秒間電圧が回復したら再スタートする。(低電圧による停止中は明るさ監視も行わない) 強制シャットダウン(電源 OFF)する。(v2.4 → v2.5 変更点)

 なお、低電圧を検出 → 電源断となるが、それによって負荷が軽くなる → 電池電圧回復 → 再度電源 ON、となり実際には完全停止ではなく点滅動作となる点注意。ソフトウエア的には一度低電圧を検出したら SLEEP にして殺してしまうテもあるが、今回は電池切れに気づきやすいよう、あえて点滅動作のままにしてある。

 リセット IC は一般的な Active Low タイプ(低電圧を検出したら L 出力)を用いる。低電圧検出不要の場合はリセット IC は省略可だが、GPIO 3 ポートは Weak pull up できないので外付けプルアップ抵抗は常に実装が必要。


【キーまわり】

 Weak pull up 設定しているので外付けのプルアップ抵抗は不要。

 なお、キーは2つあるが、常点灯ランタンや懐中電灯に仕上げる場合、

 一度常点灯モードに設定 → 設定値が EEPROM に書き込まれる

 という状態にしてしまえば、2つあるスイッチのうち電源スイッチ側のものだけを実装するだけで良くなる。(輝度はキー操作でローテートするので 1スイッチだけで電源 ON/OFF と輝度調節が可能)。


【何故ボリュームではなくスイッチなのか】

 調光は通常ボリュームを使った方が便利だが、今回はあえてキー 2つによるコントロールとしている。スイッチには選択肢が多く、実装を工夫することでキャンプ用品に非常に重要な「防水性」を高める余地があるからだ。

 例えば

 ・傾斜スイッチ、水銀スイッチ、リードスイッチ、静電容量スイッチなんかを使えばケースの穴あけが不要(傾斜スイッチ実装例
 ・先に述べたとおり、用途次第ではスイッチ 1つだけで電源の ON/OFF 〜 輝度調節できる実装が可能

 というわけで、防水上非常に有利に仕上げることができる。


【消費電流】

 クロック 1MHz 時(かつ LED 非点灯時)の消費電流は 1mA 以下。一晩持てばよい、という場合はコイン電池でもイケるので、ロープにクリップするような小型実装にすると実用的かも。


【このモジュールの利用例】

 本モジュールを利用した作品例はこちら。

 ・蛍点滅モードを利用したマーカー


【プログラム】

version 変更内容
2016/03/06
v2.5
・低電圧検出時、強制的にシャトダウンするよう変更
・連続点灯時の輝度調節を 4段階→ 3段階に変更
・連続点灯時の DUTY 設定を変更
 10%, 30%, 60%, 100% → 20%, 50%, 100%
2016/03/09
v2.6
・連続点灯モード時、スイッチ操作による電源ON 操作後、すぐに PWM 出力を再開するよう変更
2016/04/05
v2.7
・昼間モードで消灯中に SW1 を通常押しすると昼間モードを解除(強制復帰)するよう変更
商用利用厳禁

プログラム (HEX ファイル)
v2.7 (2016/04/05)
PWM_Module_v2.7.zip

なお、初期値は

 ・蛍点滅モードスタート
 ・点灯時間 1秒
 ・消灯時間 1秒

 ・常点灯モード輝度:最大

 となっている。


2012/12/06 追記:

 スーパーキャパシタでどれぐらい稼動するか試してみた。

【測定条件】

 ・2.5V 25F
 ・HT7730A で 3.3V 昇圧
 ・点灯1秒、消灯1秒
 ・赤 LED + 電流制限抵抗 1KΩ
 ・満充電 (2.5V) からスタート


【測定結果】

 6.5 時間稼動


【結論】

 25F では実用レベルに達せず。ただし昇圧電圧↓、LED 電流制限抵抗↑、消灯時間↑、で稼働時間は延びるハズ。


 [電子工作のページへ]