2016年12月14日水曜日

PICマイコンで32.768KHzを発振

最近のPICマイコンはメインクロック用のクロック発振器の他に、
セカンダリー発振器も持っております。

これは元々、タイマー1用の発振器として実装されたもの。
大抵の場合、タイマー1のクロック源としてメインクロックのシステムを使うと思いますが、
タイマー1専用のクロック源を用意することもできるようになっているのです。

とは言え、そんな使い方をするとすれば、タイマー1の元クロックを
32.768KHzにしたい場合くらいでしょうか?
タイマー1の元クロックを32.768KHzにすると、16bitカウンター構成のタイマー1が
ぴったり2秒周期でロールアップするようになります。
これにより、時間計測が簡単に行えるようになるわけですね。

そんなタイマー1用の発振器ですが、昔は32.768KHzのみならず、
上は200KHzくらいまでのクリスタルも繋ぐ事が出来るようになっておりました。
しかしさすがに需要が無かったんでしょうねぇ、PIC16F1938辺りになりますと、
タイマー1用発振器は32.768KHz専用になってます。

この32.768KHz専用のタイマー1発振器は非常に省電力で動作いたします。
これが、電池駆動システム等で とても重宝することから、
タイマー1用発振器の32.768KHzをメインクロックとして利用しちゃおう、
という発想に繋がりました。

こうして、タイマー1用の発振器だったものが、セカンダリー発振器へ昇進のでした。

このセカンダリー発振器を使うのに必要なのは、
時計用として入手が容易な32.768KHzのクリスタルと、セラミックコンデンサー2個だけ。
とてもお手軽でございます。

さて、ここからが本題。

皆さんは、このセカンダリー発振器の発振周波数をどのように校正されますか?

クリスタル発振器の精度は非常に良いとは言え、無調整だと それなりに誤差は出ますね。
そこで、誤差がシビアな装置だと、セラミックコンデンサーの代わりにトリマコンデンサーを付け、
それで発振周波数を微調整するのは常套手段。

もちろん、PICのセカンダリー発振器でも同様の事は可能です。
ただそこで、1つ問題に ぶち当たるのでした。

セカンダリー発振器の発振出力が出てない。 

つまり、32.768KHzのクロックを直接測ることが出来ないのです。

特殊なプローブを使えば、クリスタルの足から発振信号を拾うことも出来ますが、
多少なりとも発振周波数に影響が出てしますので、いい方法ではありません。

さてそうなると、ソフトウェアにも1枚噛んでもらって、
セカンダリー発振器のクロックを取り出すしかない模様。
私が考えた手段は以下の2つ。

①CPUをセカンダリークロックで駆動し、任意のポートをトグル動作させる。
    こうすると任意のポートからは命令サイクル長のクロックが出てきます。
    しかし8bitPICの場合、命令サイクルは供給クロックの1/4ですので、
    ポートから出てくるクロックは8.192KHzになってしまいます。
    この8.192KHzの周波数を測定して誤差を調べる方法です。

②タイマー1のロールアップ時に任意のポートをトグル動作させる。
    これにより、任意のポートから0.25Hzのクロックが出てきます。
    0.25Hzということは、HもしくはLのパルス長は2秒ですので、
    この時間を計測し、誤差を調べる方法です。

ここまで書くと、もうほとんど解決したじゃないかと思われるかもしれません。
しかしまだ問題は残っております。

まず、そもそもの話として、どれだけの誤差を調べたいかという話ですが、
水晶発振ですから根本的に誤差値は大きくありません。
たぶん、多くても数百ppmというところでしょう。
それ以上にズレが発生していたら、そもそも発振が停止してしまいます。

仮に100ppmの誤差を測定したいとすれば、少なくとも10ppm単位で測る必要があります。

そこで、上記の①と②を振り返りますと・・・・・・・・・・
8.192KHzのクロックや2秒のバルス長を10ppm単位で測定するのって、実はちょっと面倒なお話。
安いユニバーサルカウンターで低周波を測ると、10ppmレベルまで細かく測定できないのです。

ということで、ここでまた一捻りが必要なことに・・・・・・・・・

0 件のコメント:

コメントを投稿