2023-09-11 13:35 — asano
カテゴリー:
今回は...... PLLシンセサイザ関係ではあるのですが、ちょっと脱線してみます。
実験用に作った基板にはPLL ICの初期化用にAVRマイコンを搭載しており、VCOの実験用にD/Aコンバータも搭載しています。マイコンにはカウンタ・タイマも載っているのでちょっとソフトウェアを追加すれば周波数カウンタ機能も実現できそうです。
外部に周波数カウンタを接続すればいいではないかと思われるかもしれませんが、D/Aコンバータの出力を変化させながら周波数を測定できればVCOのF-V特性を自動的に測定できる可能性があります。
ということでまずは可能性を探っていきます。
周波数は簡単には1秒間のパルス数を数えれば良いわけですが、カウンタの桁数が多く必要になる上に測定時間も長くなるので、16ms間のパルスを数えて16で割ることでkHz単位の値を得ることにします。
これには16msを数えるタイマとパルスを数えるカウンタが必要になります。ATmega164には8ビットのものが2つと16ビットのものが1つありますので、8ビットのTimer/Counter 0を16msのカウントに、16ビットのTimer/Counter 1をパルスのカウントに使用することにします。
まず16ms(ゲート時間と呼びます)ですが、実はビット数が足りません。仕方ないので 8MHz ÷ 64(プリスケーラ) ÷ 125 で1msを作り、これをソフトウェアで16回数えることで16msを得ています。
パルスの方は約4MHz(65535 ÷ 16)までですが、AVRのカウンタはシステムクロックの1/2までしか動作しないので(最終的には不足ですが)とりあえずの実験には十分です。
16ms毎にT/C 1を読み出しクリア、8を足して4ビット右シフトすることで四捨五入的な効果を得ます。
あとはこれを10進表示するだけですが、ここでも除算が必要になります。16進表示しておいて変換はPC側でとも考えたのですが、M÷NはMからNを何回引けるか数えるという原始的な方法で変換することにしました。10進表示は10で割った余りで下の位から求めて反転することが多いですが、それだと引く回数が膨大になってしまうので10000で割って1000で割ってと上の位から求めています。
これで4MHzまでは測れるようになりました。でも実用にはまだまだ足りません。これ以上はそもそもAVRに直接入力できないのでハードウェアの追加が必要になります。
そこで74HC393を1/16のプリスケーラとして挿入しました。これで理論上は64MHzまで可能になります。
ソフトウェアは1/16処理をやめればそのまま直読できます。ただ1カウントがそのまま見えてしまうので1/16処理は残したいところです。
そこでゲート時間を16ms→256msに延長します。16ビットのカウンタでは足りなくなるのでオーバーフロー割り込みを用いてソフトウェアで8ビット足します。
次回はいよいよVCOのF-V特性を測ってみます。
Add new comment