Si5351Aを検討する その1
- 2016/03/03 14:42
- カテゴリー:make:
秋月の新商品を眺めていたら,Si5351AというICが売られているのを見つけました。なになに,クロックジェネレータ?
外付けに水晶発振子を1つ付けると,3kHzから200MHzまでのクロックを任意に生成可能,複数の出力があり,それぞれに周波数設定が出来る,低ジッタ100ps,しかも安いという,大変美味しそうなICです。
私は以前から,安価なTCXOに自分が欲しい周波数がないことに悔しい思いをしてきており,12.8MHzのTCXOからPLLで10MHzを作ったりしました。
これはこれでうまくいったのですが,元々のTCXOの安定度が悪かったり,任意の周波数を作るには分周器の制約が多すぎて,やっぱり生成出来ない周波数がほとんどだったりと,なかなか思い通りに行かないのです。
最近困ったのは,aitendoの時計キットの原発である12MHzと,周波数カウンタの原発である9.765625MHzの2つです。
前者の12MHzについては,オーディオ用にと800円ほどのTCXOが売られていたのでこれで解決,aitendoの時計は笑っちゃうほど正確な時計になりました。
後者の9.765625MHzについてはちょっと説明が必要でしょう。元々秋月の周波数カウンタキットだった私の8桁周波数カウンタの原発は10MHzなのですが,2.4GHzを測定する場合には1024分周のプリスケーラを通します。
1024分周ですから,測定値を直読するには原発を1000/1024しないといけないのですが,それが9.765625MHzです。
ですが,こんな半端な周波数のTCXOなど標準品では売られておらず,仕方がないので鈴商で買った15MHzのTCXOを改造して使っているのが,現在の状況です。
実力は温度変化に対しても3ppmくらいに入っているようなのですが,改造品ですし,改造に使った水晶発振子もごく普通の特性のものですので,TCXOに使うには不安があります。
まあ,2.4GHzなんて測定することはありませんので,オマケ程度に考えて,10MHzの低周波域の原発をTCXOにして使っていました。しかし,9.765625Mhzもちゃんとした原発にする,というテーマは,ずっと未解決のままでした。
そこへ,このSi5351Aです。Si5351Aはクロックジェネレータですが,要するに高性能なPLLですから,いろいろな周波数を生成出来るシンセサイザという素性は,そのまま原発の精度で任意の周波数を作る事が出来るという,まさに夢のようなICと読み替えることが出来るのです。
いや,まてよ。
Si5351Aは,水晶発振子専用の安価なバージョンです。外部クロック入力が可能なのはSi5351Cという上位版だけです。
SI5351Aを使う限り,水晶発振子(それも25MHzか27MHzのどちらか)で使う事になり,そうすると結局普通の水晶発振器と同じ20ppm程度の精度しか得られなくなります。
Si5351Aの主な目的は,1つのクロックソースでUSBやらHDMIやらに必要な様々なクロックを一気に生成出来ることですから,まあやむを得ないとは思うのですが,これでは私の夢がかないません。
悲しんでいても仕方がないので,データシートを見ます。すると,Si5351Aでも水晶発振子の代わりに,外部から信号を入れる方法が書かれていました。ただし1Vp-pの正弦波でないとダメで,0.1uFのコンデンサで直流カットも必要です。
しかもご丁寧に,こうやって信号を入れる場合でも25MHzか27MHzと指定されています。
わざわざそう書いてあるのですから,ちゃんとした理由があるのだと思いますが,アマチュアには知った事ではありません。データシートを見ても,最低25MHz,最高27MHzと書いてあるだけで,他を入れたらダメとは書いてありません。
なら,26MHzならどうだ。25MHzと27MHzの間だし,速度的には問題ないはず。というか問題など考えつかない・・・確か26MHzならTCXOが秋月で安く売られていたはず。
ぱーっと明るい日が差して,私は涙で曇った目を擦りながら,秋月に早速注文です。変換基板と26MHzのTCXOも一緒に注文したことは言うまでもありません。Si5351Aが150円,26MHzのTCXOが2個で350円です。安い。
さて,届いてみたものの,SI5351Aは生成する周波数の設定をレジスタで行うもので,I2Cで書き込むことが必要です。設定値の求め方を見ていると,まず原発から数百MHzの高い周波数をPLLで生成し,これを分数分周比を設定出来る分周器で,最終的にズレのない周波数設定を行うとあります。
分数分周?あまり馴染みがないのですが,なにせHz単位で誤差なしの設定を行うために,分周比の設定は桁数が多く,手で計算していたらきりがありません。それに,PLLで逓倍する周波数も何通りもあり,どれが最適値かわかりません。
うまくPLLでの逓倍を行えば,分数を使わず整数での分周で欲しい周波数が生成出来るので,スプリアスの少ない,より高品質な周波数を得ることが出来ます。でもそんなに人の手で計算するのは,とても大変です。
設定値は200近くあります。きちんと設定するべき設定値だけでも100近くありますので,手で計算するのは,間違いが出ることも含めて非現実だと知りました。
最初の挫折はこれですが,メーカーのサイトを見ていると,やっぱりありました。設定値を計算するツールが。
そりゃそうですよ。ユーザーが任意の周波数を作れることが売りなのに,計算がややこしいから使えませんは,通りません。ツールをダウンロードしてウヒョウヒョいいながら使ってみます。
次の挫折はここです。Si5351Aでは,原発の設定が25Mhzか27MHzのどちらかしか出来ないようになっていました。いや,Si5351AはそういうICですので,文句が言えないんですけど・・・
しかし,これも正面突破。Si5351Cは外部入力が可能な上位版ですが,これで設定値を計算することはできないものかといじってみました。ビンゴ,Si5351Cを選べば,原発を好きな周波数に設定出来るようになっていました。
ここで26MHzを設定,欲しい周波数として10MHzと9.765625MHzを入力すると,10MHzは整数で,9.765625MHzは分数で生成,近似値ではなくジャストの周波数を生成出来る設定値が出てきました。
このうち,Reg.15のクロックソースの設定を水晶発振子モードに手作業で修正すれば,Si5351A用のレジスタ設定値が完成です。
次はi2Cです。
Si5351Aも初めて使いますし,しかも正しい使い方ではありません。動作しないときに何に原因があるのかがわからないと対策も打てないし,結局ダメだった時にあきらめがつきません。もし,I2Cのしょーもないミスに気が付かず,Si5351Aをあきらめてしまったら悔しいじゃないですか。
そこで,I2Cが確実に動く物を用意します。今回は,偶然手元にあったmbedを使ってみます。
実のところ,mbedも初めて使うんですが,聞けばとても簡単だそうですので,使ってみようと思ったわけです。I2Cは旧フィリップスが開発した機内用シリアルインターフェースですが,すでに特許が切れているので誰でも使う音が出来るようになりました。
ただし,なんちゃってではI2Cを名乗るわけにはいかず,事実AVRなどはI2Cとは言っていません。でもmbedではI2Cと言い切っているんですね。気休めでしょうが,安心です。
手元にあるのは,STMicroのSTM32F401 Nucleoです。秋月でも1500円ほどで売られている安価なボードですが,これでmbedが使えるんなら安いですね。
mbedはArduinoのようなプロトタイピングツールです。Arduinoの盛り上がりに危機感を抱いたARMが,ARMでも出来ないもんかと作ったのがmbedというところでしょう。
純正のコンパイラにライブラリが無償,開発環境はWEBアプリで,PCにインストールする必要すらありません。ブートローダは書き込み済みで,出来たオブジェクトはUSBで繋がったターゲットボードにマスストレージで書き込むだけで則動作するという簡便性です。
開発言語はC++で,Arduinoのような変な言語ではありません。ただ,デバッガは使えませんので,やっぱり簡単なプロトタイピング向けというところでしょう。
それにしても,ちゃんとしたCで書けるということと,32bitのCPUで80MHzを越えるパワーですから,随分いい世の中になったものです。
長くなったので,続きは次回に。