« 2016年6月 | メイン | 2016年10月 »

2016年7月16日 (土)

DSPラジオ(7MHz AM用)

<カテゴリ AM受信機 >

オールソリッドステートのPWM方式AM送信機が出来ましたので、これとペアで使うAM専用受信機が欲しくなってきます。 昔は高1中2のスーパーを筆頭に1V1とか0V1とか超再生の受信機も人気がありましたが、今作るのなら、はやりのDSPでしょう。 ということから、DSPラジオ用チップを入手して、なんとか、7195KHzのAMの交信が聴ける受信機が出来ましたので、紹介する事にします。

Dsp_rx0

Dsp_rx_lcd

上が、DSPラジオの全体構成です。 タクトSWとLCD部分は既成の基板を糸ノコで切り取って使っていますが、メインのDSPチップとPICマイコンは左側の蛇の目基板の中です。

左は、7195KHzを受信した時の表示で、VOLレベルが22(最大31)、Sが71dBuV(S9+31dB)、 IFバンド幅12KHz(4,8,12KHzを選択可)です。

LCDは160x128のカラーTFTです。後日、Sメーターをグラフ表示する事にします。

Dsp_rx_pcb

DSP IC はKT0915という中国製です。このICはFM,MW,LW,SWをカバーします。 SSOP16というパッケージですので、変換基板が必要です。 手持ちの20Pin用をつかいましたが、ICを販売しているaitendoで専用変換基板も扱っていますので、これを手配すべきだったと後悔しています。

周波数スパンは、AMについては1KHzまで対応していますので、7MHzのAM受信用ならなんとか使えます。 このICの出力は16Ωのヘッドホーン用のアナログ出力ですので、これをPWMパワーアンプで2Wまで増幅し、4Ωのスピーカーをドライブします。 PWMパワーアンプは秋月で入手したPAM8012という基板付のチップです。 ICの出力端に直接スピーカーをつなぐ事もできますが、SW受信時にノイズになる可能性が大きいので、チップコイルとチップコンデンサでLPFを作りスピーカーにつないでいます。 実際の使用状態でスピーカーのリード線を動かしてもノイズは変化なしです。 このDSPチップをコントロールするのはPIC24FV32KA302という16bitのマイコンです。 ソースコードはKT_AMFMdrv.cというファイル名でNET上にアップされていますので、それを参考にしながら、作成しました。 特にAMモード時の音声歪は、このソースコードがないと対策出来ないようです。なぜなら、データシートに出てこないアドレスのレジスタを書き換えていますので。

また、AMの周波数を設定するレジスタ(アドレス0x17)の15bit目を1にしないと、設定した周波数の受信はしてくれません。(データシートには0としか書いていない)

IFバンド幅を選択できるようになっていますが、その帯域は2KHz,4KHz,6KHzとなっています。しかし、この数値はオーディオの帯域幅で、通信型受信機で言うIFバンド幅は上下側波帯を含む帯域ですから、表示的にはこの2倍の数値としています。

信号強度はdBmで表示できるように計算式が提示されていますので、これを一般的なdBuVに換えてあります。 内部雑音の影響もあり、17dBuV以下は表示しません。 完成度が上ってきたら、この数値表示は止め、バーグラフのSメーターに変更しましたので、この状態のソースコードは有りません。

当初、7MHzオンリーの受信機にするつもりでしたが、DSPの制御の仕方を勉強していると、最初にFMが動作可能となってしまいましたので、FM,MW,7MHzの3バンド仕様としてあります。ただし、MWはバーアンテナが有りませんので、外部アンテナとしてロングワイヤーをつながないと聞こえません。

回路図 DSP_AM_RX1.pdfをダウンロード

I2Cの制御プログラムはPIC24Fの汎用として、NET上に公開されているものを利用しました。 この関数を使って実際にDSPチップに書き込んだり、読み出すプログラムはKT0915のデータシート通りとしました。 LCDの駆動は当ブログのLCDアナログメーターのプログラムを移植しました(元プログラムは未公開)。 使用しているフォントはアンテナアナライザーの自作のソフト(未公開)からの流用です。

実際に使用した結果、発見された問題点は以下です。

・S9+70dBくらいのアンテナ入力を入れても音声の歪は有りません。 いくら強入力に強いと言っても、送信中の過大入力からDSP ICを保護する為、ダイオードによるリミッターを実装してあります。

・送信機が過変調となると、パチパチと言ったおおきなデジタルノイズが聞こえます。

・感度がイマイチですが、プリアンプを入れてもS/Nが悪化するだけなので、現状とします。

・AMの受信中に大きなノイズが入った場合、AGCのリカバリタイムが恐ろしく長い。 色々調べましたが、対策案無しです。もし、この現象が起こったら、電源SWをOFF/ONしてDSPをリセットすると直ります。

・無信号状態からいきなりS9+40dB以上のキャリアが入力されると、「ガー」と言った異常音が0.5秒くらい発生します。 多分AGCが段階的に効いていく途中のデジタルノイズなのでしょうが、通常のラジオとして使う場合、全く問題にはならないですが、通信の時は、相手が相当強力な信号なら、送信開始する度に発生しますので、いやなノイズです。

実際に7195KHzをワッチした感じは、変調のピークでパチパチ音が入る事以外、了解度は比較的良好です。 TS-850の6KHzフィルターの了解度を100とすると、このDSP受信音は8KHzフィルターのとき、    90くらい、12KHzのとき、95くらいです。 感度が悪いのが、かえってS/Nを良くして、S9以上の信号なら、DSPの方が了解度が良い事もあります。 ちなみにTS-930のAMモードは70くらいですから、TS-930よりはかなり聞きやすいです。

変調のピークでパチパチと言うのは、AGCの状態が変化するようなキャリアレベルの変動が有った時に、ゲイン切り替えを行いますが、この時に発生するノイズではないかと推測されます。 従い、一定のキャリアレベルが継続しないSSBを聞くと、当然モガモガで復調はできませんが、パチパチノイズが発生しっぱなしになります。 しばらく7195KHzをワッチしていると、パチパチノイズが異常に発生しているAM局が結構います。 このパチパチノイズがある局をTS-850で聞くとかなり歪んだ音です。 オーバー変調の局がすぐに判る恐ろしい受信機になってしまいました。 ちなみに、きれいな変調をかけている局は大きな声を出しても、不思議とパチパチノイズは発生しません。

また、深いQSBがあると、例え放送局の信号でもパチパチ音が出るようです。

Smeter

Sメーターをバーグラフタイプに変えてみました。 TS-850のSメーターを見ながら実験的に合わせこんだもので、計算された信号強度とは合致しませんが、良しとしました。 バーグラフの分解能は2ドット単位となっています。

ただ、問題もあります。周波数を変更した場合、そのショックノイズでバーが最大レベルまで振れてしまい、非常に目ざわりです。 音声は、MUTE対策をしてあり、音としては聞こえませんが、この信号強度を表すデータは野放しのようです。 そこで、周波数を変更した直後はSメーターを更新しないようにし、信号強度の数値が安定したころにSメーターを駆動開始するよう、ソフト的に対策しました。

ハードによるスタンバイSW機能を付けていますが、ここをGNDに落として受信機をMUT状態にすると、Sメーターがフルスケールになります。 この辺も、まさかSメーターを付けるとは考えていないDSP設計でしょうから、Stand-byになったら信号強度を示すデータをゼロにセットしてメーターが振れないようにしました。

このStand-byから復帰したとき、DSPの内部処理がデフォルトに戻る部分があるようで、Sメーターの指示が変わったり、ノイズが増えたりします。そこで、復帰した直後にDSPを再度イニシャライズし、バンドや周波数をStand-by前の状態に復帰させています。

セットを金属ケースに収納し、ノイズ対策の為、デジタル回路とアナログ回路を分離したところ、反対にノイズが増えました。 今まではデジタルノイズでAGCがかかり、それなりにゲインを抑制していたので、目立たなかったのですが、ノイズ対策をしたら、かえってDSPとPICが通信する時のノイズが気になるようになりました。 そこで、一番ノイズが大きかったSメーターのデータ転送を、FMモードのときのみ禁止しました。 ただ、FMモード時Sメーターが振れないのも寂しいですから、FMモードに切り替えた時、もしくはFM周波数の変更が有った場合のみ、数秒間だけSメーターデータを読み出して表示させ、これを保持させています。 MWやSWの時は、もともとノイズが多くてあまり気になりませんのでMAINルーチンが1周するごとにSメーターデータを更新しています。

次に、音量の調整も変化が有った時のみDSPへデータを送信することにしました。

最新のソースコードです。 AM_RX2.cをダウンロード (2017/1/9 修正)

フォントデータ2種類です。Font7.hをダウンロード  fontF.hをダウンロード

Am_rx_front

Am_rx_back_2

Am_rx_top

上の画像は左から、フロントパネル、バックパネル、トップパネルです。

リアのMコネクタは7MHz、MW用、赤の端子はFM用です。

実際に固定運用でQSOに使ってみましたが、パチパチノイズには閉口しました。 このノイズで了解度が落ちます。 そこを必死で聞き分けようとしますので、非常に疲れます。

移動用の簡易受信機くらいにしかならないですね。  現在はローカルのFM放送受信用としています。

2017年2月

最近、7195KHzを受信していると、綺麗に変調をかけている局との交信は例え深いQSBがあっても了解度が下がるわけでもなく、実践で使えます。 将来、トランシーバー化する検討をする事にします。

2018年1月

Sメーターの信号レベル定義を見直し、景気よく振れるようにソフトを変更しました。

AM_RX3.cをダウンロード 

2018年8月

この7MHz用受信機にクリコンを内臓させ50MHz受信を追加しました。 この50MHzを追加したソフトで、パチパチノイズを完全では有りませんが、かなり改善出来ています。

INDEXに戻る

2016年7月 7日 (木)

周波数カウンターの製作

[自作 PIC TCXO AN592]

ATUやアンテナアナライザーを製作する中で、周波数カウンターも作ってきましたが、色々実験している内に、汎用の周波数カウンターを必要とする場面が結構発生します。 その為に、アンテナアナライザーの中に外部の信号の周波数をカウントする機能を用意したのですが、このカウンターの入力インピーダンスが50Ωの為、信号源を過負荷状態にしてしまい、場合によっては発振周波数が変わってしまうという不都合がありました。

そこで、入力インピーダンスが比較的高く、40Hzくらいから500MHzくらいまでを簡単に測れる周波数カウンターを新たに作る事にしました。

周波数カウンター回路図 Fcounter0.pdfをダウンロード

使うマイコンはジャンクBOXの中に余っているPIC24FV32KA302という16bitのマイコンです。単純なカウンターですので、8bitでも十分実用になる物をつくれますが、アンテナアナライザーの製作で、開発資産がいっぱいありますので、今回のカウンターは16bitで進行します。

目標の仕様は、40Hzくらいの低周波から500MHzまでのUHFまでをそこそこの精度でカウント出来、入力インピーダンスは10KΩ以上で感度も100mVくらいとしました。

ハード的には、プリスケーラ無しの場合、1Hz単位で10MHzまで、10Hz単位で50MHzくらいまで測れる回路と、1/64のプリスケーラーを付けて1MHz以上1GHzまで100Hz単位で測れる回路をスイッチで切り替えて実現させます。 それぞれの回路にデュアルゲートのMOS-FET BF1211によるLNA(ローノイズアンプ)を設けて所定の感度と周波数帯域を確保します。

Fcfront

Fcback

-

2個のBNC端子の内、左側がAF,HFを1Hz単位ではかれる入力端子、右側が一応1GHzまで100Hz単位で測れる入力端子です。どちらの端子が有効かは真ん中のスナップスイッチで切り替えます。 UHFで動作するプリスケーラーは低い周波数が苦手で、簡単に手に入るプリスケーラーは、2GHzまで測れても最低周波数は100MHzくらいというICが多いのですが、今回使った富士通のプリスケーラーMB501Lは、最高1GHzながら、最低1MHzという、ハムにとっては非常に利用しやすい帯域となっています。 ただし、すでに廃番品種ですので、入手はプレミアム価格を覚悟必要です。

カウンターのゲート時間の管理は、それぞれのカウンター動作モードごとに、独立したカウンター関数を用意し、個別にゲート時間を微調整する事にしています。 校正はFT991から10120.00KHzの信号を送信し、すべてのモードでこの表示になるようにソフトを調整してあります。

Fc40hz

Fc500mhz

左上は、自作の正弦波発振器で40Hzを出力したときのカウント値です。31Hzとカウントしています。 この原因を調べたところ、本来1秒のゲート時間が必要なのに、100msecのゲート時間でカウントした後、10回分の合計を表示した事により、本来のカウント値は小数点付でなければなりませんが、カウント値に小数点以下は含まれませんので、小数点以下を切り捨てて合計した為と判りました。 よって、1Hz単位表示の場合、1秒のゲート時間に変更しました。 この変更の結果、40Hzと表示するようになりました。

右上は手元のCAA-500を最高周波数にした時の表示です。CAA-500の表示との差は1KHz以下ですが、どちらが正しいか判りません。 しかし、私が使う範囲内ならこれくらいの精度で十分です。 また、使用しているプリスケーラーの仕様の関係から、VUHF端子に入力が無い場合、ランダムノイズを計数しますので、表示がでたらめになります。 

ソースコード F-counter.cをダウンロード

C言語で書かれた周波数カウンターは特定の周波数で誤差が出ます。特に、カウンターのbit数が不足する為、ソフトで作成されたカウンターを連結して、カウントと条件判定をCで記述した場合、このソースでもその処理に1.2usから2.4usくらいの時間がかかりますので、この間に、ゲート時間がきたりしたら、その分だけ誤差になります。 精度を上げたい時は、アセンブラで記述しますが、それでも誤差が半分か1/4くらいになるだけで、決定的な対策にはなりません。 誤差が許容できない時は、外部回路によるゲート制御しかないようです。 実験的に、タイマーのオーバーフローを割込みで処理してみましたが、かえって誤差が多くなりました。 また、温度補償を行っていない水晶発振回路の周波数はかなりいい加減です。

2018年10月

DDSによる信号発生器(SG)を作ったので、50MHzを発振させ、このカウンターで測定してみたところ、2.5KHzも多くカウントします。 この誤差をPPMで表示させると、50ppmとなります。 通常の水晶発振器の誤差はこのくらいはありますので、水晶発振子と外付けの負荷容量だけで作成した発振回路の誤差としては当たり前の誤差となります。 今、50MHzのAM送信機を自作中ですが、この周波数を測定して2.5KHzの誤差では、全く周波数カウンターの意味がありません。 そこで、もう少し精度を上げたカウンターに作り代える事にしました。

今までは、最低でも50MHzまでは外部プリスケーラーなしでカウントする為、非同期カウントが可能なTimer1で周波数カウントをしていますが、このカウンターは16bitです。 最大999MHzまで100Hz単位で表示するには最低24bitのカウンターが必要であり、16bitのTimer1がオーバーフローする度に、ソフト的に作成した16bitのカウンターをインクリメントしていました。 このソフトでインクリメントする最中にゲートOFFの時間になると、即カウント誤差が生じ、これが50ppmくらいの誤差となっていました。

一方、この16bit PICの中には、ハード的に連結出来る32bitのカウンターが2系統ありますが、いずれも同期カウンターの為、その最大カウント周波数が10数MHzという条件があり、とても50MHzはカバーしません。 しかし、カウンター入力部に接続されたプリスケーラーの分周比を大きくすると、例え同期式カウンターであっても、カウント可能な周波数は50MHz以上にする事ができます。

An592

そこで、マイクロチップがかなり以前に公開したAN592という技術資料で紹介されたプリスケーラー内のデータを読み出す技法を使う事にしました。 左の回路図がAN592によるプリスケーラー残数を読み出す為のハード接続図です。

AN592の解説はWEB上に沢山ありますので、それを参照して下さい。 この技法は、まだPICの規模が小さく、8bitのカウンターしかなかったころ、内部にある8bitのプリスケーラーを使い、トータル16bitのカウンターにした後、カウント終了後にプリスケーラーの入力にパルスを加え、プリスケーラーがオーバーフローし、タイマーが1カウントアップするまでのパルスの数を数える事により、プリスケーラーのカウント値を知る事ができ、このプリスケーラーの値とカウンターの値を連結した16bitのカウンターから、単位ゲート時間内にカウントした周波数を知る事が出来るものでした。 

左上の回路図はカウントしたい信号を470Ωのシリーズ抵抗経由で、カウンター入力に加え、かつこの入力をRA2という端子を出力にして、外部からの信号をブロックした後、RA2にパルスを出力してプリスケーラーをインクリメントするものですが、470Ωの抵抗が災いして、最高カウント周波数は20MHz位にしかなりません。 

An592gate1

そこで、左に示す様に、AN592が解説する技法を外付けのNANDゲート回路で実現し、この最高周波数が低下するのを防ぎます。 この方法も先人がすでにWEB上で紹介しています。

IC7Aの入力Aにカウントしたい信号を加え、入力Bでこの信号をゲートコントロールします。 カウントソースは入力BがHの時だけ通過しますので、入力Bをカウンター用のタイムゲートで制御してやればOKです。 一方IC7Bは、IC7AがOFFの時、入力BをH→L→Hとすることで、カウンター入力にワンパルスを転送できますので、このパルスでプリスケーラーをインクリメントさせます。 このようにゲート回路を組み、プリスケーラーの分周比を1/64にすると、470Ωの抵抗の場合、22MHzくらいまでしかカウントしなかったのが、110MHzくらいまでカウントするようになりました。

次にタイムゲートを作成する為に、ディスクリートの水晶発振回路をTCXOに変更します。 TCXOは秋月で2個、350円で売られていた、26MHzのセイコーエプソン製ですが、そのまま使うには多少難点があります。 まず、SMT用の極小品ですから、ハンダ付け作業はかなり気を使います。 うっかりすると、端子と金属カバー間をショートさせてしまいますので、かなり先細のコテが必要です。 また、出力が0.8Vpp以上となっていますが、実測で0.9Vppくらいしかなく、そのままでは、PICへ入力できません。 従い、TCXOの出力を1石アンプで増幅する必要があります。 もちろん、このTCXOの電源の為に3.3VのLDOも必要となります。

回路図 Fcounter2.pdfをダウンロード

Txco_pwbこれらのハード変更を行ったのが、左の基板です。

追加したTCXOもNANDゲートもLDOも米粒より小さいサイズなので、良く見えません。 NANDゲートは5pinパッケージに2入力NANDゲートが1個だけ入った物を2個使っています。 LDOは不動在庫していたトレックス製の4pinパッケージ品をつかいましたが、これもTCXOの1/4くらいのサイズです。 これらを、拡大鏡を使いながら、基板にマウントして、テスターで導通確認を行い、動作確認するまで足かけ2日かかりました。

そして、10MHzの標準電波BPMでゼロビートを取ったDDSの信号をこのカウンターに入力し、指示が10,000,000Hzに最も近くなるようにゲート時間を調整した結果が下の写真です。

10mhzcnt

ゲートタイムのカウントはタイマー4,5による32bitカウンターで行いますが、C言語で作成されたプログラムの実行時間はかなり長く、これらの実行時間を含めて、1秒とか0.1秒の時間を作る必要があります。 従い、ゲートタイムカウントモードに入ったら、全ての割込みを禁止した上で、タイマー4,5によるカウント時間は、計算で得られる時間より短めに設定し、細かい時間調整はNOP命令の数で行います。 このようにしても1Hzの差は解消できませんでしたが、それでも0.1ppmの誤差まで詰める事ができました。 50MHzの場合5Hzの誤差ですから、問題なく使う事ができます。

ソースファイル F-counter2.cをダウンロード

カウンターのゲートタイムはプリスケーラーなしのとき1秒と0.1秒のみです。 1秒の場合、1Hz単位、0.1秒の場合、10Hz単位で測定できます。 100Hz単位ならゲートタイムを10m秒に、1KHz単位なら1m秒に設定し、データの更新を早くできますが、100Hz単位、1KHz単位いずれの場合でもゲートタイムは100m秒とし、計測データの未表示部分を切り捨てています。 1/64プリスケーラー付の場合、640m秒のゲートタイムのみで、100Hz単位、1KHz単位いずれも同じゲートタイムです。 このようにすることで、不要な表示チラツキを抑制できます。 また、1秒ゲート以外は全て5回分の計測値の平均を表示させています。

このカウンターは1GHzまで測定できますが、信号源がないので、実際の誤差は判りませんでした。 手元のCAA500mk2を接続すると505MHzくらいまでは測れます。プラスマイナス1KHzくらいは一致していますが、このカウンターが正しいのかCAA500mk2が正しいのかは???です。 逆に言えば、CAA500mk2のカウンターは以外と正確であると言えます。

2019年1月

ゲート時間を一定にしておき、表示桁のみ切り捨てる方式の場合、例えば、99.9の小数点以下を切り捨てると99になりますが、これを1/4分周器を通した後、測定すると24.9から9を切り捨てる事になり結果は24となってしまいます。 ここは25と表示して欲しいので、切り捨てではなく四捨五入する事にしました。 この例では99.9は100と表示され、1/4分周後の表示は25となります。 

修正したソースファイル F-counter3.cをダウンロード

2019年5月

表示に使っている99円のLCDの最上位桁の文字が欠けて数字にならなくなりました。 そこで、このLCDを16文字2行のLCDへ交換する事にしました。 LCDのサイズが大きくなったので、ケースは100円ショップで入手したアクリルケースで作り直しです。

32bitカウンター+6bitプリスケーラーにより、周波数カウント用のカウンターは38bitとなりましたので、カウントそのものは1GHzでも1Hz単位で行えますが、PICの上限周波数が110MHzですので、1Hz単位で表示出来るのは110MHzまでです。

LCDがi2cインターフェースに変わりましたので、PICのi/oの変更も必要となり、ソフトもLCDドライブを全面的に変更する事になってしまいました。 このカウンターを使う時、いつもDC12Vの電源を用意する必要がありましたが、今回、ケース変更に伴い、電池を内蔵させ、どこでも使えるように改良しました。消費電流は50mAくらいですので、追加した電源スイッチにより、1年以上は電池交換なしでつかえそうです。

Fcounter3

LCDに追加した機能は、選択されたBNC端子がA かBかを表示する事。 それに電池の電圧を小数点を省いて表示させます。 左の写真は、50MHzのDDS(すでに26MHzのTCXOに変更し、10MHzでゼロビートを取った改良品)の信号を測定した時の表示ですが、6Hzの誤差で表示しています。 TCXOの温度ドリフトはゼロではありませんが、当初より大きくドリフトはしていないようです。

右端に086と表示しているのは電池の電圧で8.6Vである事を示しています。この電池はすでに3年以上経過した低周波発振器用に使っていたのですが、使用頻度が少なかった為、まだ9Vちかくあります。 カウンター回路は6Vの電圧まで動作しますので、さらに1年くらいは使えそうです。

変更した配線図 Fcounter4.pdfをダウンロード

変更したソフト F-counter_i2c-LCD.cをダウンロード

 

  

2019年10月

しばらく使っていましたら、「Hz」の文字付近の下に、白い雲が現れるようになってきました。 LCDのガラス面に歪が発生しているようです。 コントラストも薄くなってきたようですので、再度このLCDを交換する事にしました。

Ng_lcd

New_lcd

今までのLCDはI2Cインターフェースでしたが、手持ちのLCDは4bitパラレルのインターフェースしか有りませんので、過去のLCDのソフトが使えるように、またPICのi/oを変更し、かつ、パネル化粧も、新しいLCDに合わせて作り直しました。

左が、その完成品のパネルとなります。

LCDは秋月から購入したものでしたが、コントラストがかなり改善されました。

電池を実装したまま、外部DC電源のプラグをDCジャックに挿入すると、電池は回路から切り離されるのですが、同じDC電源で動作している発振回路の周波数を測る為に、プローブをつなぐと、このプローブのGNDラインが電源スイッチをショートする事になります。プローブをつないだまま、外部電源からのDCプラグを抜くと、電池から電流が供給されっぱなしになり、1日以上放置すると、電池が液漏れしてしまいました。  対策は、電源スィッチを2回路にし、OFF時は、DCジャックのGNDラインも切断する事にしました。

最新の配線図 Fcounter6.pdfをダウンロード

最新のソースプログラム F-counter_ACM1602K-LCD.cをダウンロード

簡易型の7MHzのAM送信機専用の周波数カウンターも作成しました。 配線図とソースコードは

VXO再検討 を参照下さい。

INDEXに戻る