30年ぶりに復活した隊長の電子工作指令本部
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ソース: 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秒をかけてすぅ~っと明るさが滑らかに変化します。
隊長
カテゴリー
PR