Si5351Aã®äœ¿ãæ¹ãšåäœ
Si5351Aã¯ããã¯ãžã§ãããŒã¿ãFriskSDRã®ããŒã«ã«ããNanoVNAã®ä¿¡å·æºãšããŠè©ŠçšããŠã¿ãŠããŸããSi5351Aã®ä»æ§ã§ã¯ãäžéã¯200MHzãŸã§ãšãããŠããŸãããå®éã«è©ŠããŠã¿ããšãã300MHzãè¶ããåšæ³¢æ°ãŸã§çºçãããããããã§ãã以åæåã«è©Šããæ§åãæžããŸãããããã®åŸã®ç¥èŠããŸãšããŠãããŸãã
Continue Reading
Si5351Aã¯ãå
éšã«PLLãäºã€ãããã«ãããååšããåºåãäžã€åãåºãããã¯ããã¯ãžã§ãã¬ãŒã¿ã§ããæ°Žæ¶ãšåãããŠ10x10mm以äžã®é¢ç©ã§ã³ã³ãã¯ãã«å®è£
ããããšãã§ããŸãã
倧å€äŸ¿å©ãªããããªã®ã§ããããã®èšå®ã¯å°ããã£ããã§ãå
éšæ§æãçè§£ããŠããªããšã¬ãžã¹ã¿ã«äžããèšå®å€ã決ããããšãã§ããŸãããæåã®å®éšã§è©Šããããã«ãArduinoã®ã©ã€ãã©ãªã¯äœçš®é¡ãããããã§ãããç®çã«ã¯ã¡ãã£ãšåããŸããã§ããã®ã§ãåèã«ãããŠãããã€ã€ãFriskSDRãNanoVNAãäœãããã«ã³ãŒããäœæããŠã¿ãŸããã®ã§å°ã解説ããŸãã
Si5351Aã¯å
éšãäºæ®µæ§æã«ãªã£ãŠãããåæ®µã®PLLãšãåŸæ®µã®ååšåš(MultiSynth)ãç¬ç«ã«èšå®ããªããã°ãªããªããŸãããPLLãšMultiSynthã¯ããããããã©ã¯ã·ã§ãã«(åæ°ååšåš)ãšãªã£ãŠããŸããåæ®µãåŸæ®µããããã«èªç±åºŠãããã®ã§ãåãåšæ³¢æ°ãåºåãããããã«ãå¯èœãªèšå®ã¯äžæã«æ±ºãŸããŸãããããã«ãèšå®ã«ããã£ãŠããã€ãèæ
®ããªããã°ãªããªãå¶çŽããããŸãã
PLLãšMultiSynthã¯äŒŒããããªåæ°ååšåšãšãªã£ãŠããããã®ååšæ¯ã¯äžã€ã®æŽæ°ã䜿ã£ãŠè¡šçŸã§ããŸãã
èšå®ã«ããã£ãŠãŸãæŒãããŠãããã°ãªããªãã®ããPLLåŽã§çæå¯èœãªåšæ³¢æ°ãã600ã900MHzã§ãªããã°ãªããªãããšã§ããå¯å€ç¯å²ã1.5åã®ç¯å²ã§ãã®ã§æ¡å€ãšçãã§ãã
äžæ¹ãMultiSynthåŽã«ãå¶çŽããããŸãã150MHz以äžã®åºåãåŸãããã«ã¯ã1/4ã®åºå®ååšæ¯ã䜿çšããå¿
èŠãããããšãæèšãããŠããŸã(AN619 6p 4.2.2ç¯)ãã§ã¯150MHz以äžãªãããšã¯èªåšããšæãã°ãå®ã¯ãŸã å¶çŽããããååšæ¯ã8以äžã®ååšæ¯ã«ã€ããŠã¯ãåæ°ååšæ¯ã䜿ããã4,6,8ã®æŽæ°æ¯ã®ååšåäœåäœã®ã¿ãå¯èœãšãªã£ãŠããŸããPLLã®äžéã600MHzã§ãããã150MHz以äžãçºçãããããšãããšãååšæ¯ã6ãéžæããå¿
èŠãããã®ã§ããåæ§ã«ã100MHz以äžã«èšå®ããããã°ååšæ¯ã8以äžã«èšå®ããããšã«ãªããŸããããã®ç¯å²ã«ãªããšMultiSynthåŽã§åæ°ååšæ¯ã䜿ããããã«ãªããä»»æã®åšæ³¢æ°ãèšå®ããèªç±åºŠãMultiSynthåŽã«åºãŠããŸãããããŠMultiSynthã®ååšã®äžéã¯1800ã§ãã®ã§ã600MHz/1800=333kHzã§åšæ³¢æ°ã®äžéã«éããŸãããã以äžã®åšæ³¢æ°ãèšå®ããããšãããªãä»åºŠã¯MultiSynthã®åŸãã«çšæãããŠãã2^Nã®ååšåšRã䜿ãå¿
èŠããããŸããRã¯1/128ãŸã§èšå®å¯èœã§ããããäžéã¯333kHz/128=ããã2.6kHzãšãªããŸãã
以äžã®ããã«ãåºåãããåšæ³¢æ°ç¯å²ã«ãã£ãŠãèšå®ã®æ¹éãéã£ãŠããŸãããŸãšãããšæ¬¡ã®æ§ã«ãªããŸããÂ
150MHz < Fout ïŒMultiSynth=4ãšããPLLãåæ°æ¯ã§äœ¿ã4xFoutã«èšå®ãã
100MHz < Fout < 150MHz ïŒMultiSynth=6ãšããPLLãåæ°æ¯ã§äœ¿ã6xFoutã«èšå®ãã
333kHz < Fout < 112.5MHz ïŒ1) MultiSynthã8以äžä»»æ(<=1800)ã®åæ°ååšæ¯ã§äœ¿çšããPLLåŽãæŽæ°æ¯ã§åºå®ããã2) MultiSynthã8以äžã®æŽæ°æ¯Nã§äœ¿çšããPLLåŽãNxFoutãšãªãããèšå®ãã(PLLã600~900MHzã«å
¥ãããNãæ±ºãã)
3kHz < Fout < 500kHz ïŒRãé©åã«æ±ºããŠãåŸã¯åã
RFã¢ããªã±ãŒã·ã§ã³ã§ããã°ãRã䜿çšããå¿
èŠã¯ç¡ãããã§ãã
ã¡ãªã¿ã«èšå®å¯èœãªåšæ³¢æ°ã®ã¬ãŸãªã¥ãŒã·ã§ã³ã¯ãèšå®å€ãèšå®æ¹éã«ãã£ãŠå€åããŸããããããæ°10Hzåäœã§ã®èšå®å¯èœã§ããåæ°éšåã®bãšcã¯20ãããã®å¹
ãæã£ãŠããŸãã®ã§ãPLLãŸãã¯MultiSynthã®çåŽã ãæ°10HzçšåºŠããããã¯(é¢åã§ãã)äž¡è
ãä»»æã«èšå®ããæ°ããããªãããã£ãšçްããåè§£èœãåŸãããŸã(ãããé©çšå¯èœãªåšæ³¢æ°é åã¯112.5MHz以äžã«éãããŸã)ããã¡ããäœåšæ³¢æ°ãªããRã倧ããåããšã¬ãŸãªã¥ãŒã·ã§ã³ããã®å现ãããªããŸããå®ã¯CLKå
¥åã«ã1,2,4,8ã®ååšåšãããã®ã§ãPLLåŽã®èšå®è§£å床ãäžããããã®ã§ãããPLLååšåšã®èšå®ç¯å²(15-90)ããå¶çŽãåããŸããå®çšçã«ã¯CLKååšåšã¯äœ¿çšããå¿
èŠã¯ç¡ããšæããŸãã
çæããä¿¡å·ã®è³ªãèæ
®ãããšãå¯èœãªãæŽæ°æ¯ã䜿ããšã¹ããªã¢ã¹ãæžããŸããæŽæ°æ¯ã®å Žåã«é©çšããç¹å¥ãªããããã¬ãžã¹ã¿ã«ãããŸããåæ°æ¯ã䜿ãå Žåã§ããã§ããã ãç°¡åãªæ¯ã«ãªãããã«ãããšè¯ãããã§ãã
以äžã®ããšãããä¿æ°ã決å®ããã«ã¯æ¬¡ã®ãããªæ¹æ³ãè¯ããšæãããŸããPLLãšMultiSynthããããã«ã€ããŠãèšå®ãããåšæ³¢æ°ãšãæ°Žæ¶ããã®ä»ã®æ¡ä»¶ãããa,b,cãæ±ºããŸãããããŠb,cããªãã¹ãç°¡åãªæ¯ã«ãªããããŠãŒã¯ãªããã®äºé€æ³ã䜿ã£ãŠåååæ¯ã®æå€§å
¬çŽæ°ãæ±ããæ¢çŽåæ°ã«ããŸããããã«ãã20ãããã®ç¯å²ã«çŽãŸããªãã£ãå Žåã¯ã粟床ãç ç²ã«ãªããŸããæ°å€ãäžžããŸãã
PLLã®èšå®ã¯äžèšã®ããã«ããŸããMultiSynthãåºå®ååšæ¯(4ãŸãã¯6)ã«èšå®ããŠãPLLã4*freqãŸãã¯6*freqã«èšå®ããŸãã
void
si5351_set_frequency_fixeddiv(int channel, int pll, int freq, int div)
{
  int32_t pllfreq = freq * div;
  int32_t multi = pllfreq / XTALFREQ;
  int32_t num = pllfreq - multi * XTALFREQ;
  int32_t denom = XTALFREQ;
  int32_t k = gcd(num, denom);
  num /= k;
  denom /= k;
  while (denom >= (1<<20)) {
   num >>= 1;
   denom >>= 1;
  }
  si5351_setupPLL(pll, multi, num, denom);
  si5351_setupMultisynth(channel, pll, div, 0, 1);
}
PLLãåºå®ããMultiSynthãå¯å€ããå Žåã«ã¯äžèšã®ããã«ããŸãã
void
si5351_set_frequency_fixedpll(int channel, int pll, int pllfreq, int freq)
{
  int32_t div = pllfreq / freq; // range: 8 ~ 1800
  int32_t num = pllfreq - freq * div;
  int32_t denom = freq;
  int32_t k = gcd(num, denom);
  num /= k;
  denom /= k;
  while (denom >= (1<<20)) {
   num >>= 1;
   denom >>= 1;
  }
  si5351_setupMultisynth(channel, pll, div, num, denom);
}
a,b,c(äžèšã®åŒã§ã¯multi,num,denom)ãæ±ºããããšãã§ããããäžèšã®åŒã«åŸã£ãŠP1,P2,P3ãæ±ããããã8ã€ã®ã¬ãžã¹ã¿(å8ããã)ã«é
眮ããŸãã
P1[17:0] = 128 * mult + floor(128*(num/denom)) - 512
P2[19:0] = 128 * num - denom * floor(128*(num/denom))
P3[19:0] = denom
ããããã¬ãžã¹ã¿èšå®ã«ã¯é åºããããããã«åŸããªããšåšæ³¢æ°åãæ¿ãã®éã«ããŸãèšå®ãããªãããšããããŸãã(å®éã«ããã£ã)ã ããŒã¿ã·ãŒã17pã«ããäžèšãããŒã®ããã«ããŸãã
ããããåãããŠãåšæ³¢æ°ã®ç¯å²ã«ãããèšå®æ¹éãåãæ¿ãããããäŸãã°äžèšã®æ§ã«ããŸãã
void
si5351_set_frequency(int channel, int pll, int freq)
{
 si5351_disable_output();
 if (freq <= 100000000) {
  si5351_setupPLL(pll, PLL_N, 0, 1);
  si5351_set_frequency_fixedpll(channel, pll, PLLFREQ, freq);
 } else if (freq < 150000000) {
  si5351_set_frequency_fixeddiv(channel, pll, freq, 6);
 } else {
  si5351_set_frequency_fixeddiv(channel, pll, freq, 4);
 }
 si5351_reset_pll();
 si5351_enable_output();
}
ãããåšæ³¢æ°ãå¯å€ããå¿
èŠãç¡ããªãããããªã³ãŒãã¯å¿
èŠãããŸããããããããã¬ãžã¹ã¿å€ãèšç®ããŠããã°è¯ãã®ã§ããSi5351Aã®I2Cã¯ãèªåã€ã³ã¯ãªã¡ã³ãåäœãããã®ã§ããããªããŒã¿ãçšæããŠããã°ããŸãšããŠããŒã¿ãéãããšãã§ããŸãã
static void
si5351_bulk_write(const uint8_t *buf, int len)
{
 int addr = SI5351_I2C_ADDR>>1;
 i2cAcquireBus(&I2CD1);
 (void)i2cMasterTransmitTimeout(&I2CD1, addr, buf, len, NULL, 0, 1000);
 i2cReleaseBus(&I2CD1);
}
// register addr, length, data, ...
const uint8_t si5351_configs[] = {
 2, SI5351_REG_3_OUTPUT_ENABLE_CONTROL, 0xff,
 4, SI5351_REG_16_CLK0_CONTROL, SI5351_CLK_POWERDOWN, SI5351_CLK_POWERDOWN, SI5351_CLK_POWERDOWN,
 2, SI5351_REG_183_CRYSTAL_LOAD, SI5351_CRYSTAL_LOAD_8PF,
 // setup PLL (26MHz * 32 = 832MHz, 32/2-2=14)
 9, SI5351_REG_26_PLL_A, /*P3*/0, 1, /*P1*/0, 14, 0, /*P3/P2*/0, 0, 0,
 // RESET PLL
 2, SI5351_REG_177_PLL_RESET, SI5351_PLL_RESET_A | SI5351_PLL_RESET_B,
 // setup multisynth (832MHz / 104 = 8MHz, 104/2-2=50)
 9, SI5351_REG_58_MULTISYNTH2, /*P3*/0, 1, /*P1*/0, 50, 0, /*P2|P3*/0, 0, 0,
 2, SI5351_REG_18_CLK2_CONTROL, SI5351_CLK_DRIVE_STRENGTH_2MA | SI5351_CLK_INPUT_MULTISYNTH_N | SI5351_CLK_INTEGER_MODE,
 2, SI5351_REG_3_OUTPUT_ENABLE_CONTROL, 0,
 0 // sentinel
};
void
si5351_init(void)
{
 const uint8_t *p = si5351_configs;
 while (*p) {
  uint8_t len = *p++;
  si5351_bulk_write(p, len);
  p += len;
 }
}
äžèšãå«ãã³ãŒããgistã«èŒããŠãããŸãã
https://gist.github.com/edy555/f1ee7ef44fe4f5c6f7618ac4cbbe66fb
ãšããã§ã以åã¹ãã¯ãã©ã ã¯ããªã綺éºãšæžããŸããããçºçãããåšæ³¢æ°ã«ãã£ãŠããªãéãããããŸãã20MHz以äžã§ããã°ããªã綺éºã§ãããåšæ³¢æ°ãäžããã«åŸã£ãŠã¹ããªã¢ã¹ãå¢ããŠããŸããããã€ãããŒã¿ãåã£ãŠã¿ãŸããã®ã§ãåèã«äžããŠãããŸãã䜿ã£ãŠããã®ã¯NanoVNAã§ãããªããžãéã£ãåºåãªã®ã§ã-10dBmçšåºŠãšãªã£ãŠããŸããæ°Žæ¶ã¯26MHzã®VCTCXOã§ããã°ã©ãã®çžŠè»žã¯dBãšæžããŠãããŸããdBmã§ãã
ãŸãã¯ä»¥åã詊ãã13MHzãSpanã¯6MHzãRBW10kHzã§ãã2MHzäžäžã«å°ããSpurãèŠããŠãŸãã-70dBcãããã§ããã®åšæ³¢æ°ãªã綺éºã§ããè¿åã®è£Ÿã¯æž¬å®ç³»ã®äœçžãã€ãºã§ãã
åšæ³¢æ°ãã¡ãã£ãšäžããŠ20MHzãSpanã¯10MHzãRBWã¯10kHzãSpurã®ã¬ãã«ãã¡ãã£ãšå¢ããŸãã-4MHzã«ãåºãŠããŸãã-62dBcãããã
ããã«äžããŠ30MHzãããªãSpurãå¢ããŠããŸãã-60dBcãããã
50MHzãããŸãå€ããŸããã
100MHzãããªãå¢ããŠããŸãã-52dBcãããã
100MHzããã¯Span 50MHzã瀺ããŸããRBWã¯500kHzãåºãSpurãååžããŠããŸãã
150MHzãSpurã-40dBcãããã§ããããçµæ§åŒ·ããªã£ãŠããŸãããSpurã®äœçœ®ã¯åæ°ååšåšã®å°äœã®äœçœ®ã«æ¥ãŸãã®ã§ãèšå®åšæ³¢æ°ã«ãã£ãŠå€§ããå€åããŸãã
300MHzãéã«SpurãæžããŸããã
ã¡ãªã¿ã«260MHzã ãšãã£ãšç¶ºéºã«ãªããŸããæ°Žæ¶ããäžåºŠ10åã®åšæ³¢æ°ã§ãæŽæ°æ¯ã®åäœãšãªã£ãŠããããã§ãã
ã¡ãªã¿ã«è¿åã®æ§åã§ããããããSpan 5MHzãRBW 10kHzã§ãã
200MHzããããŸã§ã¯ãè¿åã¯ã»ãšãã©å·®ããããŸãã(枬å®ç³»ã®äœçžéé³çšåºŠ)ã
300MHzãè¿åã®äœçžãã€ãºãå¢ããŠããŸãããããã«ä»æ§ç¯å²å€ã§ãã®ã§ã
312MHzããã®ããããéçã§ãããäœçžãã€ãºãçžåœå€ããªã£ãŠããŸããç¡çãããŠããæ§åãããããŸããäžæ¹Spurã®ã»ãã¯éã«ã¬ãã«ãäžãã£ãŠããŸãã
ãããŸã§ã¯ãã£ãªã¢åšèŸºã瀺ããŸããããæ¹åœ¢æ³¢ã§ãããããŒã¢ãã¯ã¹ã倧éã«åºãŠããŸãã100MHzã«èšå®ãã1GHzãŸã§èŠãå Žåãããªæãã«ãªããŸãããã¡ãã奿°æ¬¡ãäž»ã§ãããå¶æ°æ¬¡ãããçšåºŠååšããŸãã
以äžãSi5351Aã®èšå®æ¹æ³ãšãä¿¡å·ã®è³ªã«ã€ããŠç޹ä»ããŸãããèšå®æ¹æ³ã¯ä»ã«ãéžæè¢ãããã®ã§ãåãããŠä¿¡å·ã®è³ªã¯å€åãããšæããŸãããåŸåã¯åèã«ãªããšæããŸãã
äœãåšæ³¢æ°ã§ã®åºåã¯æ¯èŒç綺éºã§ãããé«ãåšæ³¢æ°ã§ã¯æ³šæãå¿
èŠã§ãããããã¡ããåºæ¿ã¬ã€ã¢ãŠãã«ãã£ãŠå·®ãåºãŠããã¯ãã§ããç¹ã«å€åºåãæŽ»çšããå Žåã¯æ³šæãå¿
èŠã§ãã販売ãããŠãããããããã¬ã€ã¯ã¢ãŠãããŒãã®é¡ã§ã¯ãRFçã«ã¯é§ç®ãããªãã®ããããŸãã®ã§æ³šæãå¿
èŠã§ãã
é©ããã®ã¯300MHzè¶
ãŸã§åºåå¯èœãªããšã§ããããããã«ä¿¡å·ã®å質çã«ã¯ã€ãã€ããªã®ã§æ³šæãå¿
èŠã§ãããäŸãã°VNAãç®çã§ããã°åé¡ã«ãªããŸãããããã£ããã®ãã®èœåãæŽ»çšããããšæã£ãŠããŸãã
ååã®å®éšÂ http://ttrftech.tumblr.com/post/138286883286/
Si5351Aã䜿ã£ãFriskSDR http://ttrftech.tumblr.com/post/140556745841/
Si5351Aã䜿ã£ãNanoVNA(å®éšäž) http://ttrftech.tumblr.com/post/149867208596/
Si5351AããŒã¿ã·ãŒã https://www.silabs.com/Support%20Documents/TechnicalDocs/Si5351-B.pdf
Sillicon Laboratories Application Note 619: Manually Generating an Si5351 Register Map https://www.silabs.com/Support%20Documents/TechnicalDocs/AN619.pdf
èšå®ã³ãŒãã®äŸÂ https://gist.github.com/edy555/f1ee7ef44fe4f5c6f7618ac4cbbe66fb
Adafruitsã®ãã¥ãŒããªã¢ã«Â https://learn.adafruit.com/adafruit-si5351-clock-generator-breakout
Adafruitsã®ã©ã€ãã©ãªÂ https://github.com/adafruit/Adafruit_Si5351_Library
Etherkitã®Arduinoåãã©ã€ãã©ãªãããã«ã¯ä»»æåšæ³¢æ°èšå®ã®ããã®ã³ãŒããå«ãŸããŠããã https://github.com/etherkit/Si5351Arduino