SGの製作その9(PIC TIMER0の罠)



前回までの製作でSGから出力される正弦波を
マイコンが認識可能なロジックレベルのパルスに変換するところまで完成しました。
回路図としては上の図のようになりました。

あとはマイコンで周波数をカウントして、結果をLCDに出力してやれば完成です。
カウント方法としては

・マイコンのTIMER2を使って1秒のゲートタイムを生成
・TIMER0のクロックとしてSG出力パルスを入力してやり、
ゲートタイム期間に何パルス入ってくるかをカウント

というような方法で試してみました。

で、やってみたところ、低い周波数はカウントできるものの
高い周波数になると正確にカウントできなくなるようです。
あちこち調べまわったところ、どうやらTIMER0の仕様によるものが
原因であるらしいことがわかりました。


これが今回使用したPICマイコン 16F1823のTIMER0のブロック図です。
図の左側のT0CKIからSGからのパルスを入れてカウントしようという目論見だったのですが
TMR0の手前で「Sync2Tcy」と書かれたブロックがあり、
別途入ってくるシステムクロック(Fosc)でなにかしらの処理をしているように見えます。

この図の説明書きを読んでみると「TMR0にアクセスすると2システムクロック間、
タイマのカウントを中断する」などということが書かれており、さらに
「この間の遅延を調整するためTMR0の値が変更される」とも書かれています。

つまるところT0CKIでTimer0を使うと、これとは非同期のシステムクロックによって
動作タイミングが変化します、ということのようです。
また、いろいろいじってみた感じだとこれ以外にもシステムクロックが
動作に絡んでいるような雰囲気。

T0CKIのクロック速度がシステムクロックに対して十分に遅ければ恐らく問題ないのでしょうが
今回の回路構成だと、T0CKI=10MHz(Max) 、システムクロック=6.25MHz(25MHz÷4)なので
問題あり!ということになってしまいそうです。
とりあえずの対策として前段にあるプリスケーラでT0CKIを分周して、
システムクロックよりも遅くなるようにしてからからTMR0に入れてあげると
高い周波数でも安定しい周波数測定ができます。但しこれだと分解能が落ちてしまいます。

PICマイコンはTimer0以外にもTimer1というタイマを持っており、
こちらは外部入力のクロックのみで動作するためこのような問題は発生しないのですが
悲しいことに今回使った16F1823は、外部端子にシステムクロック用の水晶を接続すると
Timer1はシステムクロックでしか動作しないという仕様になってしまっているため
こちらタイマは使えません。。

仕方ないので分解能を確保するため、ゲートタイムを1s以外に10sも用意して
両方を表示させることにしました。

上段がゲートタイム1s,下段が10sの測定結果です。
SGの発振周波数を下限に設定したときの表示。



SGの発振周波数を上限まで上げたときの表示。



まあなんとか実用にはなりそうです。
構成上、これ以上はどうにもならなさそうなので
とりあえず開発は完了とすることにします。

次回、今回の製作のまとめをします。

ブログランキングに参加中です。
クリックをお願いします。
電子工作関係の人気ブログをランキング形式で見ることができます。

にほんブログ村 その他趣味ブログ 電子工作へ
-----



コメント
コメントする








   

calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< March 2020 >>
                 ads                           

RSS Readerに登録


follow us in feedly

にほんブログ村 その他趣味ブログ 電子工作へ
にほんブログ村


アマチュア無線 ブログランキングへ






製作物紹介リンク

メールフォーム

selected entries

categories

archives

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM