3月ブログ更新をうっかりしそこなってしまいました・・・(´・ω・`)
とりあえずここのところいろいろと私事やら何やらで更新する気にならなかったという言い訳をしておきましょう。
ところでSiliconLab製の便利なSi5351Aは入手性も良好で、製作例も最近多く見かけるようになってきました。Si5351は3つのバリエーションがあって、Si5351Cにあっては8波同時出力が可能となっていますが、いずれのバリエーションも内蔵されたVCOは2つにとどまっています。
ほら、どれもVCOは2つしかないでしょ? |
VNシリーズの構成は、下のように受信は2波同時(局発、BFO)、送信波1波のみ(送信周波数の信号)で3波同時に出力する必要はありませんでした。
VNシリーズの受信・送信時のSi5351A動作 |
3波目はどちらかのPLLを他ポートと共有せざるを得ない |
さてつぎにいよいよ目的周波数から各設定値の算出方法を考えるわけですが、まずはおなじみの(笑)パラメータと条件のまとめ図をおさらいします。
図の中のa,b,c,fvcoはBFO周波数設定ですでに規定されているので、これらのパラメータの条件は満たされています。次に上の図の2つの式をもとに、fout値を代入することによってパラメータd,e,fを算出する計算式を導きます。
ここからはPCよりもずっと直感的で自由度の高い『直接紙に書く』方法が一番です。下の画像は実際に紙に書いて導き出した記録です。
(クリックすると拡大して見れるかもしれません) |
void Si5351A_ex_fset(long freq_ex){
long a=0, b=0, c=1000000, d=25, e=0, f=0, fbfo=0;
if(TX_freq < 10000000) fbfo = BFO_freq;
else fbfo = BFO_R_freq; // -> BFO frequency checka = fbfo + (calib * (fbfo / 100000)) / 100;
// display frequency adjust to real frequency
b = a % 1000000;
a = (char)(a / 1000000);
if(a > 0 && a < 36){
while(a < 16){
a <<= 1;
c >>= 1;
d <<= 1;
}
}
f = freq_ex / 100;
d = (250000 * (long)a) / f;
e = (250000 * (long)a) % f + ((250000 / c) * b);
ms_set(1, d, e, f, 0);
}
上のコード前半ではBFO周波数値からパラメータa,b,cを割り出しています。この部分はシステムの起動時にはすでに計算されており、各変数をグローバル変数としてコードを省略することも可能です。
コード後半の赤字部分がd,e,fの算出式で、最後に得られた数値をms_set()関数に代入してSi5351Aに転送します。やってみると意外と簡単な式に収まっていますが、各パラメータの条件の制約からこの方法では100Hzステップより細かくできませんでした。
それでも任意の周波数で同時に3波発生可能となったので、何か応用できるものはないだろうかと思案中です。
0 件のコメント:
コメントを投稿