ちょっとTea Time!? PICO(RP2040)の憂鬱?あ、PICのカウンタを使おう!(周波数カウンタ) 2025.7.3
PICO(RP2040)を使いだして、PICに対する性能差から、なかなかPICを使おうという気が起きないのですが、
現時点でPICにあって、PICOにない機能があります。それも、重要な機能です。
PICOには外部クロックのカウンターがない!PICには16Bitのカウンターがある!
この差は大きいです。16Bitでも外部クロックのカウンタがあると、周波数カウンタなどが気楽に作れます。
このカウンターを外付けで準備しようとなると、8Bitのカウンターロジック2個と、それを読み出す8ビットのシフトレジスタが
2個の合計4個のロジックICがすくなくとも必要になってきます。そして、面倒なのが、その配線です。
なぜ、PICOにカウンタがないのだろう?まあ、愚痴を言っても始まりません。
ひょっとしてあるのだけれど、気付いていないだけかなあ?
とりあえず、PICOにはないとして、なにか、簡単にカウンタが使える良い手はないかなあ〜?
ん?PICをカウンタとして使えばいいのでは?
ふと、外付けのロジックICの代わりにPICを使えば、1個で済みそうなことに気付きました。
そして、なにより配線が数本で済んでしまいます。
まあ、PIC側にプログラムを書く必要がありますが、大したものにはならないでしょう。
こんな感じでPICを外部カウンタとして使えば、配線がもの凄く楽です。
PICの内部カウンタは16Bitですが、オーバフローを検知することで16Bit以上のカウンタにすることも簡単です。
PICのカウンターの最大動作周波数は50MHz程度ですが、16Bitのカウンタだとオーバフローするタイミングは
1.3ms毎です。したがって1ms毎にオーバフローをチェックすれば十分です。具体的には、1ms前のカウンタ値
が現時点のカウンタより大きな値になっていればオーバフローしているとみなして、上位のカウンタビットを
+1します。
そうだ!周波数カウンタを考えてみよう!
PICを外付けカウンタとしてつかえるかの実験だけでは、おもしろくないので、
この際、ダイレクト計測とレシプロカル計測の両方がつかえる周波数カウンターを考えてみましょう。
ダイレクト計測 :一定時間内(たとえば1秒間)のクロックを数える方法
レシプロカル計測:入力クロックの周期を計測して、周波数を換算する方法
ダイレクト計測の場合は、カウントした値を表示するだけですが、レシプロカル計測を行う場合は、
すくなくとも倍精度の演算が必要になってきます。しかし、PICOだとC言語で倍精度の演算ルーチンが
ついているので簡単です。以前はPICで同じことをしようとして、結構苦労しました。
レシプロカル計測ができると、低周波数でも高精度が測定ができます。
極力回路は簡単に!
以前に作った周波数カウンターではICは都合、14素子ほどつかいました。
が、今回はできるだけ数を少なくしてみました。全部で7素子ほどですから、半分になりました。
内訳はロジックIC3個、CPU2個、レギュレータ1個、そしてSi5351モジュール1個です。
結構シンプルな回路図になりました。
部品を配置してみました。空いたスペースは入力のアナログアンプなどを実装しましょう。
予備テスト
今回の回路では、部品点数をすくなくするために、ちょっとトリッキーなことをしています。
その機能がうまく動くかどうかの事前テストです。これが、予想通りでないと回路図はすこし書き直しです。
なにを確認するかというと、Si5351の設定可否です。下記のような設定ができるかどうかの確認です。
Si5351 OUT0 |
Si5351 OUT1 |
Si5351 OUT2 |
備考 | |
ダイレクト計測用 | 5kHz | HIGH | HIGH | U37474 P5:Q出力は1sのクロックゲートとして使用 |
レシプロカル計測用 | LOW | 40MHz (OUT2の逆相) |
40MHz (OUT1の逆相) |
U37474 P5:Q出力は40MHzのクロックとして使用 |
(つづく)