SI5351A クロックジェネレータ周波数設定ツール
概要
SI5351Aクロックジェネレータチップを設定するためのPythonベースのコマンドラインツールを作成しました。SI5351Aは、高精度で複数の独立したクロック出力を生成できる固定小数点PLLを内蔵したプログラマブルクロックジェネレータです。固定小数点型のPLLの設定は非常に難しく、高性能なデバイスを使いこなすためには設定周波数に対する固定小数点PLLのレジスタ設定値の自動計算が不可欠です。0.0001%精度で指定された周波数に対応した設定値を計算するプログラムを作りました。
機能
-
マルチチャネル出力: 最大2つの独立したクロック出力を設定
- 1チャネル出力: CH0のみ
- 2チャネル出力: CH0 + CH2
- ディファレンシャル出力: CH0 + CH1(またはCH2)のペア
- ディファレンシャル出力対応: CH1または2でディファレンシャルクロック出力を有効化
- スプレッドスペクトラムクロッキング(SSC): 設定可能な周波数拡散範囲
- 高精度: 分数PLL合成による正確な周波数生成(周波数設定誤差: 0.0001%未満)
- テストモード: 内蔵パラメータ計算検証機能
- 複数ハードウェア対応: FT232HまたはCP2112を使用したI2C通信
必要条件
環境
- OS: Windows 10/11
ハードウェア
- SI5351Aクロックジェネレータチップ
-
I2C-USB変換器(以下のいずれか):
- Adafruit FT232H USB-to-I2Cアダプタ
- Silicon Labs CP2112 USB-to-I2Cアダプタ
- 25MHz水晶発振器(SI5351Aに接続)

SI5351AとI2C-USB変換器の接続を示すブレッドボードセットアップ
プロジェクト用の100円ケース
ソフトウェア依存関係
FT232H使用時
pip install --upgrade adafruit-blinka adafruit-platformdetect
pip install Adafruit_GPIO
CP2112使用時
pip install hidapi
インストール
-
リポジトリをクローン
git clone https://github.com/hwengjp/si5351a_freq_setter cd si5351a_freq_setter
-
依存関係をインストール
-
FT232H使用時:
pip install --upgrade adafruit-blinka adafruit-platformdetect pip install Adafruit_GPIO
-
CP2112使用時:
pip install hidapi
-
FT232H使用時:
-
ハードウェア接続
- I2C-USB変換器のSCLをSI5351AのSCLに接続
- I2C-USB変換器のSDAをSI5351AのSDAに接続
- I2C-USB変換器のGNDをSI5351AのGNDに接続
- 25MHz水晶発振器をSI5351Aに接続
実行ファイル(exe)の生成
PyInstallerを使用して実行ファイルを生成できます:
-
PyInstallerをインストール
pip install pyinstaller
-
exeファイルを生成
# FT232H版 pyinstaller si5351a_freq_setter_FT232H.py --clean pyinstaller si5351a_freq_setter_FT232H.py --onefile --add-binary "C:\\Windows\\System32\\libusb0.dll;." # CP2112版 pyinstaller si5351a_freq_setter_CP2112.py --clean pyinstaller si5351a_freq_setter_CP2112.py --onefile
生成されたexeファイルはdist
フォルダに配置されます。
使用方法
ハードウェア選択
使用するI2C-USB変換器に応じて、適切なプログラムを選択してください:
-
FT232H使用時:
si5351a_freq_setter_FT232H.py
-
CP2112使用時:
si5351a_freq_setter_CP2112.py
基本的な使用方法
# 1チャネル出力(CH0のみ、100MHz)
python si5351a_freq_setter_FT232H.py 100 # FT232H使用時
python si5351a_freq_setter_CP2112.py 100 # CP2112使用時
# 2チャネル出力(CH0: 100MHz + CH2: 200MHz)
python si5351a_freq_setter_FT232H.py 100 200
python si5351a_freq_setter_CP2112.py 100 200
# ディファレンシャル出力(チャネル1)- CH0(100MHz) + CH1(100MHz反転)
python si5351a_freq_setter_FT232H.py 100 -d 1
python si5351a_freq_setter_CP2112.py 100 -d 1
# ディファレンシャル出力(チャネル1)+ CH2独立出力 - CH0(100MHz) + CH1(100MHz反転) + CH2(200MHz)
python si5351a_freq_setter_FT232H.py 100 200 -d 1
python si5351a_freq_setter_CP2112.py 100 200 -d 1
# ディファレンシャル出力(チャネル2)- CH0(100MHz) + CH2(100MHz反転)
python si5351a_freq_setter_FT232H.py 100 -d 2
python si5351a_freq_setter_CP2112.py 100 -d 2
# スプレッドスペクトラム有効
python si5351a_freq_setter_FT232H.py 100 -s
python si5351a_freq_setter_CP2112.py 100 -s
# テストモード(パラメータ計算テスト)
python si5351a_freq_setter_FT232H.py -t 10
python si5351a_freq_setter_CP2112.py -t 10
チャネル構成
- 1チャネル出力: CH0のみが有効(CH1、CH2は無効)
- 2チャネル出力: CH0とCH2が有効(CH1は無効)
-
ディファレンシャル出力: CH0 + 指定チャネル(CH1またはCH2)が有効
- CH0: 通常信号
- 指定チャネル: 反転信号(同じ周波数)
-
ディファレンシャル出力 + 独立チャネル: CH0 + ディファレンシャルチャネル + 独立チャネル
- 例:
-d 1
+fout0
指定 +fout2
指定 → CH0(通常) + CH1(反転) + CH2(独立周波数)
- 例:
コマンドラインオプション
-
fout0
: クロック0の出力周波数(MHz) -
fout2
: クロック2の出力周波数(MHz、オプション) -
-d, --differential CHANNEL
: ディファレンシャル出力を有効化(1または2)- ディファレンシャル出力は常にCH0と同じ周波数で、指定したチャネルに反転信号を出力
-
-d 1
: CH1にCH0と同じ周波数の反転信号を出力 -
-d 2
: CH2にCH0と同じ周波数の反転信号を出力
-
-s, --ssc
: スプレッドスペクトラムクロッキングを有効化 -
-a, --amp FLOAT
: 基本周波数に対する周波数拡散のパーセンテージ(デフォルト: 0.015 = 1.5%) -
-m, --mode {CENTER,DOWN}
: スプレッドスペクトラムモード(デフォルト: DOWN) -
-t, --test INT
: テストモードで指定回数のイテレーションを実行
制限事項
-
-d 2
とfout2
を同時に指定することはできません(CH2はディファレンシャル出力または独立出力のいずれかのみ) -
-d 1
とfout2
は同時に指定可能(CH1: ディファレンシャル、CH2: 独立出力) - 周波数範囲: 0.004MHz ~ 200MHz
- VCO周波数範囲: 600MHz ~ 900MHz
高周波数出力の制限(150MHz超)
150MHz < 周波数 ≤ 200MHz範囲の特別な制限事項:
この範囲では、Silicon Labs AN619仕様書に従い、DIVBY4モードが自動的に使用されます。ただし、以下の制限があります:
-
PLL倍率制限: PLL倍率
a
が偶数の整数である場合のみ安定動作- 動作する周波数例: 162.5MHz (a=26), 175MHz (a=28), 187.5MHz (a=30), 200MHz (a=32)
- 動作しない周波数例: 156.25MHz (a=25, 奇数), 160MHz (a=25.6, 非整数)
-
VCO周波数要件: VCO周波数 = 出力周波数 × 4
- VCO周波数が25MHzの偶数倍になる必要がある
- 例: 162.5MHz → VCO=650MHz (26×25MHz)
-
整数モード必須: PLLは整数モードで動作する必要がある
- 分数モードでは正常な出力が得られない
技術的詳細:
- DIVBY4モードでは固定分周比4が使用される
- マルチシンセ設定値は P1=0, P2=0, P3=1, MSx_INT=1, MSx_DIVBY4[1:0]=11b
- PLL設定において
a + b/c
が偶数整数の場合のみ安定動作が可能
この制限により、150MHz超の範囲では使用可能な周波数が限定されます。周波数設定時にこれらの条件を満たさない場合、計算は正常に完了しても実際の出力は得られません。
テスト機能
パラメータ計算テスト
python si5351a_freq_setter_FT232H.py -t 5 # FT232H使用時
python si5351a_freq_setter_CP2112.py -t 5 # CP2112使用時
このテストは以下の周波数範囲でランダムテストを実行します:
- 100-150 MHz
- 10-100 MHz
- 1-10 MHz
- 0.1-1 MHz
- 0.01-0.1 MHz
- 0.004-0.01 MHz
テストレポート
テスト実行後、以下の情報が表示されます:
- 総テスト数
- 成功数・失敗数
- 成功率・失敗率
- 最大エラー率
- 周波数範囲別の詳細統計
トラブルシューティング
よくある問題
-
I2C-USB変換器デバイスが見つからない
- USB接続を確認
- ドライバーが正しくインストールされているか確認
- FT232H: Adafruit Blinkaライブラリがインストールされているか確認
- CP2112: hidapiライブラリがインストールされているか確認
-
I2C通信エラー
- 配線接続を確認
- SI5351Aの電源供給を確認
- I2Cアドレス(0x60)が正しいか確認
-
周波数設定エラー
- 要求周波数が範囲内か確認
- パラメータ計算の制限を確認
ハードウェア固有の問題
FT232H使用時
- libusb0.dllエラー: システムにlibusb0.dllがインストールされているか確認
- 権限エラー: 管理者権限で実行を試行
CP2112使用時
- HIDデバイス認識エラー: CP2112ドライバーが正しくインストールされているか確認
- VID/PIDエラー: デバイスが0x10C4/0xEA90で認識されているか確認
謝辞
このプロジェクトは以下のライブラリをもとにしています。有用なライブラリを公開していただき感謝いたします。
- Owain Martin氏による元のSI5351A Pythonモジュール
- Adafruit IndustriesによるFT232Hライブラリ