AM送信機用VFOをSi-5351Aで作る

2021.06.23 JA1VCW

１． 初めにいまさらですがAM，CWの自作の送信機があります。 807のHF機（1.9～10MHz）と、832Aの50MHzです。 そして今までDDSの発振器をVFOとして使用していましたが、ちょっと使いずらかったので専用のVFOを作りました。 前記送信機専用です。 以前秋月で興味本位で買ったSi-5351Aがありましたので使ってみました。
２． 発生周波数
AMはほぼ決まった周波数で、またCWも若干可変できれば良いので、切り替えて下記の周波数を発生します。 切り替えはロータリーエンコーダーで行います。
これらの固定の周波数は桁を指定して、その桁の数値を可変できるようにします。 CWの時に必須です。
（CWをそんなに運用しているわけでは無いのですが、アマ無線としてCWの使えない機械は寂しい）

No. 送信周波数 VFO周波数 逓倍
備考KHz
kHz
11900
1900
1
1.9 CW
235203520
1
3.5 CW337573757
13.7 AM
47020
7020
17 CW
571957195
17 AM
61012510125
110 CW
7501008350
650 CW
8505508425
650 AM
9506008433
650 AM
10506208437
650 AM
11reserve
12reserve
13reserve
14reserve
VFO周波数がSi-5351Aの発生周波数です
VFO周波数はここでは100Hz桁を四捨五入して表示しています。
実際の発生周波数は±20Hz以内位です。

ついでに周波数をメモリする機能を付けました。 実際にどの程度有効か分かりません。
発生周波数を1～8の番号を付けたメモリにセイブ／ロードできます。
Si-5351Aは設定にシリアルバス（I2C）を使いますので、CPUを使うと便利です。
CPUは私個人の標準として用いるAVRのATmega328Pを使用します。
プログラムは今までと同じようにBASICコンパイラ（BASCOM-AVR）で作ります。
仕様変更などは比較的簡単にできますので、先ずは後出の仕様でプログラムします。

1３． ブロック図

周波数コントロール
I2C

BufferOSCSi-5351A

CPUAtmega328P※2※150MHz用（8MHz台）

BPF-1
LPF-2
LPF-3

HF用
74HC148
Encoder

74HC164
S->P

Rotaly Encoder

SW

STBY，CALBand コントロール※1 Bufferは74HC00※2 Analog SW 4066
BPF-1： 7，10，50/6 MHz用LPF-2： 3.5MHz用LPF-3： 1.9MHz用

ブロック、部品は次のようです。
１）50MHz用とHF用（1.9MHz～10MHz用）の2つに出力を分けました。 送信機が2台有るため各々に対応します。
２）出力はサイン波が良いので、フィルタを入れました。 出力周波数によってフィルタを選択します。
３）出力は<10dBm 程度です。
４）Bufferとフィルタ入力の切り替えはOSC出力が矩形波なのでデジタルIC で切り替えました。
同様にフィルタ出力切り替えはアナログSW を用いました。 フィルタのターミネーションやアナログSWのon抵抗等いろいろ検討すべきことがありますが、条件を考えて適当に考えました。 もっと上手な方法はあると思います。
５）送受切り替えはSi-5351Aの出力をon/off することによって行います。
６）その他のコントロールはシリアル転送やエンコーダICを使います。
７）コントローラ基板は秋月製 AE-Atmega用。 ATmega328Pが使用できる基板。 基板の1部分しか使用しないのでムダが多いのですが実配よりも楽なので使います。
８）発振器はSi-5351A。 以前買っておいたこの発振器がありましたので試用しました。
ICが予め基板に付いているタイプです。 I2Cバスでコントロールします。 アマゾンでも類似品が安価で売ってます。
９）LCD： 16文字*2行 秋月で以前購入したもの。 LED バックライト付です。 パラレルバス用です。
OLEDもあります。 これは表示がきれいですが少し高価。
１０）ロータリーエンコーダーは秋月の1回転24パルスのものですが、使用方法がロータリーSWに近いので、この位のパルス数のほうが使いやすいです。
１１）コンパイラは今までBASCOM-AVR を使ってきたので今回もそれを使用しました。
Arduino＋スケッチ も多くの例が発表されています。

2４． インターフェイス
１）Si-5351AはI2CバスによってCPUとインターフェイスします。 Si-5351Aの電源電圧は3.3Vで使用するため、CPUの電源電圧が5Vの場合は注意が必要です。 AVRのCPUを5V電源で使用する場合は必ずCPU内のTWI というI2C互換の機能を使用しなければなりません。 一般のIOピンをプログラムでI2Cバスの動作をさせる場合は、レベルシフタが必用です。
+3.3V+3.3V+5V
SDA

SDA

SCL

SCL

CPU

Si-5351A+5V+5V +3.3V

+3.3V

SDA

SDA

SCL

SCL

CPU

I/F

今回の接続・AVRでTWI インターフェイス使用・TWIを使用するBASIC命令がある・使用できる理由は、AVRのTWI はドライバがオープンドレインになっているため・PICは未調査
CPUが+5Vの時の一般的な接続
・I/Fは専用のレベルシフタ用デバイス
・またはMOSFET を使ったレベルシフタ
・市売のボードでは、あらかじめレベルシフタがついているものがあります・今回使用の秋月のボードはレベルシフタは付いていません

Si-5351A

+3.3V
+3.3V

+3.3V

SDA

SDA

SCL

SCL

CPU

Si-5351A

CPUが+3.3Vの時の一般的な接続

２）SWとのインターフェイス
全スイッチをI/Oポートに接続するとI/Oが不足する可能性があるので、エンコーダーIC を使いました。
パラレル／シリアルのIC を用いても良かったのですが、エンコーダーIC を使うと割り込みが使い易くなるためそうしました。
３）コントロール信号の操作
LPF などのコントロールはシリアルで行います。 シリアル／パラレル変換のIC を1個使用します。
ちょっと古いですが、74HC164を使いました。データとクロックの2線でコントロールします。
74HC164 は出力にラッチが付いていないため、コントロール内容を変更する時に出力に不要信号が一瞬発生します。 それは今回は問題がないので使用しました。 問題がある場合は74HC595 が良いと思います。 この場合はラッチのための信号が1本追加で、3本のコントロール線が必要です。
４）LCDの接続
パラレルI/O のLCDを4bitバスで使いましたが、I2Cバス使用のLCDもあります。 これを使用しますとSi-5351Aと一緒に接続できるので、I/O pin の節約になります。
I2C用にしますと、I/O pin が6pin多く使えますので、仕様によってはCPUのI/O pin のみで構成して、追加のIC をなくすることも可能です。

3

５． 動作
凡その操作です。 今回は内容が比較的単純なので、これを仕様とします。
本来ならば動作が単純でもちゃんと詳細の仕様書を書いておかないと、あとになって分からなくなることが多発します。 でも今回は・・・ 思い付きによって内容が変わる場合があります。 下記はイメージです。
１） P-onで初期設定の周波数を発生します。
２） ロータリーエンコーダーを回すと決まった周波数を切り替えて発生。 （1ページの表の周波数）
３） ２）で決まった周波数を発生中、Digit のSW で変更したい桁を指定できます。
４） ロータリーエンコーダーを回すと３）で指定した桁がup／dwn します。
５） ２）と３）のモードはFixed／Variable のSWで切り替えます。
６） Mem sel のSW を押すとアドレス番号とそこに記憶されている周波数が表示されます。
７） ロータリーエンコーダーを回すとメモリーの周波数とそのアドレス番号が変更できます。
８） ６）の表示周波数が必要な周波数であれば、Mem recall のSW でその周波数を発生します。
９） ６）で現在の周波数をsaveしたい場合は、Mem save でSWで表示のアドレス番号にsave されます。
１０） メモリー内容は電源off で消去されます。 （消去されないようにもできます。どちらが良いか使ってみてから決めます）
ケースとして 200*150*40 の一般の？アルミシャーシを使用。
表面を磨いて軽くクリアラッカーをスプレーしています。 まじめに塗装はしていません。
奥行 150

LCD表示

Fixed／Variable Digit

Mem save
Mem selCalload

高さ 40

Lock

Rotaly Encoder

幅 200
６． プログラムプログラムはBASICコンパイラ（BASCOM-AVR）を使います。
Si-5351Aの周波数設定については、初めてカタログなどを見た時はどうしてよいか分かりませんでした。
先達の方のHP等で勉強させていただきました。 周波数を設定するだけでBASICで約4.5kbyteでした。
今回調べたパラメーターの設定方法は、付１．を参照ください。
それ以外は単に表示とSWのインターフェイスなので、難しいことはありません。 （でもそれなりに時間はかかりました）
ソースリストはコメントや改行などすべてを含んで730行位、プログラム容量で8.7kbyte程度でした。
（同じものを作ろうとされる方もいないと思いますので、ソースプログラムは省略します）。

4６． 結果
１）仕様の動作はします。
２）周波数確度はボードについている25MHz の水晶発振子に依存すると考えますが、室温25度あたりで10MHz±20Hz 以内でした。 電源on1分後くらいから数時間経過の変化です。
経時変化や温度変化は分かりません。
３）この確度は一般的な水晶発振器（パッケージされたもの）程度です。
４）補正なしで80Hz程度ずれていました。 プログラムで周波数補正して上記程度です。
５） AM のVFOとしての性能としては十分です。
６）スプリアスや純度についてはスペアナが無い（壊れてしまった）ために、分かりません。
本当はこの性能も重要ですが・・・
７． その他
１）トラブルがありました。 Si-5351Aのコントロールで発振のイネーブルを（I2Cバスに）送出するとロータリーエンコーダーが誤動作しました。 回転方向がランダムに逆になります。
その送出さえしなければ他は正常に動作します。
オシロなどで観測しても、波形としておかしい所はありません。 プログラムの制限などずいぶん調べましたが分からず、ちょっと困りました。 なんとなくCPUとロータリーエンコーダーの配線が長めだなと思って、CPUのピンの所にコンデンサを入れたら正常に動作するようになりました。
ノイズが載っていたようです。
たまたまこの長さの線があって、 実験だからとして長めの線を付けまま、コンデンサ（0.47u）も入れてあると安心していたのが悪かったようです。
（コンデンサは実はロータリーエンコーダーの接点チャタリング除去用です）
このトラブルの解決に延べ10時間以上かかりました。 まったくお粗末でした。

約80cm（ツイスト）
CPU IC
PD2
PD1

各ピンとGNDに1000pあとで追加
43
0.47u*2

4.7k*2

ロータリーエンコーダー２）なぜか約1.7MHz以下の周波数が設定できません。 1.8MHzから周波数を下げてゆくとこの辺りで周波数が全く違った周波数を発振します。
PLLを900MHz付近で使用していますが、これを600MHz位に落とすと、設定不可の周波数が下がります。 しかし現象は発生します。
一応VFOとして仕様は満足していますので、差し当たってこのまま使用します。
正常に動作しているときは特にキャリアが濁るとか、レベルが大きく変動するようなことはありません。
３）発振の純度を調べたいのですが、測定器がありません。 まあ、受信機を使ったりなどすれば全くできないことはないのでしょうが、定量的に面倒（この言葉は良くないのですが）です。
キャリアを受信して特に変ではないのでokとします。

5

８． 写真８．１ 前面
１）ちょっと小さめ。
２）相変わらず、パネルの刻印が無い。
３）右上の穴はパネルロック機能のための、押しボタンSW を付ける予定。

奥行 150パネルの様子（再掲 ）LockMem save
Mem selloadCal

高さ 40

LCD表示

Rotaly Encoder
Fixed／Variable Digit

幅 200
表示部拡大
バックライトが暗い。 明るくすると電流が大きくなって、CPU基板の7805が熱くなる。
レギュレータを外付けにすればよいがまあ、当分このまま。
最近はもっときれいな表示器がありそうです。
これはジャンク箱から取り出した、5年位前の古いものです。

6

８．２ 内部
１）コネクタと接続ケーブルは多すぎ。 右の2枚のジャノメ基板を、2倍の大きさの1枚基板で作ればコネクタが3個は減る。
２）LCDもI2CバスタイプにしてI/Opinを有効に使い、全体の仕様を検討すればICも2個は減りそう。
３）ゴム足は丁度よい大きさがなかったので、手持ちのものを両面粘着テープで仮に貼り付けてあります。
４）目的の動作はしていますが、よくできたとは言い難い出来です。
５）出力はRCAジャックを使いました。 50MHz用とHF用(1.9～10MHz アマバンド）の2つに分けて出力。
６）フィルタの切り替えなどもう少し工夫があっても良かったかも。
７）ジャノメ基板は秋月の72mm*47mm です。
右上の基板は、発振器、バッファ、SWインターフェイス、フィルタ等のシリアルコントロール。
右下の基板は、フィルタ、フィルタ切り替え、出力バッファ 等。
８）電源は+12VDCの、ACコンセントにレギュレータが付いたもの。

Si-5351A

スタンバイ入力

VFO出力
HF，50MHz

7電源 +12V

９． 回路図 （参考です。 回路図は拙稿の執筆時のものです。 予告なく変更することがあります。
また、ミス、間違い等ありましたらご容赦ください ）8

9

付１． Si5351Aの周波数設定
付１．１ 設定方法、計算
Si5351A の周波数を設定するときのパラメータは図の通りです。 IC自体はもっと機能がありますが、最も基本的な動作として、特定の周波数を発生させる動作です。
fxtal
Xtal osc

fpll
PLL

fms0MS0

fpll = fxtal * （a + b / c ）AfoutR

fout0 = fms0 / R

fms0 = fpll / （d + e / f ）B

PLL： 600～900MHz 発振器（分数分周比を使用して桁の多い周波数を発生）
MS0： 可変分数分周器（今回は偶数整数の分周器として使用）
R： 固定分周器 （1,2,4,8・・・128分周 今回は1分周で使用）
１）上図で frpll ，fms0 及び Rを決めなくてはなりません。 a～f ，R の数値です。
２）方針としては位相雑音をどのように少なくするかです。 位相雑音に関しては次のようです。
（私は理論的に良く分かっているわではありません。 一般的なことです）ａ． 周波数を整数N で分周すると、位相雑音は1／N になる。
ｂ． 周波数を整数N 逓倍すると位相雑音はN倍になる。
ｃ． 分数の部分 b / c ， e / f の値が整数にならない場合は、整数の時よりも位相雑音が増える。
ｃ．については位相雑音が分数の値によってどの程度増えるかはわかりません。
分周した分位相雑音は減りますが、元々のデバイス固有の位相雑音、例えば多チャンネルの場合の他のチャンネルからのクロストーク、発振回路の位相雑音、電源などからのノイズの混入などによって限界があります。 また、配線やプリントパターンの引き回し、GND の取り方などによっても位相雑音やスプリアスの量は変化します。
３）前記を考慮して① fpll はXtal （25MHz）を逓倍して600MHz～900MHzにするので、位相雑音はXtal 単体の24～36倍になります。 b/c を整数以外にするとさらに位相雑音が増えます。
② fms0 はfpll を分周するのでその分位相雑音は減ります。 e / f を整数以外にすると整数だけよりも位相雑音が増えます。 したがって整数に設定した方が良いと考えます。
③ R はもともと整数なので、1以外に設定すればその分位相雑音が減少します。
fms0 の分周が整数でしたら、それに含めて考えれば良いでしょう。
４）このような状況でａ． R = 1 とする。
ｂ． fms0 の分周である （d + e / f ） を整数にする。 すなわち e / f を 0 または 1 にする。
またd を偶数整数（注）にするため、右シフト、左シフトを行ってLSBを 0 にする。
ｃ． fpll を目的の出力周波数にするために （a + b / c ）の3つのパラメータを決める。
この時は b / c が整数以外になることは致し方ない。
（注）Si-5351Aでは d や a は偶数整数がジッタに対して良いとAN619に記述がある。

10

付１．２ 計算例
例として、fout = 7151kHz として計算します。
１） R = 1とすれば考え方が容易になるのでそうします。 また以下A，B は前ページの図に従います。
２） fout = fms0 = fpll / B となります。 ここで B は位相雑音の関係から整数にします。
900MHz / 7151kHz = 125.856・・・
整数にするために小数点以下を切り捨てて B = 125。
さらにBを偶数整数にするために、右シフト、左シフトを行ってLSBを 0 にする。 従って B=124。
３） fpll = fms0 * B なので、fpllは 7151kHz * 124 = 886.724MHz でなくてはいけません。
４） fpll = fxtal * A ここで fxtal = 25MHz なので A = fpll / fxtal = 35.46896 = （a + b / c ）５） a = 35 （整数部 ） b / c = 0.46896（小数部 ）、 この小数部分を b / c で表します。
b，cは2進で20bit の数値です。 最大 1048575 （0xFFFFF） です。
６） cを分解能を最大にするために設定最大値（1048575）として b / c = b / 1048575 = （小数部 ）なので b = 1048575 * （小数部 ）。 これで a = 35 ， b = 491739 ， c = 1048575 と決まります。
７） d～f は前出の通り d = 124 ， e = 0 ， f = 1 です。
パラメータの算出、設定をまとめると次のようになります。
Foutを発生する場合の各数値の算出式 （Fout<150MHz ）fpll max ： 動作時の最大 PLL 周波数
fxtal ： 水晶発振子の周波数
R： 固定分周 = 1 したがって fms0 = fout
として、a～f を次のように算出します。
d = INT （fpll （max ）／fout ）INT： 少数点以下切り捨て
d ： 偶数整数化
e=0 ， f=1
fpll = fms0 * da = INT （fpll ／fxtal ）c = 1048575
b = INT （（mod （fpll ／fxtal ））*c ）MOD： 剰余
この値をSi-5351Aの仕様によってPLL，MSn の各P1～P3 の値に計算します。
PLLの設定P1［17:0］ = 128 * a + INT （128 * b / c ) – 512
P2［19:0］ = 128 * b – c * INT （128 * b / c )P3［19:0］ = cMSnの設定
P1［17:0］ = 128 * d + INT （128 * e / f ) - 512
P2［19:0］ = 128 * e – f * INT （128 * e / f )P3［19:0］ = f
PLLとMSn の2組のP1～P3の値を必要な8bitレジスタ用に分解・構成して、I2Cバスを通してSi-5351Aに設定します。 それらの方法はアプリケーション・ノート（AN619 ）に記述があります。
また、そのほかのパラメータもAN619 の順序に従って設定します。
設定値の範囲などもあります。 AN619 を参照して下さい。
ほとんどの計算は整数演算で済みますが、一部小数が必要な場合がありますのでその時は浮動小数演算を行っています。 浮動小数点演算は単精度と倍精度の2つがありますが、両方を試したところ私の場合は発生周波数がわずかに違ったので、倍精度演算がよかろうと考え使用しています。
注意 いくつかの仕様書に記述違いがあります。（どの部分かは失念） 今回はAN619 を基準としました。

11

付１．３ 設定のようす
AN619では設定シーケンスが決まっていますが、設定毎にすべてのシーケンスは行わず、次のように分けて設定します。 本当に正しいかどうかは分かりませんが、実際に行ってみて、問題は無い様です。
１）周波数設定シーケンス以外の必要な設定（AN619参照）をreset（スタート）後に1回のみ実施。
２）周波数を変える度に下図①～⑥のシーケンスを送出。
２）の途中でバスの交信が途絶えている所は、この時に設定値を計算しているためです。

① ②③ ④ ⑤⑥
I2Cバス波形
周波数設定シーケンス①出力をディスエーブル②PLLデータ計算③PLLデータ送出してレジスタを設定④MSnデータ計算⑤MSnデータ送出してレジスタを設定⑥出力をイネーブル
上側 クロック（SCL）
下側 データ （SDA）

上記①の部分を拡大
Hiのレベルがうねっているのが気になる
まあレベルが小さいのでokでしょう12付 ２． バンドパス・フィルタ （7MHz～10MHz）
フィルタ設計プログラムElsieを使用して値を求め、nanoVNAで測定しました。 手持ちのコイルで、且つ作りっぱなしなので若干特性が不備の点がありますが、OKとします。

Chebyshev type
CF： 9.3MHz
BW： 2.76MHzRipple： 0.01dB

振幅特性

カッコ内の値が計算値

リターン・ロス

21.01MHz-46.1dB

13