DSPラジオチップを弄ってみる 【2020.12.18】 |
ちょっとコロナGoTo騒ぎで、そちらに費やす私の自由時間の消費が増えてしまった(笑)ので、あまり進んでいないのですが、DSPラジオネタをスタートしておきます。
もともと、何故、DSPラジオをいじり始めたかというと、夏ごろに遊んでいたアナログ無線機のトラブル続きに嫌気がさしていたからです。このアナログ部を、なんとか簡単な構成で置き換えられないかぼーっと考えていて、いろいろ情報を漁っていたら、引っかかったのが、1チップDSPラジオだったというわけです。
どうも、ラジオ界隈(というのがあるのか知りませんが)では、Silicon Labの1チップラジオはかなり以前から、いろいろトライされていたようで、AM/FM用途はあったのですが、SSBも受信可能なものは無くて、つい数年前にSi4735のファーム書き換えでSSB受信が可能になったのが最初のようですね。PWZはこのあたりの経緯にまったく無頓着だったので追えてなかったのですが、マニアの間では熱心にフォローされていたようです。
昨今では、SSOP-24ピンのSi4735に対して、SOP-16ピンという扱いやすいパッケージのSi4732A10というチップが安く手に入るようになって、実験とかも格段にやりやすくなりました。これなら、私も「お遊び」に参加できそうです。ということで、Si4732A10からいじり始めることにしました。
Si4732A10(左/上)とSi4735(右)
右の4735はかろうじてチップ名が判読できる
ちなみに入手先はまたしても支那です(笑)
この世界というと、GitのPu2clrというサイトが聖地のようです。この中にあらゆる情報が綺麗に整理されています。それこそ、チップの評価ボードの回路図からそれ用ソフト、UIも含めたAll in Oneのラジオができるソースまでそろっています。これはいじってみないわけにはいきません。ということで、これをベースに始めてみます。まずは、
① SSBの受信能力がどれほどのものか確認し、夏ごろに遊んでいた移動用機器の受信部に適用可能か探る。
② ①とは別に、このチップのオールインワンラジオを作ってみる。
③ できればソースをいじくりまわして、①、②のカスタマイズを目論む
という課題を立てて始めることにしました。とりあえず、チップの動作を見ていくことにします。それには評価用ボードが要りますね。上記のサイトではSSB受信のできる評価機として、以下のような回路図が提示されています。
Pu2clrオリジナルの回路図
唖然とするほど簡単な回路ですね。上記サイトのオリジナル回路ですが、Arduinoを3.3VのPro miniから5VのNanoに変更するので、I2Cのレベル変換回路(有名な2N7000のやつ)と、チップをSi4732A10に変更しています。これで、MF~VHFmまでのオールモード受信が可能となっちまうなんて本当にびっくりです。あまりにびっくりなので、チップの詳細を知りたくなります。で、検索すると、チップの概要がすぐ入手できます。下記のようなブロックダイヤがありますね。
Si4732A10 ブロックダイヤ
これを見ると、一言で言って「素晴らしい」ですね。Si5351のクロックオッシレータの時は、最後まで、ぶつくさ(文句ばかり)言っていましたが、果たして、このSi4732A10はどうでしょうか?入力はLNAの後にI/QミクサーとNCOでイメージリジェクトミクサーを構成して、一気にベースバンドに落としてA/D変換されてあとはDSP処理です。ベースバンドと書きましたが、よく見るとゼロIFではなくて、Low
IFの記述が見えるので、実際の処理はそうなっているのでしょうね。
このIFがいくらの周波数なのかの明記がないのですが、このあと、ちょっと手荒な方法で探ることも考えましょう。ダイレクトサンプルなのか、あるいは、バンドを限っているので、ハーモニックミクシングしているのか、興味は尽きません。このあと、いろいろいじってみる楽しみがありますね。
このチップは、なんと内部のファームが書き換えられるらしく、それがパッチの形で件(くだん)のサイトに提示されています。これもI2Cラインで簡単に書き込みできますから、すごいですね。ゆくゆくはパッチの中身も見て見たいのですが、そこまでスキルが追い付くか心配です。さて、まずは、習うより慣れろということで、評価用ボードを作ります。
Si4732A10評価ボード
チップ搭載基板の裏もアースが張ってある
この写真はクロック用Xtalが上面にあるが、本来は基板の下で、
チップ搭載基板が交換できる構造
評価ボードといってもオリジナル回路にある通りの単純なものです。Arduino NanoとSi4732A10と少々のペリフェラルパーツが乗っているだけのものです。こんなもん、楽勝だろうと思ったのですが、思わぬ苦汁をなめてしまいました。Si4732-A10チップは当初はこちらで合計4機用意したのですが、不注意から実験中に2機を撃墜してしまいました。最初のものは、I2Cラインをモニタしていて、不意に電源とどこかのピンを接続して、鎮魂になり、もう一つはクロックが発振していないように見えたので、外部からクロックを「注入!」しようとしてこかしてしまったようです。
なんとも無知の極みでしたが、1号機はルーコンを調べるうちにI2CとDSP間I/Oを破壊したみたいです。2号機はクロック部破壊でしょうか?いずれにしましても、このデバッグ中にチップ入手元のFALの堀江様には大変に親切なサポートをいただきました。DSPラジオの初心者としては、大いに感謝しています。
そんなこんなでしたが、再三のチェック(こんな回路で失敗こくのはヘボの極みという声はおいておいて)の結果、なんとか動くようになりました。Arduinoのスケッチは
SI4735_03_POC_SSB
という奴で、ArduinoのSi4735ライブラリに入っています。これで、基本的な動作はターミナルソフトを起動すれば、そこで操作させることができます。
テラターム起動後イニシアル表示
この画面が出ればSi4732A10の起動OKになります。Helpでコマンドの種類を参照できます。
コマンドに対する反応の様子
上記の図は、ヘルプにあるコマンドを実行しているところです。実行結果はXコマンドで確認できますから、コマンドの応答を見ていれば、どんな動作かは分かると思います。
ここまでくると、もう受信ができるようになります。なお、この評価ボードはSi4732A10の動作確認のために、ピッチ変換基板ごと交換できるように配慮しています。そのため、ピンヘッダーとピンソケットでコネクターを形成し、その周りおよび裏面にアースをしっかり形成して、RF的にも配慮しています。ネットを見ていると、このあたりの配線処理はとてもRFを扱ってるとは思えないものも多いのですが、実は、RFの処理はイメージリジェクトミクサまでで、あどはディジタル処理だから、いい加減でもいいんだ・・・・・・・・・・とは考えたくないですけど。
次に動画を・・・と思っていたのですが、現在、机上が古典管3C24アンプ関連で埋め尽くされていますので、それのケリがついたら、動画を撮って次回にでもアップしようと思います。ちょっとお待ちください。
・・・・・・・・・・・・・・・
ところで、この受信機は、テラタームの動作を見ると、NCOは最小ステップが1KHzで、SSBの場合はこれでは話にならないので、「BFO」を微調整させることでチューニングします、BFOの最小ステップは25Hzのようなので、SSB受信に十分な分解能を持っています。
ここで、ちょっと不思議に思ったのは「BFO」ってなんだ?ということです。SSBのパッチの中身がわからないので、どういう動作をしているのかわからないのですが、LOW IFとあるので、その周波数で受信信号をフィルタリングしたあと、実際にIIRフィルタとかNCOでも使ってBFO周波数の信号を生成して、IF信号に乗算でもしているのだろうか?と考えるのでしょうかね。
受信であればヒルベルトフィルタの段数が少なくても(イメージ受信耐力が劣化する欠点はありますが)、なんとか、このチップにはいる規模ではないかと思っていました。それができるのであれば、BFOなんて実際にDSP内にNCOを作らなくても、イメージリジェクトミクサーに注入されるNCOの周波数ステップを細かくすれば事足りると思っていました。PLLと違ってNCOの「微小な」ステップ幅を変えるのは楽で、位相ステップ値を変えるだけですから。
というのも、もし、受信狭帯域フィルタを通したあとにBFO信号を乗算するなら、BFOを3kHz離れとかにすれば信号はLOW IFの受信フィルタ(例えばBW=2.2kHz)の「遥か外に出て」受信できないはずなのに、そんなことは全然なくて、BFOが4kHz離れでも5kHz離れでもSSBを受信できます。なので、この受信ICのSSB復調は、実際にBFOを生成しているのでは「無い」のではないかと思っています。とすると、ヒルベルトフィルタ、あるいは複素フィルタと微小周波数ステップ&粗い周波数ステップのNCOの組み合わせになるのかなぁ?なんて考えたりもします。実際はどうなのでしょう?(一回取り消しします:12月.23日)
おっと、皆さんのキライな能書きを垂れ始めたので、ここで我に返りました。といっても、長くなったので、次回の予告でもして中断したいと思います。次回は、諸特性の測定と、オールインワンラジオに関して書いてみたいと思います。
オールインワンラジオの様子
詳細は次回に
<特性とAll in One Radioについて> 【2020.12.27】
さて、DSPラジオの特性をざっくりと把握して、今年のまとめにしたいと思います。各項目ごとに下記のごとくコメントしていきます。
【1】感 度
SINAD=10dBを得る受信入力電圧を感度と規定します。以下の表のようになります。
バンド毎感度
BAND | 3.5 | 7 | 14 | 21 | 28 |
10dB SINAD を得る受信入力(µVrms) | 1.7 | 1.2 | 1.4 | 2.2 | 1.8 |
これを見ると、SSB受信用の「ラジオ」としては十分な受信感度を有していることがわかります。これが、「小さなDSP入り1チップ」で実現できているのは、昔を知るおっさんとしては殆ど「驚愕」の領域です。チップのアンテナ端子は1:4のステップアップトランスを入れているとはいえ、この感度値は大したものです。もっとも、都市雑音の小さいハイバンドにおいては、もう少し感度を補うように、小ゲインのプリアンプを付加してもいいかもしれません。ただし、その場合は、トップにしっかりとしたBPFを前置することが必須になると考えられます。
なお、この回路では、入力インピーダンスは、50Ωよりかなりかさ上げされているようで、SSGを入力トランス端から離して無負荷状態での解放電圧と、トランスを接続した場合の負荷状態での電圧振幅がなんと変わりません。なので、上記感度はXμVrms@50Ωということではなく、SSG解放電圧と同等と考えていいと思います。そう考えると、かなり高感度に仕上がっていることがわかると思います。
【2】受信入力レベルvsSINAD特性
入力を上げていくと、高い入力レベルでは飽和して、とたんにSINADが劣化してしまうラジオは多いです。なので、入力レベルに対応した、SINADを測ってみたのが以下の図です。
受信入力 vs SINAD
入力を上げていったときの飽和SINADは37dBと、まぁまぁのレベルです。40dB近い値が、入力が高い状態(~0dBm)でキープできるのは、こんな小さなチップとしては素晴らしいことだと思います。
【3】受信入力レベル vs RSSI
入力に対して表示されるRSSIレベル(dBμV)の表示です。入力レベルは0.3dBの振幅精度を持つMS2830で校正してありますから、表示値との違いは、感度のところで述べた入力インピーダンスと、入力トランスの昇圧が関係しているはずです。
受信入力レベル vs RSSI表示
このRSSI表示は、シリアルモニターで見ていると、かなりレスポンスが遅く、入力レベルを変えても、じわーっとしか変わりません。これは次に述べるAll in Oneラジオにおいても同様でした。
【4】復調帯域
本当は、【3】の受信入力レベル表示が正確であれば、これを使って、主帯域制限の様子を60dBとか、70dBといったダイナミックレンジで測ることができるのですが(事実、RedpitayaやSDR-3とかではそうやって測ってきた)、今回のチップは、大きな振幅の信号を受信バンドパス帯域の外に持って行っても、BPFの減衰量で減衰して表示するということはなく、ほとんどそのままの強い信号表示なので、残念ですが、この測定ができません。実は一番見てみたかった特性でしたが、この測定は叶いませんでした。ということで、簡易的に様子を見たのが、下図です。
通過帯域の様子
これは復調ノイズ帯域が、受信パスバンド帯域によって決まるので、その様子をみたというところです。簡易的ですが、パスバンドが変わる様子はわかります。ただし、減衰域の傾きをみてみないと、どの程度の処理をしているのかはわかりません。ちょっと残念ではありますが。
【5】BFOの動き
特性測定とは違いますが、ちょっと、ここでBFOに関して書いておきます。前回の最後のほうのツブヤキ部分(修正してペンディングした)に関して、再度触れておくことにします。これ、言葉で説明するのがシンドイので、以下の図を見ながら説明します。
BFOの動きと受信周波数の関係(推測)
まず、BFO周波数オフセットがゼロの状態で、キャリアをLSBで受信すると赤丸のところ(左側)に「[BFOがあるかのような」復調動作をします。ここで、「BFO」を動かすとき、BFO周波数をマイナスに振らすとパスバンド帯域がBFOのシフト量だけ、周波数の高い方にシフトします。ただし、BFO周波数のパスバンドに対する「位置関係」は変わりません。なので、BFOをマイナスにシフトすると復調信号の周波数は上がります。この様子を青い矢印で示してあります。シフトしたBFO周波数をもってこのラジオの受信周波数とするなら、BFO周波数を変えると、受信周波数そのものが動くということになります。BFO周波数の制限は、少なくとも5kHzオフセットまでは動作します。この時、真の受信信号は帯域外に追いやられるので、当然のことながら、減衰して受信できなくなります。LSBで説明しましたが、USBの場合も同じような動作になります。
上記の説明はわかりやすいように、アナログ受信機の「BFOなる言葉と概念」を使っていますが、このDSP受信機の動作は、BFO信号を生成しているのではないことは、ほぼ確実でしょう。SSBの復調は、ウィーバー方式、複素フィルタ方式、あるいはヒルベルトフィルタを用いた直交復調方式等で行っていて、BFOは使っていないと思います。そして、周波数の微調整を「BFO」という表現で、従来のアナログ人にもわかりやすくアピールしているのでしょう。しかして、BFOはNCO(数値制御発振器)をBFOステップ周波数で設定した周波数でステップ的に変化させているだけにすぎないのでしょう。でないと、BFO周波数に応じて、パスバンドでみた受信周波数が変化し、BFO周波数の周波数位置関係が不変な理由が説明できません。ということで、これ以上はくどくなるので一旦終わりにします。
【6】対妨害波特性ともしかしてLow IF周波数を見つけた??
RSSIとAGC動作が不思議なおかげで、正確な妨害波耐力を測るのは困難なのですが、ざっくりとスプリアスレスポンスを見ておきましょう。この妨害波にはXtal発振器で7100kHzのものを使います。これをSSGとか、信号自体にスプリアスがあるものを使うと、何を測っているかわからないからです。
まず、Si4732ラジオの受信周波数を7100kHzに設定して、-30dBmに設定したXtalOSCの信号を受信します。当然、きれいに受信できますので、この状態で、受信周波数を7000~7200kHzに変えて、スプリアス応答があるか確認してみます。まずは、私のメイン機でスイープしてみると、この周波数範囲ではスプリアス受信はありませんでした。ということは、Xtal発振器にも、へんなスプリアスが付随していないということがわかります。
この状態で、受信機をSi4732に変えて同じような動作をさせてみます。すると、以下の周波数(1kHzステップでしか見ていない)でスプリアスを受信することがわかりました。
7100~7200kHz : 7109、7132、7164、7196 kHz 7000~7100kHz : 7078、7070、7046、7036 kHz 紫文字は32kHzの整数倍だけ7100kHzから離調した受信スプリアス |
この強度はRSSIが当てにならないので(強信号が通過帯域外にあると、まるで表示が不正確)、どうといえませんが、SINADで言うなら15~20dBくらいは得られるような強度で受信できます。このSINADは復調周波数を1kHzになるように(HP8903でSINADが測れるように)BFOで追い込んで測っています。これはどのようなメカニズムが想定できるでしょうか?
まず、特徴的なのは、どうも32kHz間隔で受信できてしまうようです。例外もありますが、この規則性がかなり見られます。これって、もしかして、Low IF周波数ではないだろうか?との考えが頭をよぎります。受信周波数からLow IF周波数だけ離れた強い信号(ここでは-30dBm)が入ってくれば、リジェクトできずに反応してしまっても、こんな小さなチップでは仕方がないのでは?と思います。ちなみに妨害が無視できる受信レベルはというと25dBくらいのATTが必要だったので-55dBm近辺でした。感度に対する比較(相対値)は60dBくらい取れているので、まぁよく頑張っているとみてもいいのかもしれませんが。
ただし、このことは、若干の不都合があります。というのも、受信周波数から32kHz(と32*N kHz離れた)強い信号はもろ、妨害になるということです。これは、かなり気を付けてみないといけません。
さて、そろそろ、長くなってきたので、実はまだまだ書きたいこともあるのですが、一回切り上げて、チップの特性から実際のラジオについて触れておきましょう。 前回のアップの状態から、電源レギュレータを追加して、単独で動作させることができるようにしています。
最近の写真
といってもレギュレータを付けて独立動作させているだけ(笑)
このボードは、左側がSi4732A10の評価用ボードで右側がAll in Oneラジオという構成です。評価用ボードでは、支那から仕入れたチップが動くかどうかの確認用です(笑)。拡張基板にピンジャックをつけていて、基板毎に交換可能にしてあります。コントローラはArduino Nanoで、これからのI2Cライン等はスライドSWで切り替えるようになっています。ラジオとして完結するように、ロータリエンコーダ、機能設定用タクトSW、OLED表示器、AFパワーアンプを搭載しています。
実は、このAll in Oneラジオの基板(写真真ん中上)はこちらの好意で頂いたものです。最初のチップをまとめて購入したので、お礼ということなのか、ご厚意でβ版の基板と周辺部品を送っていただきました。現在では、ここで販売もしているようですので、必要であればアクセスされるといいと思います。実際に作り上げる資料もこの販売元のサイトにありますので、簡単に組み上げることが可能です。
ちなみに、このソフトはArduinoのSi4735ライブラリのうち
SI47XX_02_ALL_IN_ONE_OLED
というのを動作させています。最後に動作している動画を以下に示します。
バンドを7MHzに設定して、モードはLSBで聞いています。アンテナ端にはBPFを特に設けず、アンテナ直結としています。主にBFOの動きにチューンして録画してみました。土曜の昼とあってか、けっこう盛況で、通過帯域が3kHzではサイドがかぶってにぎやかになりますので、2.2kHzにしてあります。ま、それなりに受信していることがわかるかと思います。
1kHzステップで周波数変更をするときに、シリアルで周波数信号を設定し、NCOの周波数が変わるときに「ざざ!」とうるさくて、チューニングフィールは最悪に近いです。周波数微調整はBFOモードにして25Hzステップでロックインしていきます。「ラジオ」なので仕方はありませんが、やっぱりこのステップ切り替えはちょっといただけませんね。
この動画を見ると、実は気になる点が一つあります。それの状況と原因については、ある程度推定しているのですが、また、日を改めて記していきたいと思います。また、Si4732をいじり始めた理由は、今夏に中途で放置してしまった移動用機器に使えるかどうか調べるためでしたが、これについては、もう少し深堀をして最終判断を下そうと思っています。
さて、今年はこの辺でUPを終了したいと思います。
皆様良いお年をお迎えください。