忍者ブログ
 30年ぶりに復活した隊長の電子工作指令本部

ソース: HoneyLampSrc.c

これだけです。
MPLABで、PIC12F1822 用のプロジェクトを作成して、このファイルを追加します。

クロックは、LED点灯時は 8MHz、それ以外の時は 32.768KHz で動作します。

動作モード


動作としては、昼モードと夜モードを行き来します。
時間待ちを行う時は Sleep モードに入り、ウォッチドッグタイマにてウェイクアップします。
消費電力を抑えるためです。

昼モードでは、1秒間隔で明るさをチェックするのみで、低消費電力です。
センサもOFFにしているため、タッチしても点灯もしません。

夜モードでは、0.256秒間隔で明るさとタッチセンサをチェックします。
タッチすると点灯します。また、急に真っ暗くなると点灯します。

タッチセンシング処理

PIC内臓の CPS モジュール(mTouch)を使用します。
CPSの発信周波数は、Timer0 のオーバーフロー信号を Timer1 へ接続し、Timer1 のゲートコントロールを使用してカウントします(データシートで推奨されている方法)。
ゲートコントロールは、トグルモードとシングルパルスモードを併用します。

意外とノイズの影響を受けますので、常に基準値を平均化しています。
この処理がないと、たまに勝手に点灯したり、日数が経過するにつれてズレが大きくなり、常にタッチしていると勘違いし続けたりする場合があります。
感度調整は、CPSCON0 の設定、及び 変化率閾値の設定(GetTouch()関数内)にて行います。

PWM処理

LEDを、ふわっと点灯させて、すぅ~と消灯させます。

LEDの明るさをより自然になめらかに変化させるために、ディユーティー比の分解能を 1024 とし、ステップ数を 255 としました。
この条件で、LEDのチラつきが全く感じられなくするためには、クロックは最低 4MHz で動作させる事が必要でした。

255ステップで ディユーティー比を 0%~100% まで変化させます。
ただ、直線的に変化させても、LEDの特性により明るさは比例して変化してくれません。
ある点を境に、急に明るさが変化するような感じになります。

そこで、隊長が考案した次の指数関数式により、設定するディユーティー比を算出します。

 y:ディユーティー比 x:比例定数 k:係数

カーブが急になりすぎても明るさが急変化してしまいますので、比例要素としてkを加味します。
x を、log(10) A (A = 1024 / k + 1) を 255 で割った値で増加させ、kに 9 を指定して 255個のyを算出した時のグラフが下図になります。



この 255 個の数値を配列に保持しておきます。そして、例えば、2秒÷255 毎にディユーティー比を設定するレジスタ(CCPR1L, CCP1CON:DC1B)に順番に設定すれば、2秒をかけてすぅ~っと明るさが滑らかに変化します。

 

拍手[0回]

PR
隊長

ブログ内検索

Copyright © [ The 電子工作 ] All rights reserved.
Special Template : 忍者ブログ de テンプレート and ブログアクセスアップ
Special Thanks : 忍者ブログ
Commercial message : [PR]