タイマ制御機能付き時計ユニット

PIC16F84を使った24時間時計です。
2チャンネルのACスイッチをタイマ制御できます。
高精度水晶発振ユニットを使い高精度です。




【概要】

PIC16F84だけで出来た24時間時計です。発振素子に、高精度水晶
発振ユニットを使っているため、高精度の時計で、誤差一日1秒以下
の精度に出来ます。

表示は16文字2行の液晶表示器でバックライト付きを使って、夜中
でも表示が見えるようにしました。

またタイマプログラム機能がついており、2系統の外部制御が可能
です。今回はこれにACソリッドリレーを追加して、AC電源スイッチの
機能を付加しています。
このタイマプログラムは一日9個まで自由に設定することが出来ます。

【時計ユニットの仕様】

今回製作した時計ユニットの機能仕様は下記となっています。

・精度  :月差 30秒以下

・電源  :DC9〜12V
      消費電流 バックライト無しの時  15mA
            バックライト付きの時 120mA
・表示  :16文字2行の液晶表示器 バックライト付き
      表示内容
        現在時刻 時:分:秒
        タイマプログラム設定時刻、制御内容表示
・制御出力: 2系統の On/Off

・設定  : 4個のスイッチにより下記設定
      (プログラム選択、時刻選択、時刻変更、設定)
       −現在時刻設定、変更
       −タイマ制御 する/しない
       −タイマ制御設定 9プログラムまで設定


【時計の精度と発振素子】

ここで時計を作るために必要な精度がどの程度かを説明します。
まず、目標とする時刻精度をどの程度にするかを決めましょう。

   目標精度 : 月差 30秒以下

この精度を出すためには、どの程度の精度が必要かというと、

   30秒 ÷ (30日×24時間×3600秒) = 0.0000116

つまり 11ppm 以下の精度が必要ということになります。

これだけの精度を、使用する温度範囲、電源変動範囲、経年変化
の各条件の変動範囲で保つことが必要となります。
これを満足する発振素子としては、通常の水晶振動子では、ちょっと
厳しくなります。(普通の水晶発振回路の精度は数十ppmです)

そこで特別高精度の水晶発振ユニットを使います。このユニットの
精度は下記のようになっていて、上記の精度より数倍良い精度と
なっていますから、これで実現できることになります。

                   (京セラ社カタログより)
品  名 KTXO-18シリーズ 京セラ製
出力周波数 12.8MHz  
温度特性 ±3ppm -20〜+60℃
電源変動特性 ±0.3ppm +5V±5%
経年変化 ±1ppm
周波数可変範囲 ±3ppm以上 内蔵トリマ

このように高精度の発振ユニットが簡単に入手できるのは、アマチュア
にとっては有り難いことです。
 

【時刻カウント方法】

さて必要十分な精度の発振素子が手に入ったので、これを使ってPICで
時計として動かす方法を考えてみます。
つまり1秒を作り出すにはどうすれば出来るかということです。

発振ユニットの出力周波数は12.8MHzですから、PIC16F84を外部発振
回路での使い方にして、直接12.8MHzをクロックとして動かします。
 (ちょっと高目のクロックとなりますが、5V電源では安定に動作します)

そうすると、次はどうやって1秒を作るかが課題となります。今回は下記
のような方法で1秒を作り出しました。

 12.8MHzクロック → 1/4のサイクルタイム(12.8÷4=3.2)
    → タイマ0をプリスケーラ4倍でフリーランさせる
           (3.2MHz÷(4×256)=3125Hz)
       → タイマ0のカウントアップ割り込みを3125回カウントする
               (3125Hz÷3125=1Hz(=1秒))

こうすると、タイマ0のカウントアップ割り込みが、320μsec毎に発生
することになります。従って、この割り込み処理を余裕を持って実行完了
することが必要になります。半分の150μsec以下程度で実行完了する
ように考えます。

さらに注意が必要なことは、タイマ0の割り込み処理では、決してTMR0
レジスタのセットを実行してはならないということです。
これは、この命令を実行すると、プリスケーラが一旦0にクリアされる為、
ここで時間カウントに誤差が出てしまうからです。
従って、タイマ0は完全にフリーランさせた状態で、割り込みが正確に
一定周期(3125Hzつまり320μsec毎)で入る様にします。

【時計ユニットの構成】

本時計ユニットの全体回路図は、下記のようになります。全体を制御する
のはPIC16F84で、これに16文字2行の液晶表示器を接続します。
発振回路は外部発振回路という形で、OSC1(16ピン)に発振ユニットの
出力を抵抗でレベルを調整して接続します。

あとは押しボタンスイッチを4個、ACスイッチ制御が2系統となっている
だけで、非常に簡単な回路構成となっています。
ACスイッチには、一体モジュール型のソリッドステートリレー(SSR)を
使いました。本来は、ゼロクロススイッチがノイズにも強く良いのですが、
今回は手持ちのゼロクロス機能無しのものをそのまま使いました。

  ★ 時計ユニット回路図(クリックすれば直接表示します)


【組み立て】

今回の時計ユニットは、1枚の自作プリント基板にすべての部品を実装
しています。 液晶表示器の下にPICや、発振ユニットなどを配置しまし
たが、部品点数は非常に少ないので、楽に実装できます。

  ★ 時計ユニットパターン図(解凍してWinBoradでご欄下さい)


上記回路を左写真のような、1枚のプリント基板上に
組みたてています。ケースに実装するためには
もう少しスイッチ、ACスイッチ、表示部と分けた方が
やりやすいと思います。

組み立て上で注意することは、ACスイッチの出力側の
周りはできるだけ広く空けておくこと。
液晶表示器の下側は背が高い部品が配置されない
ようにすることぐらいです。

【プログラム】

次は実際に時計機能を実現するためのプログラムの説明です。 実際の
機能はプログラムだけで大部分作られていますから、逆に、皆さんのアイ
デア次第で、どのような時計も作ることが可能となります。

今回、表示には、液晶表示器を使いました。
その表示内容は左写真のように、上側の行には
現在時刻を、下側の行で、タイマ設定表示に使う
ということで使い分けています。

《表示内容》
  実際の表示内容の仕様は下図のようにしました。

       




《プログラムフロー》
  プログラムの流れを説明します。 大きく分けてメインプログラムと、
  割り込み処理プログラムがあります。
  
  下図がプログラムの概略フロー図です。
  割り込み処理プログラムは320μsecの半分 150μsec以内で実行
  を完了させる、という目標がありますから、ここでは時刻のデータのカ
  ウントアップだけにして、実際の表示変更や、タイマの時刻一致などの
  処理はすべてメインプログラムの方で実行させています。
  この結果、20μsec程度の高速処理となりました。
  
  これを互いに同期を取るために、SECFLGというフラグを使っています。
  つまり、割り込み処理で割り込みが3125回入った時にSECFLGをOn
  としておきます。メインプログラムではスイッチの入力を常時チェック
  しながら、同時にSECFLGもチェックし、Onの時には、表示の更新と
  タイマの時刻一致を確認し、一致していたら外部出力のOn/Of制御を
  実行します。
  
  タイマ設定用のプログラム設定では、CH0だけ特別扱いになっており
  現在時刻変更用のプログラム機能としていますので、CH0の時だけ
  別の処理内容となっています。
 
  スイッチが連続して押されていた時には、0.2秒間隔で同じ処理を
  繰り返すようにしています。これを処理するためにSKEWというカウンタ
  を使っています。







上記を実現するプログラムソースファイルは下記となっています。
ダウンロードして解凍し、MPLABでお使い下さい。

 ★ 時計ユニット ソースプログラムファイル



  目次ページに戻る