ラベル SDR受信機 の投稿を表示しています。 すべての投稿を表示
ラベル SDR受信機 の投稿を表示しています。 すべての投稿を表示

2018年2月25日日曜日

CentSDRキットを組み立てる

まったく凄い作品です。驚きました。
TT@北海道さんが頒布された、CentSDRの試作品キットです。シンプルな回路構成ながらSTM32で復調処理はもちろんのことバンドスコープやIQ信号波形表示までこなします。さらには、使ってみたいと思わせるデザイン性の高い画面表示まで。これを自分で組み立てられるという達成感を味わいました。


このキットは、試作品につきレポートのWeb等への公開が課せられています。このような完成度の高い作品に意見を申し上げるのは畏れ多いことですが、キットの組み立てを通して感じたこと、工夫したことをいくつか書き残してみます。

キットの内容

基板とパーツの一部がセットになっています。チップCRにカラーペンで色別表示が付いてるのはお分かりでしょうか。それに基板の角が面取りされているなど気配りが行き届いています。




追加部品

説明書に記載の通り、LCD、Si5351A、ロータリエンコーダ、ピンヘッダ等は別途手配が必要です。LCDはe-bayで入手しました。このほか、リチウムイオン電池の接続にも対応しているようで専用のパターンが用意されています。(注:初期ロットには制約事項があります。説明書で確認してください。)回路図にはNo Useと破線で囲まれた部分がそれですが、後からこれに気付いたので手持ち部品で実装しておき、充電制御チップMCP73831や電池は後日手配するつもりです。
部品ではありませんが、ファームウェア書き込みツールとしてNucleo-64も買いました。


組み立て

他の方の組み立てレポートでマイクロUSBコネクタが剥がれたという報告があったので、スルーホールのビア近くにコネクタのはんだ付け箇所を追加してみました。それでも強度的には依然弱いのでやさしく取り扱うことにしましょう。取付箇所付近にビアを追加すれば強度は増すと思われます。
説明書では、基板裏側からコネクタ裏面にはんだを流し込むことが推奨されていますが、基板裏側のランドが小さくどうにもはんだが流れ込んでくれませんでした。



このキットの最難関は、QFNのはんだ付けでしょうか。リフローを前提としてフットプリントが設計されているようで手はんだ派には全般的に難易度高くツラいです。とくにミキサIC付近のチップコンの配置が密集していてピンセットが入らず苦労しました。これは老眼で見えないせいもありますけども。コーデックは、メンディングテープで固定して作業しましたが少しずれてしまいました。拡大してみると残念な仕上がりです。
C19-21のタンタルコンデンサにはシルクで極性表示があるとわかりやすそうです。




完成です!


ファームウェアの書き込み

NucleoのCN2ジャンパ2個を取り外し、CentSDRと接続します。接続するのは、2:TCK, 3:GND, 4:TMSだけでも良いそうです。NucleoのUSBをPCに接続すると、USBドライブが見えるので、ここにch.binファイルをコピーするだけで書き込み処理が終了します。
ここまで呆気なく終了。STM32の書き込みツール、なかなか良いですね!


動作確認

アンテナを接続してAMラジオの周波数に合わせて見ました。ところが、イヤホンが手元に無いことに気付き愕然。音は聞けてませんが、この表示を見るだけでも素晴らしいの一言です。


2016年12月19日月曜日

Web公開SDR受信機でUVB-76受信体験

ロシアから発信されているUVB-76という短波放送をご存知でしょうか。以前、知人から単調なブザー音を何十年も流し続けるナゾの短波放送の存在を聞き、ネットで調べるとオカルトじみた取り上げ方をされていて興味を持ちました。周波数は4,625kHzと6,998kHz。短波ラジオで受信を試みるとかすりもしなかっとことを覚えています。

ところが最近、Web公開されているSDR受信機の存在を知り、再度チェンレンジしたところあっさり受信できるではないですか。とても驚きました。まずは次のリンクを試してみてください。電波伝搬の都合で時間によって受信状態がよい周波数は変わります。


出典: http://websdr.ewi.utwente.nl/


ところで、このWeb公開SDR受信機の本家はWebSDRです。ここのホームページに世界各地へのリンクが張られていますが、欧米中心でアジア地区は少ないですね。WebSDRの凄いのは、複数ユーザで同時利用できることでしょうか。オランダ Twente大学のWebSDRは、"415 users"なんて書いてあって、いったいどういう仕組みなのかと驚きます。

何はともあれ、彼の地のラジオを聞いて、楽しむことができそうです。



2010年7月12日月曜日

ISE12.1 WebPACK

XILINXのISE12.1 WebPACKをインストールしました。

ダウンロードページで32bit/64bit Windowsをクリック。3GB弱のファイルをダウンロードすることになります。しかも、圧縮形式は懐かしの(?)TAR+GZ。

ダウンロードページ


ダウンロードしたファイルを解凍してできたフォルダの xsetup をクリックするとインストールが始まります。最終段階で、ライセンスを取得する画面が出てきますが操作方法がわからなくて中断。メールでライセンスファイルを送ってくれるはずが、ぜんぜん送られてきません。

今日、再チャレンジしてみました。 まずライセンス管理ソフトを起動します。
スタート → プログラム → Xilinx ISE Design Suite 12.1 → アクセサリ → ザイリンクス ライセンスの管理

Xilinx License Configuration Manager


Xilinx License Configuration Managerの画面のLM_LICENSE_FILE欄には、なぜだかLatticeのispLEVERで取得したはずのライセンスファイルが勝手に表示されています。この画面左上の Acquire a Licenseをクリックして Get Free ISE WebPack Licenseを選びます


ISE WebPack Licenseを選びNextをクリック


ブラウザーが起動して、XilinxのWebに接続します。Xilinxの自分のアカウントのページが開くので Nextをクリックする。次のような画面になりますが、これはISE Design Suite評価用の期間限定ライセンスの作成用なのでManage Licensesタブをクリックします。

Manage Licensesタブをクリック

 
ライセンスを管理するページ


ライセンスを管理するページの左下に小さなアイコンが並んでいます。左端の下向き矢印のアイコンをクリックするとライセンスファイルをダウンロードできます。ちなみにメールのアイコンをクリックするとファイルをメールに添付して送ってくれるはずが、うまく受け取ることが出来ませんでした。

取得したライセンスを登録するには、先ほどのXilinx License Configuration Manager画面から Copy License ボタンをクリックして、ダウンロードしたXilinx.lic ファイルを指定します。(この操作がわからず迷いました)

2010年7月1日木曜日

DDC-SDR受信機

設計者のJimCom氏の支援を受け、なんとか動作確認できました。これを基板をベースにオリジナルソフトを書いてみたいですね。


 APB-1で発生したテスト信号を受信

2010年6月29日火曜日

Si570 "ANY-RATE"プログラマブル発振器(4)

実装状況
PICマイコン用に設計された基板に、無理矢理AVRを取り付けたので、ジャンパ線ばっかりになっています。




回路図


2010年6月28日月曜日

Si570 "ANY-RATE"プログラマブル発振器(3)

制御プログラム
制御用として、AtmelのATtiny85という8ピンのマイコンを使いました。このマイコンには、USI(Universal Serial Interface)というシリアル通信機能が組み込まれていますが、汎用ゆえ使い方が難解です。そこで、がた老AVR研究所の温度ロガーで公開されていたsoft_I2C.cの主要ルーチンをほぼそのまま利用させて頂きました。また、JimCom氏のソースコードも参考にさせて頂いています。この場をお借りしてお礼申し上げます。



メインルーチン Si570.c(一部、#includeに続く括弧を全角に変更しています)
#include <avr/io.h>
#include
<avr/interrupt.h>
#include <stdlib.h>
#include <avr/sleep.h>
#include <avr/pgmspace.h>
#include <inttypes.h>

#define  I2C_FUNCTIONS
#include ”soft_I2C.h”

/*
    PB5 I (Reset)
    PB4 I DIP SW 1-1
    PB3 I DIP SW 1-2
    PB2 I/O SCL/(ISP SCK)
    PB1 I/O (ISP MISO)
    PB0 I/O SDA/(ISP MOSI)
*/


uint8_t I2C_comd(uint8_t cmd)
{
    I2C_start_cond();
    if( I2C_status_flag != 1) return(I2C_status_flag);

    I2C_Master_send(Si570_ADR);
    if( I2C_status_flag != 1) return(I2C_status_flag);

    I2C_write(cmd);
    if(I2C_status_flag !=1) return(I2C_status_flag);
    return(1);
}


void I2C_put(uint8_t cmd, uint8_t data)
{
    if( !(I2C_status_flag = I2C_comd(cmd)) ) return;
    I2C_write(data);
    if(I2C_status_flag != 1) return;
    I2C_stop_cond();
}


void init_si570(void)
{
    // Freeze DCO
    I2C_put(137,0x10);

    // Set HSDIV, N1, RFREQ
    switch (((bit_is_clear(PINB,4))<<1) | (bit_is_clear(PINB,3))) {
        case 0:    // 122.880MHz

            I2C_put(7, 0x21);        // HSDIV=1, N1=7
            I2C_put(8, 0xC2);        // RFREQ=0x02B021DE77
            I2C_put(9, 0xB0);
            I2C_put(10, 0x21);
            I2C_put(11, 0xDE);
            I2C_put(12, 0x77);
            break;

        case 1:    // 73.728MHz

            I2C_put(7, 0xE1);        // HSDIV=7, N1=5
            I2C_put(8, 0x42);        // RFREQ=0x02A9404015
            I2C_put(9, 0xA9);
            I2C_put(10, 0x40);
            I2C_put(11, 0x40);
            I2C_put(12, 0x15);
            break;

        case 2:    // 61.440MHz

            I2C_put(7, 0x23);        // HSDIV=1, N1=15
            I2C_put(8, 0xC2);        // RFREQ=0x02B021DE77
            I2C_put(9, 0xB0);
            I2C_put(10, 0x21);
            I2C_put(11, 0xDE);
            I2C_put(12, 0x77);
            break;

        case 3:    // 12.288MHz

            I2C_put(7, 0xE8);        // HSDIV=7, N1=35
            I2C_put(8, 0xC2);        // RFREQ=0x02A9404015
            I2C_put(9, 0xA9);
            I2C_put(10, 0x40);
            I2C_put(11, 0x40);
            I2C_put(12, 0x15);
            break;

      default:    // 122.880MHz
            I2C_put(7, 0x21);        // HSDIV=1, N1=7
            I2C_put(8, 0xC2);        // RFREQ=0x02B021DE77
            I2C_put(9, 0xB0);
            I2C_put(10, 0x21);
            I2C_put(11, 0xDE);
            I2C_put(12, 0x77);
    }

    // UnFreeze DCO
    I2C_put(137, 0x00);

    // Set New Freq
    I2C_put(135, 0x40);
}

int main(void)
{

    //    出力ポート初期化
    //    入力ポート、1:プルアップ
    PORTB = 0b011101;

    //     ポート設定 0:入力, 1:出力
    DDRB = 0b000101;

    // USIインタフェースの初期化
    I2C_Master_init();

    // Si570の設定
    init_si570();

    while(1);    // 無限ループ
}


soft_I2C.c(変更箇所のみ抜粋)
//#include <avr/iotn861.h>
//#define  I2C_FUNCTIONS

void I2C_Master_init()
{
//  USIPP = I2C_USIPOS;


soft_I2C.h(変更箇所のみ抜粋)
//#define RTC8564_ADR   0xA2   //8564 RTC
#define Si570_ADR   0xAA    // Si570 I2C Address: 0x55<<1
#define I2C_PORT      PORTB
#define I2C_PIN       PINB
#define I2C_DDR       DDRB
#define I2C_SDA       PB0
#define I2C_SCL       PB2

ところで、HSDIVとN1の分周比と、実際にレジスタに書き込む値とは若干異なっています。
HSDIV
3ビットで表現しますが、少し変則的です。
000 = 4
001 = 5
010 = 6
011 = 7
101 = 9
111 = 11

N1
7ビットで表現します。分周比から1を引いた値をセットします。
0000000 = 1
1111111 = 128

2010年6月26日土曜日

Si570 "ANY-RATE"プログラマブル発振器(2)

Si570の出力周波数
出力は、4~5GHz帯のDCO(Digitally-controlled Oscillator)をディバイダで分周して得られます。周波数は次式で求められます。


RFREQ・HSDIV・N1レジスタで任意の周波数を選べますが、いくつか制約もあります。

  • DCO周波数範囲: 4850~5670MHz
  • XTAL周波数: 114.285MHz
  • 出力周波数: 10~280MHz (Cグレード、LVDS出力の場合)





出力周波数の変更
出力周波数を微調整(±3500ppm以内)するときは、RFREQレジスタに書き込むだけで変更できます。±3500ppmを越えた周波数とするには、いったんDCOを停止させ、各レジスタの設定後、再スタートさせる必要があります。


 

レジスタ値の選定
周波数設定に関するレジスタの制約は次の通りです。
  • RFREQ: 38ビット
  • HSDIV: 4, 5, 6, 7, 9, 11
  • N1: 1と128までの偶数
データシートによると、消費電力を考慮してDCO周波数を出来るだけ低くすること。また、N1を小さく、かつ、HSDIVを大きくしたときに消費電力が最小になるとのことです。
次に、RFREQレジスタの上位10ビットは整数部、下位28ビットは小数部に割り当てられています。小数部を含む10進数値を2進数の整数へ変換するには、2^28を掛ければ良いそうです。
 


次に、4つの周波数について検討してみます。

(1)122.880MHz
  • 出力周波数 = DCO周波数/(HSDIV×N1) より、DCO周波数4850MHzとするときの HSDIV×N1 は、4,850MHz/122.880MHz ≒ 39.5。
  • いくつかの組み合わせの中から、HSDIV=5、N1=8を選定。
  • DCO周波数 = 出力周波数×HSDIV×N1 = 122.880MHz×8×5 = 4,915.2MHz
  • RFREQ = DCO周波数/XTAL周波数 = 4,915.2MHz/114.285MHz = 43.0082688より、2^28を掛けると、11544944248。これを16進数に変換すると、0x02B021DE77となる。
(2)73.728MHz
  • HSDIV=11、N1=6、RFREQ=0x02A9404015
(3)61.440MHz
  • HSDIV=5、N1=16、RFREQ=0x02B021DE77
(4)12.288MHz
  • HSDIV=11、N1=36、RFREQ=0x02A9404015



周波数の変更手順
今回は、Si570をFPGAのシステムクロックとして使います。アプリケーションに応じた周波数を出せればよいので、電源投入時にDIPスイッチの設定に応じて周波数を変更します。I2Cによる、設定変更手順の流れは次の通りです。
  • Freeze DCO
  • RFREQ, HS_DIV, N1を更新
  • UnFreeze DCO
  • (10ms以内に) NerFreqビットをセット

Si570のレジスタ(データシートより)

2010年6月16日水曜日

Si570 "ANY-RATE"プログラマブル発振器(1)

ヘッドホンアンプのプロジェクトが一区切りしたので、JimCom氏設計のSDR受信機基板を完成させようと思っています。この基板のマスタクロックには、Silicon LaboratriesのSi570が採用されています。Si570は、プログラマブル型の水晶発振モジュールでI2Cで周波数を可変でき、しかも低ジッタであることが知られているため、他の自作SDR受信機でも多くの採用例があります。(アイキャスエンタープライズのUSBシンセサイザーキットなど)


Si570イメージ図(データシートより)


データシートによると、4~5GHzの内蔵DCOを適宜分周して出力を得ているとあります。最近は凄いデバイスがあるものです。びっくりしました。ちなみに消費電流は100mA前後となっています。そりゃ大食いになるよね。


Si570内部ブロック図(データシートより)



Si570位相ノイズ(データシートより)



ところで、このデバイスの入手には少し困りました。キットなら前述のサイトで入手出来ますが、デバイス単体を在庫している小売店が見あたらないのです。海外の個人サイトで頒布している例は散見されますが、言葉の壁と海外の見知らぬ個人との取引には抵抗を感じます。そこで、『在庫なし・お取り寄せ』だったMouser Electronicsにオーダしてみました。かなりの長納期を覚悟していましたが、結果的には3週間ほど、1月上旬にオーダーして1月末には手元に届きました。
Si570は出力電圧、周波数範囲、安定度、デフォルト周波数等を任意に指定してオーダーできます。私が購入したのは570BBC000141DGという型番のもので、LVDS出力・安定度20ppm・周波数範囲10-280MHz・デフォルト発振周波数56.32MHz・I2Cアドレス0x55(0d85)となっています。(型番が570・・・で始まっており、MouserでSi570として検索してもヒットしませんので注意!)


指先大のデバイス3個が大きな段ボールで届きました





これがSi570、たった5×7mmの大きさ


次回以降は、Si570をAVRマイコンで制御することにチャレンジしてみようと思います。