ちょっとTea Time!? 周波数カウンターをつくってみよう! 2021.7.6

我が家の周波数標準もできたことなので、いよいよ周波数カウンターを作ってみましょう。

表示はLCDをつかえば簡単ですが、それでは面白くないので私的には初物の14セグメントのLEDをつかってみようかと思っています。
2桁表示のものを4個並べて8桁表示です。
また14セグメントなので、数字以外にも色々と表示できます。

表示には14セグメントのLEDをつかってみましょう。

機能は?

機能はすこし欲張ってみましょう。
 周波数カウンターとしての動作は下記の2つの動作ができるようにして、
低周波数でも測定分解能が落ちないようにしましょう。

 ダイレクトカウント・・・・一定時間(例えば1秒間)の信号をカウントを表示する。
               高周波数の測定に向きます。
 レシプロカル・・・・・・・・入力信号の周期の間に基準クロックをカウントし、その逆数を
                表示する。低周波数の測定に向きます。

その他は
 ・パルス幅の測定
 ・DUTY比の測定
など、盛り沢山にしましょう。まあ、計画は壮大に、実行はシンプルに・・・という結果にはなりそうですが。

回路図は?

まずは、全体の回路を書いてみましょう。色々と機能を詰め込もうとしたら、結構回路が複雑になってしまいました。
ICはPICを含めて10個ほど必要になります。それに、LEDのダイナミック点灯用にトランジスタが23個必要です。
数が問題ではなく、その実装面積が結構きついです。抵抗はできるだけチップ抵抗をつかったほうがよさそうです。


全体の回路図です。


左半分の回路図です。ちょうど周波数カウントの処理部になります。



右半分の回路図です。こちらは単純に14セグメントLEDをダイナミック点灯するための回路になります。

さて、いつになったら着手できるかな。
まあ、気長に進めましょう!

#まずはHDMI-LVDS関連のマニュアルも書いたことだし、今週末あたりにリリースかな〜

検討不足だったなあ〜 2021.7.13

14セグメントのLEDを使おうと思っていましたが、検討不足が露呈です。
8桁ダイナミック点灯なので1セグメントあたりパルスで40mA程度流そうと思っていましたが、
14セグメントになるとDP(小数点)含めて最大で600mA流れます。
最初はなにも考えずにチップトランジスタを使おうと思っていましたが、全然容量的に足りません。
勿論TO-92サイズのトランジスタでもだめです。TO-126あるいはTO-220のトランジスタが必要です。
それらを8個も搭載するとなると、結構な面積を必要とします。こりゃ、だめだな〜。

LCDにしちゃおうかな・・・・

LEDはやめて、LCDにしちゃおうかな〜。そうすれば、部品点数も大幅に減ります。
それにLEDだと40PinのPICが必要ですが、LCDなら28PINのPICでも十分です。基板の実装面積もかなり小さくなります。

まずはLCDをつかって28PinのPICを使った場合で回路図を引き直しです。

LCDに変更すると回路図がかなり小さくなりました。


ああ!回路図間違えている! 2021.7.27

しばらく放置していましたが、いざ作ろうとおもって回路図を見直したら、大きな間違い発見です.IC6の74148って8 to 1 セレクタと思っていましたが、
8 to 3 のエンコーダでした.こりゃ、だめだわ.
 といっても、8 to 1 のセレクタなんて手持ちにないから、仕方ないので3ステートバッファーを並べて8 to 3 セレクタを即席で作成です.
ついでに、回路図も少し見直して、簡略化しました.


回路図をすこし見直して簡略化しました.機能は同じになるはずです(ほんと?

組み立てに入りましょう!

素子(IC)の数もさほど多くないので、STDサイズの基板でも十分に実装できそうです.
適当に配置して、配線作業に入りましょう!


素子数も少ないのでSTDサイズのユニバーサルに組み込みました.

まずはダイレクト計測モードで 2021.7.29

必要なICを搭載して、あとは簡単に作れるダイレクト計測モードでのソフトを作成です。
ダイレクト計測は一定時間(例えば1s)の間にカウントした数を表示するだけなので、とくに難しいところはありません。
それに対してレシプロカル計測だと倍精度での割り算が必要になります。使っているC言語のコンパイラでは単精度の
割り算ルーチンしかないので、あらたに倍精度の演算サブルーチンを作る必要があります。


ダイレクト計測モードでの仮ソフト作成です。

次はレシプロカル計測モードを検討です。 2021.8.1

演算ルーチンはどうしよう?
 レシプロカル計測するには、倍精度の割り算が必要です。浮動小数点なんかは勿論のこと面倒なので、
固定小数点で考えます。必要なビット長は整数部が48ビットで、小数点部分が32ビット程度です。合計82ビットになります。
Cコンパイラで32ビットの演算ルーチンが使えますから、32の倍数のほうがいいので96ビットにしましょう。
この演算はPCを使えばあっという間ですが、8ビットのPICだとどのくらい時間かかるだろうか?
まあ、時間がかかったとしても頻繁に計算するわけではないので少々時間がかかってもよしとしましょう。

仕様をまとめる
 測定周波数の範囲と測定方法、表示分解能をすこし整理です。私の備忘録です。
測定可能な周波数帯で7〜8桁の分解能が得られるようにしましょう。

最初にダイレクト測定で周波数レンジを調査したのち、各測定周波数範囲別の
測定条件で詳細測定にはいるようにします。
表示の桁数を変えなければ、周波数レンジを微妙にまたぐような状況になっても、
表示が乱れることは少ないでしょう。必要な表示数は
 nn nnn nnn.nnn nnn n
ですから20桁必要です。LCD2004でちょうどです。

測定周波数
(レンジ)
測定方法 標準測定モード。
1sec
10MHz以上 ダイレクト測定 nn nnn nnn Hz
10〜1MHz レシプロカル測定
(分周 1/1E6)
 n nnn nnn.n Hz
1MHz 〜100kHz レシプロカル測定
(分周 1/1E5)
  nnn nnn.nn Hz
100kHz〜10kHz レシプロカル測定
(分周 1/1E4)
  nn nnn.nnn Hz
10kHz〜1kHz レシプロカル測定
(分周 1/1E3)
   n nnn.nnn n Hz
1kHz〜100Hz レシプロカル測定
(分周 1/1E2)
     nnn.nnn nn Hz
100Hz〜10Hz レシプロカル測定
(分周 1/1E1)
     nn.nnn nnn Hz
10Hz〜1Hz レシプロカル測定
(分周 1)
     n.nnn nnn nHz
1Hz以下 パルス幅測定       n.nnn nnn nHz 

とりあえず動いたけど・・・・

とりあえずレシプロカルモードで動くようになりました。
固定小数点の演算も大丈夫のようです。
まだ、有効桁数を考えた表示などは行っていません。、


動くには動きました。でも・・・・

固定小数点の計算に、Cコンパイラの演算ライブラリーを組み合わせて使おうかと思っていましたが、
途中でやめました。というのも、加減算はできてもキャリーフラグがありません。キャリーは作ろうと思えば
そんなに難しくないのですが、途中で面倒になって96ビットの演算を、そのまま2進数で
行いました。そのため演算回数は無茶苦茶多いです。8ビットまとめて演算すれば1/10くらいに
納まるだろうな〜。おかげで、計算時間はカウントしてから、周波数値まで換算するのに
80msほどかかります。まあ、測定に2秒程度かかるので気になる速度ではありませんが・・・・、PCから比べたら
亀のような速度です。まあ8ビットCPUの限界ですね。RaspiのPICOでも使えば早くなるでしょう
 さて、あとは仕上げにかかりましょう。

一旦、無理やり完成 2021.8.9

最近PICOに興味が移ってしまって、こちらの周波数カウンターの進捗が止まっていましたが、
このまま未完にしておくと、何をしていたか忘れてしまってゴミになるコースまっしぐらなので、
まずは使えるようにまでソフトを完成させました.本来はパルス幅の測定までの含める予定でしたが、
簡易版としてダイレクト測定モードとレシプロカル測定モードの2種だけ実装です.


一応ソフトを完成させました.


ダイレクト測定モードです. 1MHzの測定です.


レシプロカル測定モードです.有効桁数はとりあえず無視です.

レシプロカル測定モードでは有効桁数を考えた表示をしたいところですが、
そこまでは面倒なので、小数点以下6桁まで無条件で表示させることにしました.
1uHまでの測定ですが、まあそこまで気にする用途はあまりないだろうな〜.

でも1Hzの時計用のクロックの計測には使えるでしょう.

1Hz測定時では1uHまでの計測分解能が得られます.

形にまとめました 2021.8.11

とりあえず5VのACアダプタを差し込めば、スタンドアロンで動くように形に納めました。
とりあえず、これですぐにゴミになることはないでしょう。


とりあえず形に納めました。電源と信号ケーブルを差し込めば測定ができます。
写真はレシプロカル測定モードで16MHzの発振器の周波数を測定している状況です。

(おしまい?)