3CHクロックジェネレータSi5351Aの勉強をしています。
前回は、Arduino のライブラリ EtherKit Si5351のサンプルプログラムを使って、動作を確認しました。
今回は、ライブラリを使わないで、信号を発生させてみます。
参考にしたのは、JL1VNQ局の「万年準備中のブログ」の記事です。
この記事では、PIC16F1827でSi5351Aをコントロールしています。ソースリストが公開されていましたので、Arduinoに移植してみました。(JL1VNQ局ありがとうございます。)
PLLAの発振周波数 fvco=800MHz とし、CLOCK0の出力周波数fout=10MHzを発生させるスケッチです。
---------------------------------------
#include <Wire.h>
const byte si5351_Addr = 0x60;
void setup(){
Wire.begin(); // Arduino is Master.
si5351_cmd(3,0xFF); //Disable Output
si5351_cmd(16,0x80); //CLOCK0 Power down
PLL_set();
MS0_set();
si5351_cmd(177,0xA0);//Reset PLLA and PLLB
si5351_cmd(16,0x4F); //CLOCK0 Power up
si5351_cmd(3,0xFE); //Enable CLOCK0
}
Wire.begin(); // Arduino is Master.
si5351_cmd(3,0xFF); //Disable Output
si5351_cmd(16,0x80); //CLOCK0 Power down
PLL_set();
MS0_set();
si5351_cmd(177,0xA0);//Reset PLLA and PLLB
si5351_cmd(16,0x4F); //CLOCK0 Power up
si5351_cmd(3,0xFE); //Enable CLOCK0
}
void loop(){
}
}
void si5351_cmd(byte Reg , byte Data){
Wire.beginTransmission(si5351_Addr);
Wire.write(Reg);
Wire.write(Data);
Wire.endTransmission();
}
Wire.beginTransmission(si5351_Addr);
Wire.write(Reg);
Wire.write(Data);
Wire.endTransmission();
}
//fvco = fxtal * (a+(b/c)
//a=32 b=0 c=1
//MSNA_P1=128*a+(128*(b/c))-512=128*32+(128*(0/1)-512=3584=B1110 0000 0000
//MSNA_P2=128*b-c*(128*(b/c)=128*0-1*(128*(0/1))=0
//MSNA_P3=c=1
//a=32 b=0 c=1
//MSNA_P1=128*a+(128*(b/c))-512=128*32+(128*(0/1)-512=3584=B1110 0000 0000
//MSNA_P2=128*b-c*(128*(b/c)=128*0-1*(128*(0/1))=0
//MSNA_P3=c=1
void PLL_set(){
si5351_cmd(26,0); //MSNA_P3[15:8]
si5351_cmd(27,1); //MSNA_P3[7:0]
si5351_cmd(28,0); //MSNA_P1[17:16]
si5351_cmd(29,B00001110); //MSNA_P1[15:8]
si5351_cmd(30,0); //MSNA_P1[7:0]
si5351_cmd(31,0); //MSNA_P3[19:16]MSNA_P2[19:16]
si5351_cmd(32,0); //MSNA_P2[15:8]
si5351_cmd(33,0); //MSNA_P2[7:0]
}
si5351_cmd(26,0); //MSNA_P3[15:8]
si5351_cmd(27,1); //MSNA_P3[7:0]
si5351_cmd(28,0); //MSNA_P1[17:16]
si5351_cmd(29,B00001110); //MSNA_P1[15:8]
si5351_cmd(30,0); //MSNA_P1[7:0]
si5351_cmd(31,0); //MSNA_P3[19:16]MSNA_P2[19:16]
si5351_cmd(32,0); //MSNA_P2[15:8]
si5351_cmd(33,0); //MSNA_P2[7:0]
}
//fout = fvco / (a+(b/c)
//a=80 b=0 c=1
//MS0_P1=128*a+(128*(b/c))-512=128*80+(128*(0/1)-512=9728=B0010 0110 0000 0000
//MS0_P2=128*b-c*(128*(b/c)=128*0-1*(128*(0/1))=0
//MS0_P3=c=1
void MS0_set(){
si5351_cmd(42,0); //MS0_P3[15:8]
si5351_cmd(43,1); //MS0_P3[7:0]
si5351_cmd(44,0); //MS0_P1[17:16]
si5351_cmd(45,B00100110); //MS0_P1[15:8]
si5351_cmd(46,0); //MS0_P1[7:0]
si5351_cmd(47,0); //MS0_P3[19:16]MS0_P2[19:16]
si5351_cmd(48,0); //MS0_P2[15:8]
si5351_cmd(49,0); //MS0_P2[7:0]
}
//a=80 b=0 c=1
//MS0_P1=128*a+(128*(b/c))-512=128*80+(128*(0/1)-512=9728=B0010 0110 0000 0000
//MS0_P2=128*b-c*(128*(b/c)=128*0-1*(128*(0/1))=0
//MS0_P3=c=1
void MS0_set(){
si5351_cmd(42,0); //MS0_P3[15:8]
si5351_cmd(43,1); //MS0_P3[7:0]
si5351_cmd(44,0); //MS0_P1[17:16]
si5351_cmd(45,B00100110); //MS0_P1[15:8]
si5351_cmd(46,0); //MS0_P1[7:0]
si5351_cmd(47,0); //MS0_P3[19:16]MS0_P2[19:16]
si5351_cmd(48,0); //MS0_P2[15:8]
si5351_cmd(49,0); //MS0_P2[7:0]
}
コンパイルしたスケッチサイズは、2266byte(7%)です。
詳しい説明は、次回に行いますが、とりあえず、10MHzを発生することができました。(周波数は、やや低めですが・・)
出力は、12.3dBm=17mWでした。(出力は、レジスタ16で調整できます)
Si5351のデータシートとレジスタ説明書AN619を読みながら、勉強を進めていきます。
ただ、どちらも英文ですので、どこまで理解できるか、?ですが、できるだけ分かりやすく解説をしていきたいと思います。
目標は、Si5351Aを使ったVFOです。これも既にJL1VNQ局のブログに例があり、参考にさせていただきたいと思います。