Sillicon LaboratoryのSi5351を使ったクロックジェネレータモジュールがStrawberry Linuxから販売されていました。Adafruitでも取り扱いがあり、無線への応用例も散見していましたので、どのくらいの性能を持つのか以前より気になっていました。今回ようやく試してみました。
Si5351Aは、クリスタルを一つ付けるだけで、10数kHzから200MHzまでの周波数を生成することのできるクロックジェネレータです。内部に独立したPLLが二つ、出力は3つあり、個別に設定することが可能です。出力は50Ωを駆動することができます。価格は比較的安価で、謳い文句にあるように、たくさんの水晶モジュールを使わずに済むメリットがあります。
気になる無線への応用ですが、信号純度が重要です。ターゲットがクロック用とはいえ、最近の高速通信用途ではクロックへの要求が高いので、それなりの性能があります。データシートを見てみたところジッタの数値が十数psのオーダーで、それほど良いわけではありません(まともな水晶モジュールなら1ps以下です)。しかしながら、Webには無線への応用例をいくつか散見したので、もし使い物になるのなら、応用範囲も広そうですので、試してみたいと考えていたところでした。
チップのパッケージはMSOP10ですが、Strawbery Linuxのモジュールでは水晶も一緒に10ピンDIPの基板に載せられています。
動作させるためにはI2Cでの設定が必要です。この設定のため、Arduino環境で使えるSparkFun Pro Micro(互換品)を使用することにしました。Pro MicroはAtmelのMega32U4を使用したUSB対応のボードで、3.3V版が選べて互換品を安価に入手することができます。商標の問題もありません(Arduinoという名前が付いていない)。5V 16MHz版と3.3V 8MHz版がありますので、今回のように3.3V用のモジュールを使うなら3.3V版を選ぶ必要があります。Arduino開発環境から使えるようにするためには、SparkFunのサイトを参照して、Arduino環境にアドオンを組み込む必要があります。
組み立てですが、ブレッドボードにPro MicroとSi5351Aモジュールを挿して、適宜配線します。I2CのSDA,SCLはD2,D3に接続します。Si5351AはVcc,GNDが複数本あるのでそれぞれ接続します。
さて、Si5351Aを制御するためのソフトウェアですが、Adafruitからライブラリが提供されています。下記のようにしてgithubから取得します。
cd ~/Documents/Arduino/libraries git clone https://github.com/adafruit/Adafruit_Si5351_Library
Arduino環境を立ち上げると、exampleからAdafruit Si5351という項目が選べますので、Arduinoらしくすぐに動作させることができます。
気になる信号純度ですが、スペクトラムを観察してみました。Clk#0の出力を観測したところ、最初に見えたのがこんなスペクトラムで、がっかりしました。たくさんのピークが見えて、なんじゃこりゃという感じです。
実は使ったサンプルが、三つの周波数を出すものでした。Clk#0に112.5MHz, Clk#1に13.55331MHz, Clk#2に10.706kHzの設定になっていました。同時に複数の出力が出ているので、さきほどの結果では、Clk#1の出力が混じってしまっていたようです。そこでコードを修正して、Clk#1,#2を出力オフにして、Clk#0のみを動作させてみました。そうしてみたところ大変綺麗な出力が得られました。
Span 200MHz, RBW 1MHzです。目立つスプリアスも無く、これならなかなか良い感じです。わずかに±12.5MHz(=25MHz/2)と±6.25MHz(=25MHz/4)が見えているくらいです(-65dBc以下)。
近傍はどうでしょうか。
Span 1MHz, RBW 5kHzです。位相ノイズが見えていますが、この形は測定系の位相ノイズです。信号そのものの位相ノイズは悪くても測定系と同程度もしくはそれ以下のようです。
もっと近傍はどうでしょうか。
Span 20kHz, RBW 200Hzです。出力周波数の設定は112.5MHzでしたので、5kHzほど低いです。Strawberry Linuxのモジュールで使われている水晶は最適な負荷容量が8pFと記載されていました。Si5351は水晶の負荷容量を10pF,8pF,6pFから選択して設定することが可能ですが、Adafruitのライブラリでは10pFの設定になっていました。容量が若干多かったので周波数が低くなっているようです。そこで、コードを修正して8pFに変更してみました。
Adafruit_SI5351.cpp
//m_si5351Config.crystalLoad = SI5351_CRYSTAL_LOAD_10PF; m_si5351Config.crystalLoad = SI5351_CRYSTAL_LOAD_8PF;
再度計測してみたところ、-1.3kHzほどになりました。-12ppmなのでいいところでしょう。信号も綺麗です。
さらにもう一段近傍を見てみます。Span 2kHzです。
十分綺麗だと思います。
さて、Si5351Aは、フラクショナルPLLとフラクショナルディバイダで出力を生成することができますが、実は112.5MHzの出力は整数PLL(25MHz x36=900MHz)と整数ディバイダ(1/8)で動作しており、実は条件が甘かったのです。
それでは、フラクショナル動作ではどうでしょうか。今度は13.55331MHzの出力を観察してみます。これは、25MHz x(24 +2/3)=616.666MHz、ディバイダは2/90の動作となります。同様にスペクトラムを観察します。
Span 40MHz,RBW 500kHzです。方形波なので奇数次の3倍が強く出ています。2倍もそれなりにありますが、これはそういうものです。他にスプリアスは見えませんので十分綺麗です。
近傍はどうでしょうか。
Span 1MHz, RBW 20kHzです。これも十分綺麗。
Span 10kHz, RBW 100Hz。文句ございません。
というわけで、無線用途にも十分使えそうです。フラクショナルディバイダは20bitすなわち10^6の精度がありますので、およそHz単位で周波数設定が可能です。
ちなみに波形はこんな感じです。ちょっと跳ねているのはオシロのプローブのせいだと思われます。
Si5351Aは複数の出力を得られますが、実は同じ周波数に設定したり、さらに位相差や反転の設定が可能です。例えばこんな出力を得ることができます。
Adafruitのライブラリは位相差の設定をサポートしていないので、別のEtherkitのライブラリを使用しました。EtherkitもSii5351Aボードを販売していて、ライブラリをやはりgithubで提供しています。同じようにサンプルがありますのですぐに試せます。
位相差の設定は7bitの精度しかなく、設定可能な範囲も限定的です。しかしながら、たとえば90度位相差を生成してのクァドラチャミキサのローカル信号生成に使えるかもしれません。というわけでSi5351Aは安価な割にはいろいろと遊べそうです。
リファレンス
-
Strawberry LinuxのSi5351Aモジュール900円 https://strawberry-linux.com/catalog/items?code=15351
-
Adafruitのモジュール https://www.adafruit.com/product/2045
-
AdafruitのSi5351AのHow-to https://learn.adafruit.com/adafruit-si5351-clock-generator-breakout/wiring-and-test
-
AdafruitのArduinoライブラリ https://github.com/adafruit/Adafruit_Si5351_Library
-
データシート https://www.silabs.com/Support%20Documents/TechnicalDocs/Si5351-B.pdf
-
レジスタの設定方法のアプリケーションノート。Manually Generating an Si5351 Register Map https://www.silabs.com/Support%20Documents/TechnicalDocs/AN619.pdf
-
SparkFun Pro Micro 3.3V 8MHz https://www.sparkfun.com/products/12587
-
Arduino環境(>=1.6)へのアドオン https://github.com/sparkfun/Arduino_Boards
-
EtherkitのArduinoライブラリ https://github.com/etherkit/Si5351Arduino