PICを使った30分、60分オフタイマーの製作
私が寝室で使っているテレビのマイコンに不具合があり、リモコンで消したテレビの電源が勝手に入ったり、オフタイマーが働かなかったりしていました。PICマイコンがなんとか使えるようになったので、PICの学習も兼ねてテレビにも使えるオフタイマーを作ってみました。
PIC12F629を使ったオフタイマーの製作
PICマイコン楽天 がなんとか使えるようになったので、PICの学習も兼ねてテレビにも使えるオフタイマーを作ってみました。うまくできましたので紹介します。PICマイコンPIC12F629と秋月電子通商のソリッドステートリレー(SSR)のキットを利用して作りました。
PICのアセンブラープログラムはフリーソフトのTera-Padエディターで作成しました。PIC開発ツールはMicrochip社のMPLAB IDE Ver.7.4、PICプログラムの書き込みは秋月のAKI-PICプログラマーVer.4を使いました。
もちろん、テレビ以外にもラジオやラジカセ、時間の変更や放熱板の変更でエアコンでも使えるようにできます。
30分、60分オフタイマーの製作方法
完成した基板と周辺機器
左からDC5V用の携帯電話充電用電源アダプタ、秋月のSSRキット、PIC12F629を使ったタイマー基板です。ケースに入れる前の状態です。何度もPICのプログラムを書き換えて試せるようにICソケットを使っています。
PIC12F629でタイマーを作る場合はセラロックか水晶発振子を使った方が良いのですが、内部発振でもそこそこの精度があります。また回路が非常に簡単なのも魅力です。
30分、60分オフタイマーの回路図
秋月のソリッドステートリレーはフォトトライアックを使っているので直流電圧をかけてやる必要があります。またPICマイコンを働かせるには5V程度の電源が必要です。これらは不要になった携帯電話の充電用のACアダプタを使いました。DC5V0.55Aでスイッチングレギュレータで電圧は安定化されています。
製作の注意点と使い方
- 秋月のソリッドステートリレーSSRはトライアックに放熱板を取り付けない場合は、電流2Aまでしか使えません。今回は100W程度のテレビなので放熱板なしで全く問題ありません。放熱板を付ければ最大20Aまで使えます。
- PIC12F629の4番ピン(GP3)には必ずコンデンサーC1を取り付けてください。PICの入力端子にコンデンサーを取り付けないと、手で直接端子を触る等のノイズで簡単に誤動作します。
- PICの4番ピンは入力端子(出力には設定できない)で内部プルアップはできません。プルアップする場合は必ず外部プルアップ抵抗が要ります。
- PICの4番ピンはHで60分オフタイマーに、Lで30分オフタイマーになります。これは起動時にチェックしているだけで動作している時はどんな電圧でもかまいません。
- PICの5番ピン(GP2)はタイマー出力です。直接ソリッドステートリレーを駆動します。約14mA流れます。(PICの最大定格は25mA)
- PICの6番ピン(GP1)はLED表示用出力です。電流制限抵抗を通してLEDに接続します。
- PICの他の使わない端子は全て出力に設定して開放としてください。
- ウオッチドッグタイマー(WDT)は使いません。使うとプログラムが停止した時、リセットされて最初から動きますので必要ありません。
- スイッチを30分用か60分用にして中間スイッチの電源を入れてすぐ中間スイッチの電源を切ると負荷に100V電源が供給されます。30分用にすると1秒に1回LEDが点滅します。60分用にすると2秒に1回LEDが点滅します。60分用で30分経過すると、1秒に1回LEDが点滅します。
- オフタイマーとして動作させない時は中間スイッチの電源を入れたままにします。
- オフタイマーが動作した後、もし停電して停電が復帰しても電源は入りません。
- 決められたオフタイマー時間が経過すると負荷の100V電源供給が止まり、LEDも消灯します。
- 時間精度はPICの内部クロックの精度となります。私の製作した物では30分でプラス20秒の誤差でしたから、約1%の誤差ということになります。オフタイマーではこの程度で問題ないと思います。
PICアセンブラープログラム
PICで正確なタイマープログラムとするには
できるだけ正確な時間のタイマーにする為に工夫したところを紹介します。プログラムはアセンブラーで作成しています。
要するに500mSを遅らせるサブルーチンプログラムの中の2mSを作る部分で、PIC内部クロックが正確ならばこの精度をきっちり2mSになるようにしたことです。500mSのサブルーチンの誤差はサブルーチンコールも入れて+5μS程度です。プログラム上での精度は1/100,000以下です。
私がプログラム作成の参考にした秀和システムの「やさしいPICマイコンプログラミング&電子工作」高橋隆雄著 ではgoto命令を1サイクルとしていますが、これは間違っています。
(128ページにPIC16F628のgoto命令は1サイクルと書いてあります。また4μS*250=1000μSと言っておきながら、250でなく240をセットしていると歯切れの悪い表現になっています。それなら5μS*200=1000μSではありませんか。)
(ラーメンタイマーの記事(PIC12F629を使用)で248ページの1mSを作る部分で4*250=1000μSとしています。正確にはgoto命令が2サイクルなのでnopをひとつ減らす必要があります。)
PIC12F629のgoto命令は2サイクルが正しいのです。いくら実験しても正確な時間にならないのでよく調べてみてわかりました。
また最初のDLY_1ループでできるだけサイクル数を多くした方が正確な時間にすることができます。これはレジスターが8ビットなのでループ回数は256以内に制限されるので、サイクル数を多くするとDLY_1ループの時間が長くなり、このループ外の誤差が同じなら誤差を少なくすることができるからです。このサイクル数を8としましたので、内部クロック4MHzでは1サイクル=1μSなのでここで8*249=1992μSとなります。
次にDLY_2を一巡するサイクル数を考えると前半で( )でくくったサイクル数の合計は6サイクルで6μSです。後半では、本来のDLY_1部分の8サイクルを除いてやると2サイクルで2μSとなります。クロックが正確なら合計で正確な2000μSとなります。
DLY_500 ;500mS movlw d'250' ; 2mS*250=500mS movwf CNT2 ; DLY_2 ;2mS ; DLY_2 loop DLY_2 を一巡する時間 6+ 8*249 +2=2000μS movlw d'249' ; (1) 1cycle=1μS movwf CNT1 ; (1) nop ; (1) nop ; (1) nop ; (1) nop ; (1) DLY_1 ; DLY_1 loop nop ;1 1 nop ;1 1 nop ;1 1 nop ;1 1 nop ;1 1 decfsz CNT1,f ;1 2 (TMP_CNT1が0になると2サイクル) goto DLY_1 ;2 (goto は2サイクル) decfsz CNT2,f ; 1 goto DLY_2 ; (2) return ;
オフタイマーのアセンブラープログラム
私の作成したアセンブラープログラムです。プログラム部分をエディターに読み込んでファイル名をtimer30_60.asm等にして保存して使ってください。