ワンボードSDR CentSDRを試作中です
昨年旧フリスクケースサイズの超小型SDR受信機FriskSDRを試作しました。少々無謀なプランでしたが、当初の目論見通り無事に動作させることができました。ただ、さすがに小さすぎで、製作していただいたりするにはハードルが高過ぎでした。もうすこし常識的なサイズの設計も欲しいと思っていたので、今回あらたに基板を作ってみることにしました。Nanoより大きいので、CentSDR(仮称)としています。

seen from T1

seen from United States
seen from Israel
seen from Philippines
seen from China

seen from Singapore

seen from United States
seen from Indonesia
seen from United States
seen from United States
seen from China
seen from China

seen from United States

seen from Germany

seen from T1
seen from Germany
seen from Malaysia
seen from Türkiye

seen from Malaysia
seen from Canada
ワンボードSDR CentSDRを試作中です
昨年旧フリスクケースサイズの超小型SDR受信機FriskSDRを試作しました。少々無謀なプランでしたが、当初の目論見通り無事に動作させることができました。ただ、さすがに小さすぎで、製作していただいたりするにはハードルが高過ぎでした。もうすこし常識的なサイズの設計も欲しいと思っていたので、今回あらたに基板を作ってみることにしました。Nanoより大きいので、CentSDR(仮称)としています。
受信機としての基本的なアーキテクチャはFriskSDRとまったく同じです。ローカル発振器としてSi5351aを使い、ジョンソンカウンタで2相信号を作成、アナログマルチプレクサをミキサとして使います。
もともと53x27mmの基板サイズに詰め込んでいたものを、大きな基板(といっても58x88mm)にゆったりと再配置した感じです。使っている主要な部品はSMDの同じものです。
ディスプレイはカラーグラフィックLCDを採用することにしました。LPC-Link2やNanoVNAで使ったSPI LCD(ILI9431)が実績があるので、またこれを使ってみることにします。操作はロータリーエンコーダのワンノブスタイルです。
MCUは、FriskSDRと同じくSTM32F303の予定です。実時間処理しながらグラフィック描画をするにはMCUが非力ですが、全く不可能というわけではないはずです。
FriskSDRではCodec TLV320AIC3204のADCの前段にあるVGAのみをアンプとして使っていました。シンプルな構成で、たしかに受信機として動作させることはできていたのですが、正直ゲイン不足であることは否めませんでした。そこで今回は、ゲインブロックを追加で一段置いてみることにしました。さらに、RF入力部にはプラグインモジュールを挿せるようにしておいて、アンプを入れたり、フィルタやミキサを置いたりなど、いろいろ実験できることを目論んでいます。
基板の裏面にはシルクでブロック図を描いてみました。表側には対応する部品が載っています。絵に描いたような実装で、眺めるだけで原理がわかると良いなと思っています(ただ、図として見ると、信号の流れが右→左と少し違和感があります)。実験をしやすいよう各信号にアクセスするパッドを各所に設けてみました。パッドとブロック図がちゃんと対応しています。
ソフトウェアはこれからですが、まずは実績のあるChibiOSベースのものを移植することになると思います。
基板はすでに発注して、製造は完了したようです。試作が進んだらまたご報告したいと思います。
実は明日からのMakerFaireTokyoに出展予定です。今回のプロジェクトも展示したいと思っていたのですが、残念ながら輸送が間に合いませんでした。なので今回は新作の実物は展示が無いのですが、資料や、これまで作ったFriskSDRやNanoVNAご覧いただけます。もしお時間ありましたら、是非、東京ビッグサイトへ。ブースの場所はE08-06です。
参考
MakerFaireTokyo 2017 http://makezine.jp/event/mft2017/
Si5351Aの使い方と動作
Si5351AクロックジェネネータをFriskSDRのローカルや、NanoVNAの信号源として試用してみています。Si5351Aの仕様では、上限は200MHzまでとされていますが、実際に試してみたところ300MHzを越える周波数まで発生させられるようです。以前最初に試した様子を書きましたが、その後の知見をまとめておきます。
Si5351Aは、内部にPLLを二つ、さらにそれを分周した出力を三つ取り出すせるクロックジェネレータです。水晶と合わせて10x10mm以下の面積でコンパクトに実装することができます。
大変便利なチップなのですが、その設定は少しやっかいで、内部構成を理解していないとレジスタに与える設定値を決めることができません。最初の実験で試したように、Arduinoのライブラリは何種類かあるようですが、目的にはちょっと合いませんでしたので、参考にさせてもらいつつ、FriskSDRやNanoVNAを作るためにコードを作成してみましたので少し解説します。
Si5351Aは内部が二段構成になっており、前段のPLLと、後段の分周器(MultiSynth)を独立に設定しなければならなりません。PLLとMultiSynthは、それぞれフラクショナル(分数分周器)となっています。前段、後段それぞれに自由度があるので、同じ周波数を出力させるために、可能な設定は一意に決まりません。さらに、設定にあたっていくつか考慮しなければならない制約があります。
PLLとMultiSynthは似たような分数分周器となっており、その分周比は三つの整数を使って表現できます。
a + b / c
設定にあたってまず押さえておかねばならないのが、PLL側で生成可能な周波数が、600〜900MHzでなければならないことです。可変範囲が1.5倍の範囲ですので案外と狭いです。
一方、MultiSynth側にも制約があります。150MHz以上の出力を得るためには、1/4の固定分周比を使用する必要があることが明記されています(AN619 6p 4.2.2節)。では150MHz以下ならあとは自在かと思えば、実はまだ制約があり、分周比が8以下の分周比については、分数分周比が使えず、4,6,8の整数比の分周動作動作のみが可能となっています。PLLの下限が600MHzですから、150MHz以下を発生させようとすると、分周比を6を選択する必要があるのです。同様に、100MHz以下に設定したければ分周比を8以上に設定することになりますが、その範囲になるとMultiSynth側で分数分周比が使えるようになり、任意の周波数を設定する自由度がMultiSynth側に出てきます。そしてMultiSynthの分周の上限は1800ですので、600MHz/1800=333kHzで周波数の下限に達します。これ以下の周波数を設定しようとするなら今度はMultiSynthの後ろに用意されている2^Nの分周器Rを使う必要があります。Rは1/128まで設定可能ですから、下限は333kHz/128=およそ2.6kHzとなります。
以上のように、出力したい周波数範囲によって、設定の方針が違ってきます。まとめると次の様になります。
150MHz < Fout :MultiSynth=4とし、PLLを分数比で使い4xFoutに設定する
100MHz < Fout < 150MHz :MultiSynth=6とし、PLLを分数比で使い6xFoutに設定する
333kHz < Fout < 112.5MHz :1) MultiSynthを8以上任意(<=1800)の分数分周比で使用し、PLL側を整数比で固定する。2) MultiSynthを8以上の整数比Nで使用し、PLL側をNxFoutとなるよう設定する(PLLが600~900MHzに入るようNを決める)
3kHz < Fout < 500kHz :Rを適切に決めて、後は同じ
RFアプリケーションであれば、Rを使用する必要は無さそうです。
ちなみに設定可能な周波数のレゾリューションは、設定値や設定方針によって変化しますが、およそ数10Hz単位での設定可能です。分数部分のbとcは20ビットの幅を持っていますので、PLLまたはMultiSynthの片側だけ数10Hz程度。あるいは(面倒ですが)両者を任意に設定する気があるなら、もっと細かい分解能が得られます(これが適用可能な周波数領域は112.5MHz以下に限られます)。もちろん低周波数なら、Rを大きく取るとレゾリューションもその分細かくなります。実はCLK入力にも1,2,4,8の分周器があるので、PLL側の設定解像度を上げられるのですが、PLL分周器の設定範囲(15-90)から制約を受けます。実用的にはCLK分周器は使用する必要は無いと思います。
生成する信号の質を考慮すると、可能なら整数比を使うとスプリアスが減ります。整数比の場合に適用する特別なビットがレジスタにあります。分数比を使う場合でも、できるだけ簡単な比になるようにすると良いようです。
以上のことから、係数を決定するには次のような方法が良いと思われます。PLLとMultiSynthそれぞれについて、設定したい周波数と、水晶やその他の条件から、a,b,cを決めます。そしてb,cがなるべく簡単な比になるようユークリッドの互除法を使って分子分母の最大公約数を求め、既約分数にします。さらにもし20ビットの範囲に納まらなかった場合は、精度が犠牲になりますが数値を丸めます。
PLLの設定は下記のようにします。MultiSynthを固定分周比(4または6)に設定して、PLLを4*freqまたは6*freqに設定します。
void si5351_set_frequency_fixeddiv(int channel, int pll, int freq, int div) { int32_t pllfreq = freq * div; int32_t multi = pllfreq / XTALFREQ; int32_t num = pllfreq - multi * XTALFREQ; int32_t denom = XTALFREQ; int32_t k = gcd(num, denom); num /= k; denom /= k; while (denom >= (1<<20)) { num >>= 1; denom >>= 1; } si5351_setupPLL(pll, multi, num, denom); si5351_setupMultisynth(channel, pll, div, 0, 1); }
PLLを固定し、MultiSynthを可変する場合には下記のようにします。
void si5351_set_frequency_fixedpll(int channel, int pll, int pllfreq, int freq) { int32_t div = pllfreq / freq; // range: 8 ~ 1800 int32_t num = pllfreq - freq * div; int32_t denom = freq; int32_t k = gcd(num, denom); num /= k; denom /= k; while (denom >= (1<<20)) { num >>= 1; denom >>= 1; } si5351_setupMultisynth(channel, pll, div, num, denom); }
a,b,c(下記の式ではmulti,num,denom)を決めることができたら、下記の式に従ってP1,P2,P3を求め、それを8つのレジスタ(各8ビット)に配置します。
P1[17:0] = 128 * mult + floor(128*(num/denom)) - 512 P2[19:0] = 128 * num - denom * floor(128*(num/denom)) P3[19:0] = denom
それからレジスタ設定には順序があり、これに従わないと周波数切り替えの際にうまく設定されないことがありました(実際にハマった)。 データシート17pにある下記フローのようにします。
これらを合わせて、周波数の範囲により、設定方針を切り替えるため、例えば下記の様にします。
void si5351_set_frequency(int channel, int pll, int freq) { si5351_disable_output(); if (freq <= 100000000) { si5351_setupPLL(pll, PLL_N, 0, 1); si5351_set_frequency_fixedpll(channel, pll, PLLFREQ, freq); } else if (freq < 150000000) { si5351_set_frequency_fixeddiv(channel, pll, freq, 6); } else { si5351_set_frequency_fixeddiv(channel, pll, freq, 4); } si5351_reset_pll(); si5351_enable_output(); }
もし、周波数を可変する必要が無いなら、こんなコードは必要ありません。あらかじめレジスタ値を計算しておけば良いのです。Si5351AのI2Cは、自動インクリメント動作をするので、こんなデータを用意しておけば、まとめてデータを送ることができます。
static void si5351_bulk_write(const uint8_t *buf, int len) { int addr = SI5351_I2C_ADDR>>1; i2cAcquireBus(&I2CD1); (void)i2cMasterTransmitTimeout(&I2CD1, addr, buf, len, NULL, 0, 1000); i2cReleaseBus(&I2CD1); }
// register addr, length, data, ... const uint8_t si5351_configs[] = { 2, SI5351_REG_3_OUTPUT_ENABLE_CONTROL, 0xff, 4, SI5351_REG_16_CLK0_CONTROL, SI5351_CLK_POWERDOWN, SI5351_CLK_POWERDOWN, SI5351_CLK_POWERDOWN, 2, SI5351_REG_183_CRYSTAL_LOAD, SI5351_CRYSTAL_LOAD_8PF, // setup PLL (26MHz * 32 = 832MHz, 32/2-2=14) 9, SI5351_REG_26_PLL_A, /*P3*/0, 1, /*P1*/0, 14, 0, /*P3/P2*/0, 0, 0, // RESET PLL 2, SI5351_REG_177_PLL_RESET, SI5351_PLL_RESET_A | SI5351_PLL_RESET_B, // setup multisynth (832MHz / 104 = 8MHz, 104/2-2=50) 9, SI5351_REG_58_MULTISYNTH2, /*P3*/0, 1, /*P1*/0, 50, 0, /*P2|P3*/0, 0, 0, 2, SI5351_REG_18_CLK2_CONTROL, SI5351_CLK_DRIVE_STRENGTH_2MA | SI5351_CLK_INPUT_MULTISYNTH_N | SI5351_CLK_INTEGER_MODE, 2, SI5351_REG_3_OUTPUT_ENABLE_CONTROL, 0, 0 // sentinel };
void si5351_init(void) { const uint8_t *p = si5351_configs; while (*p) { uint8_t len = *p++; si5351_bulk_write(p, len); p += len; } }
上記を含めコードをgistに載せておきます。
https://gist.github.com/edy555/f1ee7ef44fe4f5c6f7618ac4cbbe66fb
ところで、以前スペクトラムはかなり綺麗と書きましたが、発生させる周波数によってかなり違いがあります。20MHz以下であればかなり綺麗ですが、周波数を上げるに従ってスプリアスが増えてきます。いくつかデータを取ってみましたので、参考に上げておきます。使っているのはNanoVNAで、ブリッジを通った出力なので、-10dBm程度となっています。水晶は26MHzのVCTCXOです。グラフの縦軸はdBと書いてありますがdBmです。
まずは以前も試した13MHz。Spanは6MHz、RBW10kHzです。2MHz上下に小さいSpurが見えてます。-70dBcくらいで、この周波数なら綺麗です。近傍の裾は測定系の位相ノイズです。
周波数をちょっと上げて20MHz。Spanは10MHz、RBWは10kHz。Spurのレベルがちょっと増えます。-4MHzにも出てきます。-62dBcくらい。
さらに上げて30MHz。かなりSpurが増えてきます。-60dBcくらい。
50MHz。あまり変りません。
100MHz。かなり増えてきます。-52dBcくらい。
100MHzからはSpan 50MHzを示します。RBWは500kHz。広くSpurが分布しています。
150MHz。Spurが-40dBcくらいですから、結構強くなってきました。Spurの位置は分数分周器の剰余の位置に来ますので、設定周波数によって大きく変化します。
200MHz。
300MHz。逆にSpurが減りました。
ちなみに260MHzだともっと綺麗になります。水晶から丁度10倍の周波数で、整数比の動作となっているからです。
ちなみに近傍の様子です。それぞれSpan 5MHz、RBW 10kHzです。
20MHz
100MHz
200MHz。ここまでは、近傍はほとんど差がありません(測定系の位相雑音程度)。
300MHz。近傍の位相ノイズが増えてきます。さすがに仕様範囲外ですので。
312MHz。このあたりが限界でした。位相ノイズが相当多くなっています。無理をしている様子がわかります。一方Spurのほうは逆にレベルが下がっています。
ここまではキャリア周辺を示しましたが、方形波ですからハーモニクスが大量に出ています。100MHzに設定し、1GHzまで見た場合こんな感じになります。もちろん奇数次が主ですが、偶数次もある程度存在します。
以上、Si5351Aの設定方法と、信号の質について紹介しました。設定方法は他にも選択肢があるので、合わせて信号の質は変化すると思いますが、傾向は参考になると思います。
低い周波数での出力は比較的綺麗ですが、高い周波数では注意が必要でしょう。もちろん基板レイアウトによって差が出てくるはずです。特に多出力を活用する場合は注意が必要です。販売されているいわゆるブレイクアウトボードの類では、RF的には駄目そうなものもありますので注意が必要です。
驚いたのは300MHz超まで出力可能なことでした。さすがに信号の品質的にはイマイチなので注意が必要ですが、例えばVNAが目的であれば問題になりませんし、せっかくのこの能力を活用したいと思っています。
リファレンス
前回の実験 http://ttrftech.tumblr.com/post/138286883286/
Si5351Aを使ったFriskSDR http://ttrftech.tumblr.com/post/140556745841/
Si5351Aを使ったNanoVNA(実験中) http://ttrftech.tumblr.com/post/149867208596/
Si5351Aデータシート https://www.silabs.com/Support%20Documents/TechnicalDocs/Si5351-B.pdf
Sillicon Laboratories Application Note 619: Manually Generating an Si5351 Register Map https://www.silabs.com/Support%20Documents/TechnicalDocs/AN619.pdf
設定コードの例 https://gist.github.com/edy555/f1ee7ef44fe4f5c6f7618ac4cbbe66fb
Adafruitsのチュートリアル https://learn.adafruit.com/adafruit-si5351-clock-generator-breakout
Adafruitsのライブラリ https://github.com/adafruit/Adafruit_Si5351_Library
EtherkitのArduino向けライブラリ。これには任意周波数設定のためのコードが含まれている。 https://github.com/etherkit/Si5351Arduino
Maker Faire Tokyo 2016に展示します
告知を出すのが遅くなってしまいましたが、8/6と8/7のMaker Faire Tokyo 2016に出展します。今回の展示内容のメインはこれまで試作してきたマイコンベースのSDR受信機です。LPC-Link2を使ったSDRの実験を雑誌記事として紹介してきましたが、なかなか実物をご覧いただく機会がありません。実はこれまでMaker Faireに数回出展したときに、さりげなく置いてあったのですが、今年はソフトウェア受信機をメインに出展の申込をしてみました。
これまで雑誌記事掲載に合わせて、LPC-Link2を使ったソフトウェア受信機の内容をアップデートしてきました。前回の掲載までに、HF帯向けのSSB受信機に液晶スペクトラムディスプレイを動作させていました。
今回は、原点に戻って最初に実装成功したソフトウェアFM受信機に、液晶ディスプレイを追加してみました。このプロジェクトは、もともとFMステレオ受信機をソフトウェアで作ってみようというものでしたので、一周して元に戻って来たことになります。
この表示では、ADCでサンプリング(fs=9.984MHz )している信号をFFTしてリアルタイムで表示しています。FM放送帯域内の複数の放送波が見えています。右側の85MHz弱がナイキストの境界になっているのでここで鏡像対象に折り返しています。 (復調モード表示の修正はさぼっているのでLSBのままですが、W-FMのモードで動作しています)
スペクトラム表示は信号処理の中間の状態表示に切り替えられます。
これは放送波にチューニングし1/32デシメーションをした信号です。+-100kHzに広がっているのがわかります。fs=312kHz
これをFM復調した結果が次の表示です。
19kHzにステレオのパイロットトーンが立っていて、38kHzを中心に(L-R)の差信号が左右対称に配置されているのがわかります。L+Rはベースバンド(0Hz)にあります。この後、マトリクスでLとRを取り出しステレオ音声信号とし、さらに2/13にデシメーションして48kHzの音声信号となります。
FM放送は、適度に複雑なスペクトラム構造を持っているので観察していて面白いです。音楽や会話で見え方が違うのがよくわかります。
ステレオFM受信機は、SSBよりも複雑なのでMCUの負荷が高いです。元々97%くらいでサイクルがぎりぎりだったのですが、ディスプレイ処理を追加するためにマルチコア動作させると、サイクルが足りなくなってしまいました。メインコアの処理量そのものはほぼ同じはずなのですが、サブコアを動作させてしまうと、メモリが共用となっているため、メインコアの動作が10%弱遅くなってしまうようです。その対策として、サブコア側はSRAMではなくSPIFIフラッシュメモリ上で動作させてみると、メインコアの効率がかなり回復しました。フラッシュは動作が遅いのですが、サブコアだけであれば影響は表示更新レートが下がる程度です。SSB受信機では25fps程度だったのが10fps程度となってしまいました。地味な変更に見えますが、実は面倒な対策をしているのです。
動画です。
展示にはこのほかFriskSDRを出す予定です。
さすがにラジオだけではちょっと地味なので解説をどうしようか考えたいと思います。他に作りかけのもの(NanoVNAとかIQDDS等)も置いておきたいと思います。また、例年のような光り物も出す予定です。
デモのことを考えると会場はラジオの受信環境として厳しいものがあります。しかし、今年のMaker Faire Tokyoの新企画として会場内ミニFMが設置されるらしいことを見かけました。それをリアルタイムで受信できれば、良いデモになるかなと思っています。
今年は札幌SDR研究会のおじさんエンジニア達もヘルプで参加してくれます。濃いお話ができると思います。ではでは会場でお待ちしております。
リンク
開催案内 http://makezine.jp/event/mft2016/
出展者情報 http://makezine.jp/event/makers2016/ttathokkaidou/
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スピーカとしては動作するようにはできたのですが、なかなか安定しません。もう少しもがく必要がありそうです。
リファレンス
これまでの記事: FriskSDRにUIを実装してみました http://ttrftech.tumblr.com/post/145152124586/
FriskSDRが動き始めました http://ttrftech.tumblr.com/post/143563100751/
FriskSDR組み立て開始しました http://ttrftech.tumblr.com/post/141717924271/
74AHC74 http://www.nxp.com/ja/products/discretes-and-logic/logic/so/dual-d-type-flip-flop-with-set-and-reset-positive-edge-trigger-based-on-pip-74ahc-ahct74:74AHC_T_74
74LVC74 http://www.nxp.com/products/discretes-and-logic/logic/lvc/dual-d-type-flip-flop-with-set-and-reset-positive-edge-trigger:74LVC74APW?lang_cd=en
フリスクラジオの先人PUPさんの作品 http://pup.doorblog.jp/archives/45053029.html
FriskSDRにUIを実装してみました
製作していたFriskSDRですが、当初の予定通りLCDとレバースイッチを付けて操作できるようにしてみました。
LCDはI2C接続の8x2液晶で裏面に付けるようにしました。ぼぼガラス基板のみの厚さなので、薄く作ることができます。
部品面は一番高いのがコネクタで6mm、全体では9mm程の厚さになります。RF入力のBPF以外は、すべて実装した状態になりました。黄色い線は、書込みとデバッグにST-Link2を使っているのですが、その接続にコネクタを使わずワイヤを直接、電源と合わせて4本を接続してあります。
レバースイッチは、上下とプッシュ操作が可能です。プッシュでモード切り替え、上下で数値や選択の変更の操作となります。最初の画面は、チャネル切り替え、ワンプッシュで、周波数を直接変更するモードに変わります。ボタンの長押しで桁を選択するモードになり、周波数を1Hz単位で変更できるようにしています。
さらにプッシュで、音量調節。
もうワンプッシュで、復調モード切り替え。でも中身はまだ実装していません。
さらにプッシュでRFゲインの調整です。このRFゲインは、I2SコーデックTLV320AIC3204のADCの手前に設けられたPGA(Programmable Gain Amplifier)のゲイン設定です。0〜47.5dBと比較的広い範囲で調整できます。
操作の様子の動画です。
I/F誌のSDRではロータリーエンコーダを使ったワンノブインターフェースを実装してみましたが、ほぼそれと同じ操作感をFriskSDRでも作れたと思います。
判明していたADCのDCオフセットについてです。QSDミキサをDC的に直結していたのですが、この接続だとオフセットが生じて、AD変換した結果にDC分が出てしまいます。悪いことにPGAのゲインを上げるとADCが飽和してしまい信号を取り込めなくなっていました。結局、入力にCを追加してAC結合とすることでオフセットが出なくなるようにしました。基板上のスペースに余裕が無いので、小さい1005サイズの100nFを4つ、配線をカットして載せています。
消費電流の件は、現在のSTM32F303を使う限りあまり減らせなさそうです。Cortex-M4Fで高性能なのですが、現状72MHz動作で70mAを越えています。クロックを下げれば、比例して下がりますが、それでも桁は減らせません。Cortex-M0なSTM32F072でも動作させられそうですが、それでも1/3程度です。
実はSTM32にはLというローパワーのシリーズがあります。その中でも新しいラインアップであるSTM32L4x3は、同じCortex-M4Fなのに、消費電流が100uA/MHzと一桁低いようです。ところが残念ながらまだ入手は難しそうです。バッテリ動作には、このMCUを本命として入手可能になるのを待つことにしたいと思います。それまではUSBモバイルバッテリなどの外部電源を使うことにします。
引き続き、
信号処理をちゃんと実装してAM以外の復調も可能にする
USB AudioデバイスとしてPCのSDRソフトウェアから使えるようにする
の作業を進めたいと思っています。
リファレンス
前回の記事 http://ttrftech.tumblr.com/post/143563100751/
レバースイッチTMHU28 http://akizukidenshi.com/catalog/g/gP-08072/
I2C LCD http://akizukidenshi.com/catalog/g/gP-06669/




