Si5351Aã®äœ¿ãæ¹ãšåäœ
Si5351Aã¯ããã¯ãžã§ãããŒã¿ãFriskSDRã®ããŒã«ã«ããNanoVNAã®ä¿¡å·æºãšããŠè©ŠçšããŠã¿ãŠããŸããSi5351Aã®ä»æ§ã§ã¯ãäžéã¯200MHzãŸã§ãšãããŠããŸãããå®éã«è©ŠããŠã¿ããšãã300MHzãè¶ããåšæ³¢æ°ãŸã§çºçãããããããã§ãã以åæåã«è©Šããæ§åãæžããŸãããããã®åŸã®ç¥èŠããŸãšããŠãããŸãã
Si5351Aã¯ãå éšã«PLLãäºã€ãããã«ãããååšããåºåãäžã€åãåºãããã¯ããã¯ãžã§ãã¬ãŒã¿ã§ããæ°Žæ¶ãšåãããŠ10x10mm以äžã®é¢ç©ã§ã³ã³ãã¯ãã«å®è£ ããããšãã§ããŸãã
倧å€äŸ¿å©ãªããããªã®ã§ããããã®èšå®ã¯å°ããã£ããã§ãå éšæ§æãçè§£ããŠããªããšã¬ãžã¹ã¿ã«äžããèšå®å€ã決ããããšãã§ããŸãããæåã®å®éšã§è©Šããããã«ãArduinoã®ã©ã€ãã©ãªã¯äœçš®é¡ãããããã§ãããç®çã«ã¯ã¡ãã£ãšåããŸããã§ããã®ã§ãåèã«ãããŠãããã€ã€ãFriskSDRãNanoVNAãäœãããã«ã³ãŒããäœæããŠã¿ãŸããã®ã§å°ã解説ããŸãã
Si5351Aã¯å éšãäºæ®µæ§æã«ãªã£ãŠãããåæ®µã®PLLãšãåŸæ®µã®ååšåš(MultiSynth)ãç¬ç«ã«èšå®ããªããã°ãªããªããŸãããPLLãšMultiSynthã¯ããããããã©ã¯ã·ã§ãã«(åæ°ååšåš)ãšãªã£ãŠããŸããåæ®µãåŸæ®µããããã«èªç±åºŠãããã®ã§ãåãåšæ³¢æ°ãåºåãããããã«ãå¯èœãªèšå®ã¯äžæã«æ±ºãŸããŸãããããã«ãèšå®ã«ããã£ãŠããã€ãèæ ®ããªããã°ãªããªãå¶çŽããããŸãã
PLLãšMultiSynthã¯äŒŒããããªåæ°ååšåšãšãªã£ãŠããããã®ååšæ¯ã¯äžã€ã®æŽæ°ã䜿ã£ãŠè¡šçŸã§ããŸãã
a + b / c
èšå®ã«ããã£ãŠãŸãæŒãããŠãããã°ãªããªãã®ãã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ã®äœçœ®ã¯åæ°ååšåšã®å°äœã®äœçœ®ã«æ¥ãŸãã®ã§ãèšå®åšæ³¢æ°ã«ãã£ãŠå€§ããå€åããŸãã
200MHzã
300MHzãéã«SpurãæžããŸããã
ã¡ãªã¿ã«260MHzã ãšãã£ãšç¶ºéºã«ãªããŸããæ°Žæ¶ããäžåºŠ10åã®åšæ³¢æ°ã§ãæŽæ°æ¯ã®åäœãšãªã£ãŠããããã§ãã
ã¡ãªã¿ã«è¿åã®æ§åã§ããããããSpan 5MHzãRBW 10kHzã§ãã
20MHz
100MHz
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















