2015年8月30日日曜日

PLLクロックジェネレータSi5351Aお試し ~いわゆるLチカ~

今日はハムフェアの反省会(?)と称して秋葉原の某中華料理店で謎の団体とご一緒させていただきました。

会が終了し、一行は秋葉原にあるハムショップに訪れ中を徘徊し夕方解散となりました。


ハムフェアのBasicommブースにも現れた謎の集団(笑)ご一行様が秋葉原に向け進行中。


そういえば秋月電子通商秋葉原店、店内がリニューアルしていました。
しかし相変わらず訪れるお客さんが多くゆっくり滞在できませんでしたが、主要なパーツ置き場などをチェックしてきました。

と、長い前置きはこのくらいにしておいて

FD移動やハムフェアでしばらく中断していた新デバイスの動作テストを行いました。

以前QRP Labs.で頒布されていたUltimate3というWSPRなどデジタルモードビーコン送信機キットを製作しましたが、このキットに使われていた発振器はAD9850を使った安価な中華DDSユニットでした。しかしその後3Sとしてリニューアルされたキットの発振器に使われていたのがSi570でおなじみの(...といってもJAではあまり取り上げられていないようですが)Silicon Labs.で出している多出力クロックジェネレータSi5351Aで、チップ自体はRSコンポーネンツでも単価が200円もしない非常に安価なデバイスです。
そんな中、ArduinoやRaspberryPiの周辺ボードでおなじみの(...といってもやはりJAでは(以下略))Adafruitからこのデバイスを使ったbreakout boardが出ているのをGoogle+で見つけ、早速2枚オーダーしました。

ボード中央に見える10pinMSOPのチップがSi5351A
もともとは電子機器のクロック用に開発されたデバイスですが、中に2つの独立したPLLと3系統のプログラマブル分周器が内蔵され、同時に3つの異なる周波数のクロックが得られるという面白いチップです。

基準発振は外付けの25MHzのXTALを接続して内部で発振し、PLLフィードバック用のプログラマブル分周器で分周することで最高900MHzまで任意の周波数でPLLをロックします。その後PLLの信号をさらに分周することで目的周波数を得るというものです。
Si3531Aのブロックダイアグラム(データシートより引用)
コントロールはI2C経由で行います。設定手順は、PLLのフィードバック分周器の設定、分周器(MultiSynth0(~2)の設定、PLLリセット、 PLLオンという具合でそう難しくはなさそうですが、各分周器のパラメータの設定が最初なかなか理解しにくかったです。

まずは今回DDSのときと同じように固定周波数で発振までこぎつけるといういわゆるLチカ儀式(笑)を行うことにしました。

目的周波数を10MHzとし、最初にPLLの周波数を決めてそのあと10MHzになるように分周比を決めてみました。PLL周波数は800MHzで分周比は80とすれば10MHzで出力されるという計算です。

まずは、PLL周波数を800MHzにする設定を割りだします。

フィードバック用分周器の設定は、まずデータシート(ここここ)から

  i) fvco = fXTAL x (a + b / c)
     aは15~90の整数値、bは0~1048575の整数、cは1~1048575の整数
     fvco = 800MHz, fXTAL = 25MHzとすると、a,b,cはそれぞれ32,0,1です。
   これらの値を設定用パラメータP1,P2,P3に変換し(詳しくはデータシート参照)
     Si3531Aのレジスタ(MSNA_Px or MSNB_Pxレジスタ)にI2C経由で転送します。
  ii) fout = fvco / (a + b / c)
      i)と同様になります(MSx_Pxレジスタ)

そんなこんなでいつものPIC16F1827用にプログラムを書いてコンパイルし初動作。



あっさり10MHzあたりで発振しています。出力は50Ωインピーダンスで20dBアッテネータを挿入しABP-3で測定すると-10dBmと+数dBmは出ていると見えDDSよりも大きくそのままパッシブDBMにつなげられそうな勢いです。



 方形波なので高調波はこんな感じで、5MHzごとの柱は基準発振器との混合波の可能性と見ていますが、近傍の余計な信号が気になります




拡大すると信号周囲50Hz毎に柱が見られており、ハムが乗っかっていると想像したためACアダプターを電池に切り替えて再測定しました。




と50Hzごとの柱は消え、なんとなく小さい柱は残っているもののとりあえずは使えるレベルかもしれません。ただし電源のデカップリングなどしっかりした対策は必要ですね。

参考までに、ソースを公開します。最低限のものなのですが、これを芯にしてVFOとBFOを同時に賄える発振器に出来ればな~と考えてます。

//
//    si5351 handling test program
//    31 Jul 2015 / HARU
//
//    ver.0.1 29 Aug 2015
//    first implementation (so-called "L-Chika") output freqency 10MHz
//
//    ** parameters calculation **
//
//    fvco = fXTAL * (a + b / c) a:15 to 90, b:0 to 1048575, c:1 to 1048575
//    fout = fvco / (a + b / c) a:4 to 900, b:0 to 1048575, c:1 to 1048575
//
//    P1 = 128 * a + floor(128 * b / c) - 512
//    P2 = 128 * b - c * floor(128 * b / c)
//    P3 = c
//

#define EEPROM_SIZE     256
#define _XTAL_FREQ        4000000

#include <xc.h>

//for 16F1847/1827 config
#pragma config CPD = OFF, BOREN = NSLEEP, IESO = OFF, FOSC = INTOSC
#pragma    config FCMEN = OFF, MCLRE = OFF, WDTE = OFF, CP = OFF, PWRTE = ON, CLKOUTEN = OFF
#pragma config PLLEN = OFF, WRT = OFF, STVREN = OFF, BORV = LO, LVP = OFF

#define SCL         LATAbits.LATA2
#define SDA            LATAbits.LATA3

void msec_delay(unsigned short time);
void I2C_init(void);
void I2C_send(unsigned char data);
void si5351_cmd(unsigned char reg, unsigned char data);
void pll_set(void);
void ms0_set(void);

void main(void){
   
    OSCCON = 0x6A;                        // 4MHz internal OSC no PLL
   
    ANSELA = 0x00;
    ANSELB = 0x00;
    TRISA = 0x00;
    TRISB = 0x00;
//    WPUB = 0xFF;                        // PORTB weak pull-up
   
    OPTION_REG = 0x02;                    // weak pull_up, TMR0 internal clock(1us/cycle), prescaler 1:8
   
    I2C_init();
   
    si5351_cmd(16,0x80);                // output off
    pll_set();                            // PLL_A fvco setting by feedback multisynth divider
    ms0_set();                            // Multisynth0 divider setting
    si5351_cmd(177,0xA0);                // PLL_A reset
    si5351_cmd(16,0x4F);                // CLK0 ON (Multisynth0;Integer mode, PLL_A source)

    while(1){
       
    }
}

void msec_delay(unsigned short time){
    unsigned short i;
    for(i=0;i<time;i++){
        __delay_ms(1);
    }
}

void I2C_init(void){
    SDA = 1;
    SCL = 1;
}

void I2C_send(unsigned char data){
    unsigned char i;
    for(i=0;i<8;i++){
        if(data & 0x80) SDA = 1;
        else SDA = 0;

        SCL = 1;
        SCL = 0;
        SDA = 0;
        data <<= 1;
    }
    SCL = 1;                            // for ack
    SCL = 0;
}

void si5351_cmd(unsigned char reg, unsigned char data){
    SDA = 0;                            // start condition
    SCL = 0;                            //
    I2C_send(0xC0);
    I2C_send(reg);
    I2C_send(data);
    SCL = 1;                            // stop condition
    SDA = 1;                            //
    __delay_us(30);
}

void pll_set(void){                        // fXTAL=25MHz, fvco=800MHz, a=32, b=0, c=1(integer) -> P1=3584, P2=0, P3=1
    si5351_cmd(26,0);                    // resister26 <MSNA_P3[15:8]>
    si5351_cmd(27,1);                    // resister27 <MSNA_P3[7:0]>
    si5351_cmd(28,0);                    // resister28 <MSNA_P1[17:16]>
    si5351_cmd(29,0b00001110);            // resister29 <MSNA_P1[15:8]>
    si5351_cmd(30,0);                    // resister30 <MSNA_P1[7:0]>
    si5351_cmd(31,0);                    // resister31 <MSNA_P3[19:16], MSNA_P2[19:16]>
    si5351_cmd(32,0);                    // resister32 <MSNA_P2[15:8]>
    si5351_cmd(33,0);                    // resister33 <MSNA_P2[7:0]>
}

void ms0_set(void){                        // fout=10MHz, 1/80 division, a=80, b=0, c=1(integer) -> P1=9728, P2=0, P3=1
    si5351_cmd(42,0);                    // resister42 <MS0_P3[15:8]>
    si5351_cmd(43,1);                    // resister43 <MS0_P3[7:0]>
    si5351_cmd(44,0);                    // resister44 <0, R0_DIV[2:0], MS0_DIVBY4[1:0], MS0\P1[17:16]>
    si5351_cmd(45,0b00100110);            // resister45 <MS0_P1[15:8]>
    si5351_cmd(46,0);                    // resister46 <MS0_P1[7:0]>
    si5351_cmd(47,0);                    // resister47 <MS0_P3[19:16], MS0_P2[19:16]>
    si5351_cmd(48,0);                    // resister48 <MS0_P2[15:8]>
    si5351_cmd(49,0);                    // resister49 <MS0_P2[7:0]>
}

2015年8月24日月曜日

ハムフェア2015行ってきました

8月中旬秋の気配をなんとなく感じるころとはいえ日中はまだまだ暑い最中、恒例のハムフェア2015が東京ビッグサイトで開催されました。

会場の様子をiPhoneカメラで撮りましたが、なんというかどの写真もぜんぜんキチンと撮れていません(汗)

どうにか見れる写真を出してみます。





今回はほとんどBasicommさんのブースに居たので他のブースはほとんど回れませんでしたが、初日はかなり人が多かったようです。


Basicommさんのブース以外は136kHzでいつもお世話になっている全日本長中波クラブのブースを訪れ、持参した自分の展示物を置かせていただきました。


 こちらはJA1QUM青木OM作のアンテナ整合機(136kHz, 475kHz用)です。リッツ線を多層巻きにしているそうですが、全部多層巻きにせず一巻きおきに3層としてQ低下を抑えているそうです。すべて2層巻きにしたときの巻き数に相当すると思いますが、それぞれのQがどれだけ違うのか興味のあるところです。


7L1RLL若鳥OMは、SOS送信機改造475kHz送信機と改造ファームウエア搭載のJUMA TX-500送信機のデモンストレーションを行っておりました。何回か拝見していますがこのSOS送信機の筐体に内蔵されたコイルは圧巻ですね。


JA5FP 間OM作のPIC制御中華DDSによるLF帯ビーコン送信機です。
PICの基準発信器を12.88MHzのものに換装し、ちょうど136kHz帯になるようにしてDFCWを送信していました。面白いのはDFCWのgapの部分に短時間周波数シフトを施すことによって、長点又は短点の連続での符号の切れ目がより認識しやすくなっています。ArgoやSpectrum Labで表示すると垂直線で表示されます。(画像撮りませんでした)
また短点を押し続けるとストレートキーモードに切り替わるキーヤーも展示されており、なかなかおもしろい仕組みだなぁと感心しました。

あと写真を撮り忘れてしまいましたが、JH1ARY 黒田OM作の135kHz/475kHz自作送信機、JF1LKS 多田OM作のUltimate3Sビーコン送信機の展示がありました。Ultimate3は当局も持っていますが、発信器が中華DDSを採用したタイプで普通の水晶発振子を使っているためか、136kHzではQRHが目立つため実践投入していません。OMの3Sはデモンストレーションでの安定度も高そうです。出力に自作パワーアンプをつなげているそうで、現在免許待ちとのことでした。

会場内ではGPSからの信号が受信できませんでした
最後に私の展示物。

このブログで何回も取り上げましたが、改造JUMA TX-136展示バージョン(笑)です。
やっつけで余りもののアクリル板を組み合わせて天板部分を置き換え、GPS受信モジュール(GMS6-CR6)を中にいれて、送信機の中の様子が良くわかるようにしてみました。

やっつけで作った割にはしっかりしているので、当分このままで運用しようかと思います(笑)

でもって、Basicommさんのブースに置かせていただきましたKeyer Mini-V2 Revision2キット20台分ですが...

タッチパドルは好評で特別バージョンは完売していました
1日目で15台、2日目で5台売れ、めでたく完売しました。

円安の影響か購入いただいた方の3分の1は海外の方でした。マニュアルは日本語でしか書かれていませんがはたして大丈夫でしょうか...(汗

また完成品を望まれた方も多かったようで、今後展開をどうするか検討しています。

それから、twitterや他のSNSでおなじみのメンバーとも会場内外で交流を深めつつ楽しい2日間を過ごしました。

Basicommブースにやって来た謎の集団(笑)
ではまた来年。

一応今回の戦利品の一部をば。


136kHz移動用と、今後475kHzの移動する局免許(移動しない局はすでにおろしました)のためにFT-817NDと500Hz CWフィルターをハムフェア価格で購入。(うっかりTCXOユニットを忘れてしまいましたが^^;)
あとは前の週で手に入れることが出来なかった薄い本と、写真に写っていませんがAPB-3用の1GHzエクステンダを購入しました。

いままで車載のFT-857を外して136kHzの受信機として使っていましたが、これで少しまた楽に運用ができそうです。もちろん変更申請を出して他のバンドも出られるようにしますが。

2015年8月21日金曜日

ハムフェア2015直前告知

明日明後日東京ビッグサイトで開催のハムフェア2015に行ってきます。

で、かねてから告知していましたKeyer Mini-V2 Revision2のキットを頒布します。

やっと箱詰めがおわりました(汗

頒布価格は関ハムの時と同じ4500円です(アクリルパネルキット入り)。

20台分用意しました。

ベイシコム ハムクラブブース(C-062)にてタッチパドルのデモ用キーヤーとして使っていただいておりますので、タッチパドルとともにお試しいただけると幸いです。

自分はこちらのブースか全日本長中波倶楽部ブース(J-01)にお邪魔しておりますのでそちらのほうもぜひお立ち寄りくださいませ。

2015年8月18日火曜日

BSODの恐怖

お盆明けの月曜日、いつものように仕事用のPCを起動しようとしたら途中でこのような画面が現れて再起動の繰り返し...


"BAD_POOL_HEADER"というタイトルでBCCode19エラーのようです。
ネットで検索したところ、ハードウエア特にRAM、ソフトウエアなどが原因とのことですが、これだけではまったく参考になりません。RAMもWindows付属のメモリテストソフトでチェックして問題ないことは確認しました。ハードにしても先日交換したばかりだし、何よりセーフモードで起動できていることからソフトウエアが問題だろうと見当つけていました。

ただ、Windowsのスタートアップ障害回復などのユーティリティではまったく改善しません。コマンドプロンプトでsfc /scannowや、chkdsk /fを実行してもやはり歯が立ちません。あぁクリーンインストール?と心が折れそうになったとき、ふと辿り着いた海外のwindowsフォーラムにWindowsデバッガを使いメモリダンプファイルを解析することで解決した例を見つけ、最後の頼みということでMicrosoftからwindbgというWindowsデバッグツールをDLしインストールしようとしました。

ところが、セーフモードではインストールできないことが判明したため再び暗礁に。

そこで、自宅の別なPCにデバックツールをインストールしメモリダンプファイルをコピーして解析することが出来ました。

以下その結果です。

Microsoft (R) Windows Debugger Version 6.3.9600.17336 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.


Loading Dump File [C:\Windows\Minidump\081815-13119-01.dmp]
Mini Kernel Dump File: Only registers and stack trace are available


*********** Symbol Path validation summary ************
Response                         Time (ms)     Location
Deferred                                       SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Symbol search path is: SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows 7 Kernel Version 7601 (Service Pack 1) MP (8 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 7601.18839.amd64fre.win7sp1_gdr.150427-0707
Machine Name:
Kernel base = 0xfffff800`04049000 PsLoadedModuleList = 0xfffff800`04290730
Debug session time: Tue Aug 18 08:32:55.045 2015 (UTC + 9:00)
System Uptime: 0 days 0:00:12.169
Loading Kernel Symbols
..

Press ctrl-c (cdb, kd, ntsd) or ctrl-break (windbg) to abort symbol loads that take too long.
Run !sym noisy before .reload to track down problems loading symbols.

.............................................................
..............................
Loading User Symbols
*****************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*****************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck 19, {22, fffff8a000a00000, 1, 0}

* WARNING: Unable to verify timestamp for avgldx64.sys
* ERROR: Module load completed but symbols could not be loaded for avgldx64.sys
Probably caused by : avgldx64.sys ( avgldx64+90f6 )

Followup: MachineOwner
---------

0: kd> !analyze -v
*****************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*****************************************************************************

BAD_POOL_HEADER (19)
The pool is already corrupt at the time of the current request.
This may or may not be due to the caller.
The internal pool links must be walked to figure out a possible cause of
the problem, and then special pool applied to the suspect tags or the driver
verifier to a suspect driver.
Arguments:
Arg1: 0000000000000022,
Arg2: fffff8a000a00000
Arg3: 0000000000000001
Arg4: 0000000000000000

Debugging Details:
------------------


BUGCHECK_STR:  0x19_22

POOL_ADDRESS: GetPointerFromAddress: unable to read from fffff800042fa100
GetUlongFromAddress: unable to read from fffff800042fa1c0
 fffff8a000a00000 Paged pool

CUSTOMER_CRASH_COUNT:  1

DEFAULT_BUCKET_ID:  WIN7_DRIVER_FAULT

PROCESS_NAME:  System

CURRENT_IRQL:  2

ANALYSIS_VERSION: 6.3.9600.17336 (debuggers(dbg).150226-1500) amd64fre

LAST_CONTROL_TRANSFER:  from fffff8000405315e to fffff800040bd8c0

STACK_TEXT:
fffff880`009a8a58 fffff800`0405315e : 00000000`00000019 00000000`00000022 fffff8a0`00a00000 00000000`00000001 : nt!KeBugCheckEx
fffff880`009a8a60 fffff800`041f455a : 00000000`00000000 fffff880`009a8bb0 fffff880`009a8b30 fffff8a0`00000001 : nt! ?? ::FNODOBFM::`string'+0x72c6
fffff880`009a8af0 fffff880`054e40f6 : fffff8a0`007af7b0 fffff880`009a8ca0 fffff8a0`007c5010 00000000`00000000 : nt!ExFreePoolWithTag+0x46a
fffff880`009a8ba0 fffff8a0`007af7b0 : fffff880`009a8ca0 fffff8a0`007c5010 00000000`00000000 fffff880`009a8f90 : avgldx64+0x90f6
fffff880`009a8ba8 fffff880`009a8ca0 : fffff8a0`007c5010 00000000`00000000 fffff880`009a8f90 00000000`00000003 : 0xfffff8a0`007af7b0
fffff880`009a8bb0 fffff8a0`007c5010 : 00000000`00000000 fffff880`009a8f90 00000000`00000003 00000000`00000000 : 0xfffff880`009a8ca0
fffff880`009a8bb8 00000000`00000000 : fffff880`009a8f90 00000000`00000003 00000000`00000000 fffff880`009a8e00 : 0xfffff8a0`007c5010


STACK_COMMAND:  kb

FOLLOWUP_IP:
avgldx64+90f6
fffff880`054e40f6 ??              ???

SYMBOL_STACK_INDEX:  3

SYMBOL_NAME:  avgldx64+90f6

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: avgldx64

IMAGE_NAME:  avgldx64.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  55802aaf

FAILURE_BUCKET_ID:  X64_0x19_22_avgldx64+90f6

BUCKET_ID:  X64_0x19_22_avgldx64+90f6

ANALYSIS_SOURCE:  KM

FAILURE_ID_HASH_STRING:  km:x64_0x19_22_avgldx64+90f6

FAILURE_ID_HASH:  {ca00a727-a49c-4209-f2e2-17d34b057ccd}

Followup: MachineOwner
---------

内容を見ると、どうやらavgldx64.sysというsysファイルでつっかかっているようです。

そんなわけで当該ファイルと関連レジストリを削除したら見事に復活しました。

このsysファイルの出所は某フリーアンチウイルスソフトのソフト屋さんでしたが、どうやら他にも同様の原因でBSODに陥った事例もみられたことから、ソフト自体もアンインストールし別のものに替えました。

PCのトラブルは、ものによっては膨大な時間を費やしてしまうので困りますよね。

しかし、これで経験値がひとつ上がりました(笑)

閑話休題。

これはタッチパドルのデモ用完成品です。
来るハムフェアで頒布予定のKeyer Mini-V2 Revision2ですが、完成品を作る時間がないので20セットすべてキットとして頒布します。電池と接続ケーブル除きすべてのパーツ(専用アクリルパネルも)が揃っています。最小1608サイズの表面実装部品を採用しているので難易度は高くなっていますが、関ハムで頒布した分はちゃんとみな動作していると報告受けています。

頒布場所はベイシコム(Basicomm)ハムクラブブース(C-062)です。タッチパドルなどの製品の展示販売もあるそうなのでハムフェアにいらっしゃる折にはぜひお立ち寄りください。