ダイヤル表示器 その1
− DDM−R2R −
01版 2013.06.15
00版 2012.08.24
入力周波数をアナログメータにより表示します(*)。受信機の受信周波数表示に使用する分には、最近の送信機に要求される1Hzや10Hz代の指示精度は不要で、大よその受信周波数が分かれば良いという使い方なら気持ち良く使えます。又、昔からの糸掛け式ダイヤルにはレトロ観では負けますが、部材入手性、周波数指示精度の点では優ると思います。
(* : このアイデアは、周波数カウンタのバイナリー値をLED表示するJF1OZLさんのHP記事(Simple frequency counter)からヒントを頂きました。)
最近の自作無線機の周波数表示は、以下の表示が一般的となっています。
・7セグLED表示器による表示
・液晶表示器(LCD)による表示
ブロックダイヤで表すと下図のようになります。何れも、PIC等によるソフト処理が主流です。
「カウント処理部」は、設計者により処理の細部は異なりますが、基本的に以下の処理を行なっているようです。
○周波数Fの入力信号を一定期間Tの間ゲートを開いて入力する(=F×T=S)。
○N進カウンタによりオーバフロー数を計数し、計数値Qとカウンタの残りRから
T期間に入力されたパルスの総数Sを求める。
S=Q×N+R (1)
○パルス総数Sとゲート時間Tから入力周波数Fを求める。
F=S/T (2)
ダイヤル表示器では、表示器として「アナログメータ」を使用し、表示データ変換処理部には「DA変換」を使用します。
「カウント処理部」は、処理方法として前述の処理部と同様、式(1)と式(2)より周波数Fを求め「表示データ変換処理部」へ渡す方法がオーソドックスかもしれません。
しかしながら、ここでは処理の簡素化のため、後述するように、式(1)の余りRのみを求め、その余りRから必要な情報をDA変換へ渡します。
ここで、DA変換入力ビット数について、具体例を挙げて考えてみます。
HF帯のアマチュアバンドの周波数幅は高々400kHzです。今、フルスケール400kHzのメータにより入力周波数を表示することを考えます。わかりやすくするためにダイヤル目盛の1目盛を1kHzとし、DA変換の分解能を100Hzとします。100Hzの増加に対して針の指示が1ステップ増加し、1目盛1kHzを10ステップで移動するということです。この時、メータの針がバンド幅400kHzを移動するためには、DA変換出力において
(400k/1k)×(1k/100)−1=3999
のステップが必要となります。この3999ステップを得るために必要な入力ビット数は、211<3999<212(=4096)より、12ビット以上あれば良いことが分かります。
アナログメータによるダイヤル表示器のカウント処理部において余りが利用可能であることを説明するために、話を前述の式(1)に戻します。
(1)式は、「SをNで割って答えがQで余りがR」である割り算式を表しています。余りRはその性質から、とり得る値が0から(N-1)のN個です。従って、未知数Sは得られたRに対して一意に定まりません。つまり、Rが得られた時、対応するSは無数(無限)に存在します。これでは正確な周波数表示ができないことになります。
余りRをダイヤル表示へ利用するためには、RとSが1:1に対応することが必要です。そこで、「Sの範囲をRが重複しない範囲に限定する」ことで1:1に対応させます。このように、取り扱う周波数範囲を限定する制約を取り入れることで、アナログメータ表示に割り算の余りを利用することができます(*)。
実際に余りを求めるには次の様に行います。
ゲート時間Tの間入力されたパルスをPビットカウンタによりカウントします。カウンタではQ回のオーバフローが発生しますが、不要のため無視します。T秒後カウンタに残った値が求める余りRとなります。余りRは、Pビットで表されます。
カウンタは以下の3つの補正のための初期値を与える必要があります。(詳細は省きます。)
1)希望する周波数においてメータ指示”0”とするための補正
2)入力周波数の表示範囲外検出のための補正(Rへのオフセット追加)
3)出力誤差の補正
* : 今回、敢えて余りのみを利用した理由は以下に依ります。
・アプローチとしてディスクリートによる回路設計から始めたため、ハード規模が少ない単純処理を目指したこと。
・C言語によるファーム開発が初めてのため性能に影響する割り込み処理(商を求めるためのオーバフロ-計数処理)
を極力避けたかったため。
以下の条件により、DA変換入力へ与えるビット列を求めてみます。
表示幅 : 200kHz
メータの1目盛 : 1kHz
ゲート時間T : 60.513ms
DA変換器の入力ビット数 : 12ビット
分解能は1/T=16.525Hz。表示幅200kHzの全ステップ数Lは
L=(200k/1k)×(1k/16.525Hz)-1=12101 (小数点以下切り捨て)
213<12101<214(=16384)により、DA変換入力は14ビット必要であることがわかります。この時、最大表示可能周波数幅は214/T=270.751kHzとなり、表示幅200kHzを満足します。しかし、入力ビット数14ビットは、DA変換器の入力ビット数を超えています。
ここで、DA変換器の分解能は約16Hzであり、1目盛1kHzに対して高過ぎ(*1)ますので、LSBから3ビット外し(*2)ます。これにより、求めるDA変換入力ビット数14-3=11ビットが得られます。因みに、この時の分解能は16.525×23=132.2Hzとなります。DA変換器の1ビット(LSB)は未使用とします。
(*1 : 分解能は、使用するメータの大きさと最小目盛間隔から、針の移動が視覚的に許容できる値とします。目安は1目盛10段階前後。)
(*2 : MSBを1ビット増やす毎に表示幅は2倍になり、LSBを1ビット削る毎に分解能は2倍粗くなります。)
上の設計例のゲート時間60.513msはPICのクロック4.332MHzを分周して得ています。このように、ダイヤル表示器は、数値表示ではなくアナログ表示のため周波数カウンタの様な10msや100msといった切りの良い値である必要は無く、PICのクロック等適当なクロックから分周して作ることができるという大きなメリットがあります。
PIC16F628Aを使用したダイヤル表示器のブロックダイヤを下図に示します。
ブロックダイヤ
ゲート制御信号(ゲートタイムT)は、CPUクロックの1/4をタイマ0のプリスケーラにより256分周、その後8ビットカウンタにより256分周して生成しています。
入力信号fiは増幅部で増幅・整形されてPICへ入力されます。PICでは、ゲートタイムTのゲート制御信号をタイマ0により生成し、タイマ1をオン・オフ制御します。ゲート制御された信号fi・Tをタイマ1の16ビットカウンタでカウントし、カウント終了時のカウンタの内容(割り算した余り)から必要なビット列を取り出して出力レジスタへラッチし、外部のDA変換器へ送出します。DA変換器ではアナログ電圧へ変換し、メータを駆動します。
図中の太枠内は全体処理の主要部分のイメージを描いたものです。○内数字は処理順を示します。
処理手順を以下に示します。手順は大まかな処理を示したものであり、ソフト処理の詳細手順を示したものではありません。
@ タイマ1の16ビットカウンタへ初期値を設定。
A タイマ0の8ビットカウンタへ初期値を設定しタイマ0カウント開始。
B ゲート信号を出力しゲートをオープン。
C タイマ0オーバフローIRQ発生待ち。→ 発生
D iRQ検出し、ゲートをクローズ
E タイマ1の16ビットレジスタから必要なビットを取り出し、出力レジスタへラッチ。
F PICの出力レジスタからラッチ出力された信号をDA変換し、メータへアナログ出力
G @へ戻る
Pickit3を使用してPICへの書込みを行うためのコネクタを実装しています。
TR1のコレクタのR7は、TR1ONとPGD信号のバッティング対策のためです。書込みの際はSIG入力無しの状態で行います。このときTR1は常時ONとなり、R7は接地された状態となります。この状態でPickit3からのPGD信号はR7負荷となります。PGD信号’H’(5V)でR7へ約10mA流れますが、Pickit3のユーザーズガイドによれば、出力ドライバは74LVC1T45、5V推奨値±32mAですので問題ありません(R7を大きくすると波形鈍りがひどくなるため現状値より大きくできません)。
また、PGC信号がDA変換回路のMSBへ接続されていますので、安全のため書込み時はメータを外しています。
2BANDの切替ができるように設定端子を設けています。但し、ファームでは使用していません。
メータ指示0以下、200kHz以上および100kHzの時LED点灯のためのコネクタCN3を設けています。
水晶発振回路でC2,C3がパラに接続されていますが、周波数偏差調整時、いろいろな値の組み合わせができるようにするためです。
D/A部は11ビットのR-2Rラダー型抵抗回路を採用しました。市販DACが結構な値段がすること、又、将来の入手性が不明でしたので、抵抗により組むことにしました。この部分には、誤差1%の金属皮膜抵抗を使用しましたが、通常のカーボン抵抗5%でも問題ないと思います。但し、誤差5%による実験は行っていません。
DDM-R2R回路図
R−2Rラダー型DA変換回路をwebで調べると、出力側の負荷はオペアンプによるインピーダンス変換回路が採用されているものが多いようです。しかし、今回は回路簡素化のため、メータと直結しています。
動作確認のため、まずはバラックで製作しました。
テスタを接続して動作確認動作確認後、プリント板を手作りしました。40何年ぶりのPT製作でワクワクしました。当時はパターンは手書きでしたが、今回はフリーソフトのCAD(PCBE)を使用し、両面基板用にライブラリを作成しました。生基板へのパターン転写は、web上で話題になった「熱転写方式」を採用し、何度か失敗を繰り返しましたが、非常にきれいに転写できました。個人でこれだけ綺麗に製作できるとは考えてもいませんでしたので感慨一入です。
レーザープリンタとインクジェット用プリンタ用紙FUJIFILM「画採」はネットオークションで入手しました。
尚、熱転写方式によるプリント板製作について、JR3TGSさんが分かりやすくまとめて公開されており、大変参考になりました。
両面基板は多少のズレは生じましたが、なんとか使えました。ズレはプリンタ用紙へ与える転写時の水分、熱による伸縮が原因の様で、サイズが大きいほど精度を出すのは難しくなります。この辺のコツがまだつかめていません。
部品実装面
パターン面
7MHzバンド専用のファームを作りました。主な機能は以下の通りです。
・表示バンド : 7MHz
・表示幅 : 200kHz
・下限検出 : 7000kHz以下検出時、メータ指示"0"固定
・上限検出 : 7200kHz以上検出時、メータ指示"フルスケール"固定
・LED表示 : 7000kHz(下限)、7200kHz(上限)及び7100kHz±1kHz
大まかなフローを以下に示します。
ソフト処理フローチャート
言語はCで、統合開発環境はMAPLABです。Cコンパイラは全く初めてでしたので、日本語取り説が付く、ソースブースト6.0(スタンダード)を使用しました。
Cは今回が初めての挑戦で、興味津々、楽しみながら進めることができました。プログラムの記述は初心者の記述そのものです。ソースを載せる予定でしたが、とりあえずHEXファイルのみ以下の「製作データ」へ載せて置きます。
測定系と出力電圧特性を下図に示します。グラフの縦軸(出力電圧)の単位は[mV]です。
測定系
出力電圧特性
測定は、SG周波数7455kHzから20kHzステップ間隔で変化させた時のB点出力電圧をデジタルマルチメータで読み取りました。粗い測定ではありますが、問題無い特性のように見えます。10Hz及び100Hzステップの細かい変化に対する目視試験でも問題はありませんでした。
7466kHz入力で、約350mVo-pです。
表示精度と針の移動の細かさは、何れも満足できる結果となりました。
実際にSGとメータの代わりにアナログテスタを接続して500μAレンジにセットし、SGから10kHzステップで周波数を変化させて針の指示を見てみると、目視のため主観が入りますが、非常に正確に表示している様に見えます。
また、SGから100Hzステップで周波数をゆっくりと変化させて10倍スコープで針の移動を観測すると、微かにステップ状に移動するのがわかります。しかし、微々たる変化なので少し離れたところから見る分には全く不自然さはなく、アナログ的に変化しているように見えます。
小さなメータで表示する場合は、D/A入力のビット数を減らしても良いようです。
・プリント配線確認図(PDF)
・版下(実装面)(PDF)
・版下(パターン面)(PDF)
・ファームウェア(HEXファイル)
入力周波数をアナログメータで表示する方法と製作例を紹介しました。
今回は7MHzシングルバンド用として製作しましたが、マルチバンド用にはバンド情報を入力する多数のIOが必要となり、IO数の削減が課題です。この対処版として、D/Aにシリアル入力IC(MCP4922)を使用したダイヤル表示器(DDM−MCP)を製作しました。「ダイヤル表示器 その2」をご参照下さい。