Computer & RF Technology

Si5351Aを使った超小型SDR: FriskSDR

FriskSDRは、主要なパーツに汎用MCUのSTM32F303、コーデックにTLV320AIC3204、ローカル発振器にSi5351Aを使った0-50MHz程度までカバーするダイレクトコンバージョンな広帯域受信機です。復調はソフトウェアにより信号処理。ミキサにアナログスイッチを使っているので歪みも少ないという特徴があります。

ぼちぼちと製作してきましたが、おおむね動作するようになってきています。AM、SSB(LSB/USB)の復調とAGCが動作しています。アマチュア無線を受信するにはちょっとゲイン不足を感じますが、外部のアンプを使わず、アナログスイッチによるミキサとコーデック、そしてMPUだけで受信機が構成できているのはなんだか新鮮です。

前回も書きましたが、修正が必要だった大きなポイントはCを追加したことです。ミキサからコーデックのADCに差動で入力する箇所にCを入れず直結としていたのですが、ここの入力にはオフセットが少なからずあるようです。ADC手前に入っている入力アンプのゲインを下げた状態では信号を取り込むことができていたものの、アンテナからの微小な信号を取り込むべく入力ゲインを上げるとすぐに飽和してしまいました。そのため、仕方なくコーデックの入力にCを入れる(差動を2チャネル分なので4つ)ことで解決しました。基板にスペースが無いので1005サイズのC(100nF)を、配線をカットした上に無理やり詰め込んでいます。こうして見ると、1005に比べると1608がとても大きく見えます(赤枠が追加した1005)。

Cを入れたことが理由で問題となるのが、入力信号にDC成分が取り込めなくなってしまうことです。IとQの2相信号として取り込んでいますので、本来ですと48kHzサンプリングならチューニングした周波数から-24kHz〜+24kHzと正負両方の帯域をフルに取り込めるはずなのです。ところがDC=0Hz付近が入らなくなったことにより、そのど真ん中に穴が空いてしまうのです。100nFとコーデックの入力インピーダンスで決まる帯域分が欠けることになります。SSBを受信しようとする場合は、キャリア成分が無いので問題にならないのですが、AM放送の受信では影響があります。取り込んだ信号はキャリア分が不足することになるため正常なAM復調ができなくなること、具体的には放送周波数とわずかに周波数がずれますので、そのずれた分が耳障りなビブラートのようなビートになってしまうのです。

そのため、AMの復調では特別な工夫が必要です。SSBをWeaver方式で復調際に周波数シフトをしましたが、それをAM復調でも行うことにしました。AM放送の帯域幅9kHzをカバーするよう10kHzずらしてチューニングを行います。これならキャリアが失われてしまう心配はありません。そしてずらした分をもとに戻すよう周波数シフトを行います。帯域外信号を削除するようLPFを通してから、各サンプルから瞬時振幅をsqrt(I^2+Q^2)で計算して復調信号を得るようにします。LPFは次のSSB復調と同じくIIRを使ったフィルタです。

SSBの復調は、インターフェース誌で紹介したLPC4370のSDR受信機と同じくWeaver方式です。サンプリング周波数が8kHz→48kHzですので、IIRフィルタを再設計しています。それ以外はほとんど同じです。MPUはLPC4370とSTM32F303で違っていますが、Cortex-M4Fという点は同じですのでコードも同じです。雑誌ではDDCでのチューニング周波数をずらしていましたが、FriskSDRでは0Hz付近の穴に嵌らないよう信号処理で周波数シフトを行います。周波数シフトは、LPFの手前と後の2回、同じ周波数幅で逆方向に行うことになります。

AMとSSBが実装できたことになりますが、あとはFMを実装したいところですが、狭帯域FMはAM放送と同様の帯域の穴にさえ気をつければ実装できるはずです。FM放送もチャレンジしてみたいところなのですが、帯域が広すぎて48kHzのサンプリング周波数ではカバーできません。問題の帯域の穴については、FM変調という条件(例えば振幅が一定である等)を付加すると補正できるような気がするのですが、ちょっとやり方が思いつきません。

その他、もう一つ問題になりそうなのが、RF入力への信号漏れです。測定してみると-60dBmくらい漏れています。H-mode Mixerは高い直線性を確保できるとのことなので、それを確認したくて入力にはアクティブ素子を入れずトランスだけにしていました。トランスを介してミキサに直結しているだけですので予想はしてはいたのですが、案の定です。改善の方法ですが、漏れてくる信号の周波数は受信する周波数とほぼ同じになりますので、フィルタでは阻止できません。プリアンプを入れるのが定石ではあるのですが、せっかくの直線性を台無しにはしたくないところです。一方、トランスよりもアンプのほうがコスト的にはメリットがあります。現時点で達成できている性能を確認してから、次の構成を検討したいと思っています。

ジョンソンカウンタに使った74AHC74ですが、これもトラブルになりました。Si5351で発生する周波数を上げていくと、突然スペクトラムが乱れます。受信機のチューニング周波数で34MHz付近、Si5351Aはその4倍の132MHz付近での現象です。当初はSi5351Aの設定可能範囲を外れておかしくなっているのかと考え、Si5351Aのトラブルシュートに数日費やしたのち、よくよく動作を見てみると74AHC74の動作が追いついていなかったのでした。データシートを見てみると3.3V動作では Fmax=125MHzとなっていました。対策としてはロジックICのシリーズをAHCに代えて74LVC74にしますとtyp値でFmax=250MHzとなり、こちらは十分な速度があるようです。AHCは充分速いという先入観がありましたが、5Vに対応したシリーズを3.3Vで使う場合はそう速くはないようです。一方LVCは上限が3.3Vですが、低電圧での性能が充分に確保されているようです。標準ロジックICに、数多くのシリーズが用意されている理由が理解できました。実際のところは実験で確認する必要があります。

74AHC74の動作速度

74LVC74の動作速度

それから受信機に必須のAGCですが、TLV320AIC3204のADC側に付属しているAGCがかなり有効に機能することがわかりました。もともとはマイクゲインの自動調整用なのですが、マイクの代わりにミキサ出力がつながっていてもそれなりに動作します。アナログで47.5dB、デジタルで20dBあわせて68dBもの調整幅があります。AM放送ならこれで十分なようです。SSBでは信号処理でフィルタを掛けますが、コーデックのAGCだけでは隣接チャネルの抑圧が生じるのでもう少し工夫が必要かもしれません。実験ならそれなりに使えています。AGCは、OFF/Slow/Mid/Fastを選択できるようにしてみましたが、コーデックのパラメータの調整で済ませています。AGC OFFの場合はマニュアルゲイン調整をできるようにしてみました。

さて、いつもケースには入れず作りっぱなしで、実験して満足して終わってしまうのですが、FriskSDRというからにはFriskに入れないわけにはいきません。ようやくFriskケースを加工して入れてみました。加工はドリルとリュータを使いました。余計な仕切りを削り取って、コネクタの穴、そしてレバースイッチ用の切り欠き、LCD用の窓を開けました。

LiPo用コネクタの差し込み側が出っ張るのがミスしましたが、ぎりぎり納めることができました。次回修正版を作成する際にレイアウトを修正検討したいと思います。

液晶ディスプレイはケースの裏側になってしまいました。角穴のサイズもミスってしまいました。シールを貼ってこちらを表にして、アラを隠すようにしたいと思います。

どうせならスピーカも内蔵させれば良かったかもしれません。aitendoで見つけたマイクロスピーカが丁度入れられそうです。ミニジャックが切り替え型ではないので、このままでは付けられないのですが。

失敗したのは、電源スイッチを省略してしまったことです。格好を付けて、OFFの代わりにスリープ状態として、ボタンプッシュでの復帰を考えていたのですが、現在のレバースイッチの接続ではこれができないのです。スリープ状態からの復帰にはPA0-WakeUpをHにする必要があります。これも次回の課題です。

それから短波はともかくとして、AM放送ですら外部アンテナが必要なのは残念な点です。

LiPoを付けてみたものの、消費電流は現在70mA程度でLiPoは現実的ではありません。低消費電流な新しいデバイスSTM32L433CCT6の入手を画策中です。それまではUSBによる外部電源供給タイプとして使うのが現実的かと思います。

USBはデバックに使っています。PCからはCDCとしてシリアルのように使えますので、コマンドを入れたり状態を確認することができます。できればUSB Audioデバイスとして見えるようにしたいと考えているのですが、力尽きて今のところ及ばずです。USBスピーカとしては動作するようにはできたのですが、なかなか安定しません。もう少しもがく必要がありそうです。

リファレンス

comments powered by Disqus