chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32F103驅(qū)動(dòng)SI5351 3通道時(shí)鐘信號(hào)發(fā)生器輸出不同頻率信號(hào)

jf_88434166 ? 來(lái)源:jf_88434166 ? 作者:jf_88434166 ? 2025-08-10 15:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

Si5351 是一款 I2C 可配置時(shí)鐘發(fā)生器,非常適合在成本敏感型應(yīng)用中替代晶體、晶體振蕩器、壓控晶體振蕩器 (VCXO)、鎖相環(huán) (PLL) 和扇出緩沖器。Si5351 基于 PLL/VCXO + 高分辨率 MultiSynth 小數(shù)分頻器架構(gòu),可在每路輸出上產(chǎn)生高達(dá) 200 MHz 的任意頻率。Si5351 提供三種版本,以滿足各種應(yīng)用需求。Si5351A 使用內(nèi)部振蕩器生成多達(dá) 8 個(gè)自由運(yùn)行時(shí)鐘,可替代晶體和晶體振蕩器。Si5351B 增加了一個(gè)內(nèi)部 VCXO,可靈活地替代自由運(yùn)行時(shí)鐘和同步時(shí)鐘。它無(wú)需使用成本更高的定制可調(diào)晶體,同時(shí)在較寬的調(diào)諧范圍內(nèi)提供可靠的運(yùn)行。Si5351C 具有相同的靈活性,但與外部參考時(shí)鐘 (CLKIN) 同步。

一、SI5351發(fā)生器簡(jiǎn)介

SI5351A是一款I(lǐng)2C 接口、低功耗、高集成度的多輸出時(shí)鐘發(fā)生器,由一個(gè)固定的晶振25MHz輸入,生成最多 3 路獨(dú)立頻率輸出(CLK0/CLK1/CLK2),頻率范圍從8 kHz 到 160MHz(典型為 100MHz)。
主要特性

  • 輸入時(shí)鐘源:25MHz 或 27MHz 晶振
  • 輸出端口:CLK0、CLK1、CLK2(最多三路)
  • 輸出頻率范圍:8kHz ~ 160MHz(典型使用不高于 100MHz)
  • 內(nèi)部結(jié)構(gòu):內(nèi)部 PLL x2、MSynth x3、分頻器、R-divider
  • 通訊接口:I2C,支持 400kHz 標(biāo)準(zhǔn)通信速率,器件地址:1100000+讀寫(xiě)位
  • 輸出類(lèi)型:CMOS 方波輸出
  • 電源電壓:3.3 ~ 5VDC
  • 工作溫度:-40℃ ~ 85℃
    Si1.jpg

二、功能框圖


PLL:兩個(gè)(PLLA、PLLB),由 XTAL 倍頻得到高頻時(shí)鐘(600-900MHz)
MSynth:三組,分別控制 CLK0/1/2,通過(guò)分頻得到最終輸出
R-0/1/2:在 MSynth 后,還可進(jìn)一步進(jìn)行 1~128 的 2?次分頻(影響輸出頻率)

三、主要寄存器

地址3:配置輸出使能控制,地址15-23:配置外部時(shí)鐘輸入分頻,每路輸出開(kāi)關(guān),通道時(shí)鐘源等

地址2641:配置PLLA/B(設(shè)置VCO頻率),P1, P2, P3 構(gòu)成 PLL 分?jǐn)?shù)乘法器,使得 PLL freq 在 600 ~ 900 MHz 之間。

地址42
91:配置Multisynth 分頻器(設(shè)置輸出),也是 P1/P2/P3 三段式分頻,要求 R_DIV 分頻值在 4~900 且必須為偶數(shù)

四、輸出頻率的計(jì)算和配置說(shuō)明

由上面的功能框圖可知,SI5351A包括PLL+MultiSynth(多合成分頻器)+輸出R分頻器,每個(gè)通道都有一個(gè)獨(dú)立的多合成分頻器和R分頻器。此外,還內(nèi)置了一個(gè)工作頻率為 25 MHz 或 27 MHz 的普通振蕩器電路,但它需要一個(gè)外部晶體。PLL由三個(gè)主要電子電路組成:相位比較器、VCO 和反饋分頻器(FMD)。對(duì)于 FMD 的每個(gè)不同編程設(shè)置,VCO 將產(chǎn)生不同的頻率。
為了提高頻率分辨率(從寬步長(zhǎng)到更細(xì)的步長(zhǎng)),Si5351A 的PLL后接了一個(gè)分頻器電路,Skyworks 將其命名為多合成分頻器 (OMD)。在 Si5351A 中,Skyworks 增加了第二個(gè)分頻器級(jí)(稱為 R),可以進(jìn)一步劃分合成器產(chǎn)生的頻率。
輸出分頻器的缺點(diǎn)是輸出頻率 (fout) 將低于 VCO 頻率 (fvco)。在 Si5351A 中,最小分頻為 4。這意味著 VCO 頻率總是比輸出頻率高至少四倍。但是,頻率步進(jìn)可以小得多,例如 1 Hz,而不是很寬的頻率步進(jìn),例如 25 kHz。這完全取決于如何設(shè)置 FMD 和 OMD 比例。

如何根據(jù)參考頻率 (fref) 生成所需的輸出頻率 (fout)。輸出頻率由下面的公式表示

f_{out}=frac{f_{ref}·FMD}/{OMD·R}=f_{vco}/{OMD·R}

其中FMD和OMD的比率也可以表示為 FMD=a+b/c,OMD=d+e/f,即基準(zhǔn)頻率和輸出頻率完整關(guān)系為:

f_{out}={f_{ref}·(a+b/c)}/{R·(d+e/f)}

根據(jù)上述公式,除了**f_{out}f_{ref}**的數(shù)值已知,有七個(gè)未知變量,**f_{ref}**為輸入時(shí)鐘源25M或27M,**f_{out}**為輸出的頻率。看手冊(cè)可知FMD和OMD的比率是有范圍限制的,F(xiàn)MD比率可以從15 + 0/1048575到90 + 0/1048575,OMD比率可以是4,也可以是8+1/1048575~2400,根據(jù)這個(gè)范圍可以得到a=15到90,b=0,c=1048575,注意分母不能為0。R分頻器只能為1,2,4,8,16,32,64,128。輸出低于500KHz,則需使用R分頻。



同時(shí)你還需要了解小數(shù)分頻模式 與 整數(shù)分頻模式,兩者的區(qū)別是對(duì)相位噪聲 / 雜散 / 抖動(dòng) 的影響,F(xiàn)MD和OMD都是可以使用整數(shù)或小數(shù)進(jìn)行分頻,小數(shù)分頻方式允許更靈活地產(chǎn)生任意頻率,F(xiàn)MD 和 OMD 的比率被稱為小數(shù)。缺點(diǎn)就是會(huì)引入雜散和相位抖動(dòng)。故如果要求低抖動(dòng)(比如用于 ADC/DAC 時(shí)鐘),應(yīng)盡可能讓分頻系數(shù)為整數(shù),避免小數(shù)。使用什么模式則看你的應(yīng)用,可以都為整數(shù)(只要輸出頻率允許),這樣雜散最低,不過(guò)產(chǎn)生頻率就沒(méi)有那么靈活。如果你只能選擇一個(gè)在小數(shù)模式下工作,那就盡量讓 OMD 是整數(shù)模式,F(xiàn)MD 允許小數(shù),因?yàn)檫@樣輸出頻率的雜散更小。OMD 后面直接連接著你的“輸出引腳”,所以它分頻后的信號(hào)質(zhì)量最直接影響外部設(shè)備。此外,“a”和“d”分別是 輸出頻率公式中的分子/分母,如果能選擇偶數(shù),可以改善調(diào)制器行為,降低雜散。
這里以輸出59.779MHz為例來(lái)分析計(jì)算,通過(guò)反推的技巧,計(jì)算出未知變量的具體值。由手冊(cè)的R分頻說(shuō)明,意味著R=1。VCO頻率范圍要在600M到900MHz內(nèi),使用900MHz進(jìn)行計(jì)算。

R·OMD=OMD=d+e/f}={f_{voc}}/{f_{out}}=900000000/59779000=15.05545425651148

這意味著d=15,又因?yàn)镽=1,所以e / f的比率是0.44133412745682。比率四舍五入,這既不是整數(shù),也不是偶數(shù)。因此將d進(jìn)行四舍五入為偶數(shù)整數(shù),即d=16,然后待回去檢查VCO頻率是否還在600M到900MHz內(nèi)。如果不在,則增大或減少2個(gè)數(shù)值。這里16代入換算是超出VCO頻率范圍的,即d=14。由于希望OMD要在整數(shù)模式下,e / f比值是不重要的。因此可以得到,d=14,e=0,f=1或 ≤ 1048575(最大分辨率)的值都可以。
現(xiàn)在OMD的未知變量知道了,后面繼續(xù)找出FMD的未知變量,即a,b,c。
FMD=a+b/c={R·(d+e/f)·f_{out}}/{f_{ref}}=1·(14+0/1))·59779000/25000000=33.47624

其中33為FMD整數(shù)部分的a,b / c = 0.47624。如何求解余數(shù)部分等式,最直接的方法,就是將c設(shè)為1048575,這樣,b就等于499373.358。
通過(guò)以上的計(jì)算,得到a=33,b=499373.358,c=1048575,d=14,e=0,f=1,R=1。把這些數(shù)值代入驗(yàn)證:
f_{out}={f_{ref}·(a+b/c)}/{R·(d+e/f)}={25000000·(33+499373.358/1048575)}/{1·(14+0/1)}=59779000

輸出頻率沒(méi)有問(wèn)題。如果輸出頻率低于500KHz,就要使用R分頻,重復(fù)上面步驟,變換公式,將有效R值(1,2,4,8,...,128)代入即可。如果想要SI5351A產(chǎn)生最低頻率,邊界頻率就要設(shè)置為2048,R分頻設(shè)置為最大128。
最低輸出f_{out}={VCO}/{OMD·R}={600MHz}/{2048·128}≈ 2.288KHz

通過(guò)上述的分析,輸出頻率的計(jì)算和配置就基本明了了,SI5351A的基本工作原理可以理解為:將時(shí)鐘輸入源送入到兩個(gè)PLL鎖相環(huán)中,然后PLL將將基準(zhǔn)頻率倍頻,輸出一個(gè)高頻的參考時(shí)鐘,高頻范圍要在600M~900MHz內(nèi),再將PLL輸出時(shí)鐘送入到MultiSynth(多合成器模塊),合成器接收到PLL信號(hào),合成器則進(jìn)行可編程分頻,將 PLL 的高頻信號(hào)變成你需要的輸出頻率。如果輸出頻率低于 500 kHz,則需加上R分頻。
最后說(shuō)明下,雖然Si5351A芯片理論上支持最高200MHz,最低2.5kHz。但實(shí)際會(huì)受晶振偏差,帶寬限制,板子電路設(shè)計(jì)等物理限制因素影響。建議輸出頻率要在【160MHz,8KHz】使用。

五、STM32F103驅(qū)動(dòng)SI5351A

準(zhǔn)備工作

STM32F103C8T6最小系統(tǒng)板、SI5351時(shí)鐘信號(hào)發(fā)生器、測(cè)量信號(hào)的示波器、連接線若干。

引腳接線

STM32F103C8T6SI5351時(shí)鐘信號(hào)發(fā)生器
3.3VVIN
GNDGND
PA3SCL
PA5SDA

代碼示例

SI5351A.c

#include "si5351a.h"

static void I2C_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOA, ENABLE );  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_3;  /* PA3-I2C_SCL、PA
	5-I2C_SDA*/
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
}

///////////IIC初始化//////////////
void IIC_SI5351A_GPIO_Init(void)
{	   
  I2C_GPIO_Config();
}  
////////////粗略延時(shí)函數(shù)//////////
void Delay_1us(u16 n)//約1us,1100k
{
  unsigned int x=5,i=0;
  for(i=0;i< n;i++)
  {while(x--);x=5;}
}
void Delay_ms(u8 n)//約0.5ms,2k
{
  unsigned int x=5000,i=0;
  for(i=0;i< n;i++)
  {while(x--);x=5000;}
}
////////IIC啟動(dòng)函數(shù)//////////
void I2C_Start(void)
{
  SDA_H; 	
  SCL_H;
  Delay_1us(1);
  if(!SDA_read) return;//SDA線為低電平則總線忙,退出
  SDA_L;
  Delay_1us(1);
  if(SDA_read) return;//SDA線為高電平則總線出錯(cuò),退出
  SDA_L;
  Delay_1us(1);
  SCL_L;
}
//**************************************
//IIC停止信號(hào)
//**************************************
void I2C_Stop(void)
{
  SDA_L;
  SCL_L;
  Delay_1us(1);
  SCL_H;
  SDA_H;
  Delay_1us(1);                 //延時(shí)
} 
//**************************************
//IIC發(fā)送應(yīng)答信號(hào)
//入口參數(shù):ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(u8 i)
{
  if(1==i)SDA_H;                  //寫(xiě)應(yīng)答信號(hào)
  else SDA_L;
  SCL_H;                    //拉高時(shí)鐘線
  Delay_1us(1);                 //延時(shí)
  SCL_L ;                  //拉低時(shí)鐘線
  Delay_1us(1);    
} 
//**************************************
//IIC等待應(yīng)答
//返回值:ack (1:ACK 0:NAK)
//**************************************
 bool I2C_WaitAck(void) 	 //返回為:=1有ACK,=0無(wú)ACK
{
  unsigned int i;
  SDA_H;			
  Delay_1us(1);
  SCL_H;
  Delay_1us(1);
  while(SDA_read){i++;if(i==5000)break;}
  if(SDA_read)
  {SCL_L;
  Delay_1us(1);
  return FALSE;}
  SCL_L;
  Delay_1us(1);
  return TRUE;
}

//**************************************
//向IIC總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
//**************************************
void I2C_SendByte(u8 dat)
{
  unsigned int i;
  SCL_L;
  for (i=0; i< 8; i++)         //8位計(jì)數(shù)器
  {
    if(dat&0x80){SDA_H;}   //送數(shù)據(jù)口
    else SDA_L;
    SCL_H;                //拉高時(shí)鐘線
    Delay_1us(1);             //延時(shí)
    SCL_L;                //拉低時(shí)鐘線
    Delay_1us(1); 		  //延時(shí)
    dat < <= 1;          //移出數(shù)據(jù)的最高位  
  }					 
}

//**************************************
//從IIC總線接收一個(gè)字節(jié)數(shù)據(jù)
//**************************************
u8 I2C_RecvByte()
{
  u8 i;
  u8 dat = 0;
  SDA_H;                    //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
  for (i=0; i< 8; i++)         //8位計(jì)數(shù)器
  {
    dat < <= 1;
    SCL_H;                //拉高時(shí)鐘線
    Delay_1us(1);            //延時(shí)
    if(SDA_read) //讀數(shù)據(jù)    
    {
      dat |=0x01;
    }                           
    SCL_L;                //拉低時(shí)鐘線
    Delay_1us(1);
  } 	
  return dat;
} 
//**************************************
//向IIC設(shè)備寫(xiě)入一個(gè)字節(jié)數(shù)據(jù)
//**************************************
bool Single_WriteI2C(u8 Slave_Address,u8 REG_Address,u8 REG_data)
{
  I2C_Start();              //起始信號(hào)
  I2C_SendByte(Slave_Address);   //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  I2C_SendByte(REG_Address);    //內(nèi)部寄存器地址,
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  I2C_SendByte(REG_data);       //內(nèi)部寄存器數(shù)據(jù),
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  I2C_Stop();                   //發(fā)送停止信號(hào)
	return TRUE;
}


u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address)
{
  u8 REG_data;
  I2C_Start();                   //起始信號(hào)
  I2C_SendByte(Slave_Address);    //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;} 
  I2C_SendByte(REG_Address);     //發(fā)送存儲(chǔ)單元地址,從0開(kāi)始
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;} 
  I2C_Start();                   //起始信號(hào)
  I2C_SendByte(Slave_Address+1);  //發(fā)送設(shè)備地址+讀信號(hào)
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  REG_data=I2C_RecvByte();       //讀出寄存器數(shù)據(jù)
  I2C_SendACK(1);                //發(fā)送停止傳輸信號(hào)
  I2C_Stop();                    //停止信號(hào)
  return REG_data;
}


uint8_t i2cSendRegister(uint8_t reg, uint8_t data)
{
  I2C_Start();              //起始信號(hào)
  I2C_SendByte(0xC0);   //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  I2C_SendByte(reg);    //內(nèi)部寄存器地址,
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  I2C_SendByte(data);       //內(nèi)部寄存器數(shù)據(jù),
  if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  I2C_Stop(); 
  return 0;
}


void setupPLL(uint8_t pll, uint8_t mult, uint32_t num, uint32_t denom)
{
  uint32_t P1;					// PLL config register P1
  uint32_t P2;					// PLL config register P2
  uint32_t P3;					// PLL config register P3

  P1 = (uint32_t)(128 * ((float)num / (float)denom));
  P1 = (uint32_t)(128 * (uint32_t)(mult) + P1 - 512);
  P2 = (uint32_t)(128 * ((float)num / (float)denom));
  P2 = (uint32_t)(128 * num - denom * P2);
  P3 = denom;

  i2cSendRegister(pll + 0, (P3 & 0x0000FF00) > > 8);
  i2cSendRegister(pll + 1, (P3 & 0x000000FF));
  i2cSendRegister(pll + 2, (P1 & 0x00030000) > > 16);
  i2cSendRegister(pll + 3, (P1 & 0x0000FF00) > > 8);
  i2cSendRegister(pll + 4, (P1 & 0x000000FF));
  i2cSendRegister(pll + 5, ((P3 & 0x000F0000) > > 12) | ((P2 & 0x000F0000) > > 16));
  i2cSendRegister(pll + 6, (P2 & 0x0000FF00) > > 8);
  i2cSendRegister(pll + 7, (P2 & 0x000000FF));
}


void setupMultisynth(uint8_t synth,uint32_t divider,uint8_t rDiv)
{
  uint32_t P1;					// Synth config register P1
  uint32_t P2;					// Synth config register P2
  uint32_t P3;					// Synth config register P3

  P1 = 128 * divider - 512;
  P2 = 0;							// P2 = 0, P3 = 1 forces an integer value for the divider
  P3 = 1;

  i2cSendRegister(synth + 0,   (P3 & 0x0000FF00) > > 8);
  i2cSendRegister(synth + 1,   (P3 & 0x000000FF));
  i2cSendRegister(synth + 2,   ((P1 & 0x00030000) > > 16) | rDiv);
  i2cSendRegister(synth + 3,   (P1 & 0x0000FF00) > > 8);
  i2cSendRegister(synth + 4,   (P1 & 0x000000FF));
  i2cSendRegister(synth + 5,   ((P3 & 0x000F0000) > > 12) | ((P2 & 0x000F0000) > > 16));
  i2cSendRegister(synth + 6,   (P2 & 0x0000FF00) > > 8);
  i2cSendRegister(synth + 7,   (P2 & 0x000000FF));
}


void si5351aSetFrequency(uint32_t frequency , u8 Chanal )
{
  uint32_t freq_temp;
  uint32_t pllFreq;
  uint32_t xtalFreq = XTAL_FREQ;// Crystal frequency
  uint32_t l;
  float f;
  uint8_t mult;
  uint32_t num;
  uint32_t denom;
  uint32_t divider;
	
  freq_temp = frequency * 1;   //分頻系數(shù)
  divider = 900000000 / freq_temp;// Calculate the division ratio. 900,000,000 is the maximum internal 
                                                                  // PLL frequency: 900MHz
  if (divider % 2) divider--;		// Ensure an even integer division ratio

  pllFreq = divider * freq_temp;	// Calculate the pllFrequency: the divider * desired output frequency
	
  mult = pllFreq / xtalFreq;		// Determine the multiplier to get to the required pllFrequency  36 0 0
  l = pllFreq % xtalFreq;			// It has three parts:
  f = l;							// mult is an integer that must be in the range 15..90
  f *= 1048575;					// num and denom are the fractional parts, the numerator and denominator
  f /= xtalFreq;					// each is 20 bits (range 0..1048575)
  num = f;						// the actual multiplier is  mult + num / denom
  denom = 1048575;				// For simplicity we set the denominator to the maximum 1048575
  // Set up PLL A with the calculated multiplication ratio
  setupPLL(SI_SYNTH_PLL_A, mult, num, denom);
                                                           // Set up MultiSynth divider 0, with the calculated divider. 
                                                                  // The final R division stage can divide by a power of two, from 1..128. 
                                                                  // reprented by constants SI_R_DIV1 to SI_R_DIV128 (see si5351a.h header file)
                                                                  // If you want to output frequencies below 1MHz, you have to use the 
                                                                  // final R division stage
  if( Chanal == 0 ){
		setupMultisynth(SI_SYNTH_MS_0,divider,SI_R_DIV_1);		//設(shè)置分頻后,設(shè)置頻率的系數(shù)也需要更改
                                                                  // Reset the PLL. This causes a glitch in the output. For small changes to 
                                                                  // the parameters, you don't need to reset the PLL, and there is no glitch
		i2cSendRegister(SI_PLL_RESET,0xA0);	
                                                                  // Finally switch on the CLK0 output (0x4F)
                                                                  // and set the MultiSynth0 input to be PLL A
		i2cSendRegister(SI_CLK0_CONTROL, 0x4F|SI_CLK_SRC_PLL_A);
	}
	else if ( Chanal == 1 ){
		setupMultisynth(SI_SYNTH_MS_1,divider,SI_R_DIV_1);
		i2cSendRegister(SI_PLL_RESET,0xA0);	
		i2cSendRegister(SI_CLK1_CONTROL, 0x4F|SI_CLK_SRC_PLL_A);
	}
		else if ( Chanal == 2 ){
		setupMultisynth(SI_SYNTH_MS_2,divider,SI_R_DIV_1);
		i2cSendRegister(SI_PLL_RESET,0xA0);	
		i2cSendRegister(SI_CLK2_CONTROL, 0x4F|SI_CLK_SRC_PLL_A);
		}
}

void SI5351_SetFreq_Clk0(uint32_t frequency)
{
	uint32_t freq_temp;
	uint8_t div_factor, R_diV;
	uint32_t pllFreq;
	uint32_t xtalFreq = XTAL_FREQ;// Crystal frequency
	uint32_t l;
	float f;
	uint8_t mult;
	uint32_t num;
	uint32_t denom;
	uint32_t divider;

	if(frequency < 500000)
	{
		div_factor = 64;
		R_diV = SI_R_DIV_64;
	}else{
		div_factor = 1;
		R_diV = SI_R_DIV_1;
	}
	
	freq_temp = frequency * div_factor;  //fout * R
	divider = 900000000 / freq_temp;// OMD = 900M /(fout * R)
																  
	if (divider % 2) divider--;		// VCO = 600M - 900M, 取偶,整數(shù)模式
	pllFreq = divider * freq_temp;	// VCO = OMD * fout * R

	mult = pllFreq / xtalFreq;		// 取整數(shù)a,VCO = fref * (a + b/c)
	l = pllFreq % xtalFreq;			// 取小數(shù):b/c
	f = l;							
	f *= 1048575;					// b放大
	f /= xtalFreq;					// 獲取b
	num = f;						 
	denom = 1048575;				
	setupPLL(SI_SYNTH_PLL_A, mult, num, denom);
	
	setupMultisynth(SI_SYNTH_MS_0,divider,R_diV);
	i2cSendRegister(SI_PLL_RESET,0xA0);	
	i2cSendRegister(SI_CLK1_CONTROL, 0x4F|SI_CLK_SRC_PLL_A);
}

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "si5351a.h"
 
int main(void)
{
	int Fre_1M = 10000;
	int fre = 5;
	delay_init();	    //延時(shí)函數(shù)初始化	  
	
	IIC_SI5351A_GPIO_Init();
	
	si5351aSetFrequency(112500000 , 0);
	si5351aSetFrequency(1000000 , 1);
	si5351aSetFrequency(10000 , 2);
	
	while(1)
	{
//		SI5351_SetFreq_Clk0(fre*Fre_1M);
//		delay_ms(50);
//		fre += 100;
//		if(fre*Fre_1M > 150000000) fre = 5;
	}
}

效果展示


注意事項(xiàng)

  1. PLL 頻率需始終在 600 ~ 900 MHz 范圍
  2. Multisynth 分頻必須為偶數(shù),4~900
  3. 輸出小于 500KHz 時(shí),建議使用 R_DIV 分頻
  4. 3通道不能同時(shí)輸出高于112MHz
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 晶體振蕩器
    +關(guān)注

    關(guān)注

    9

    文章

    724

    瀏覽量

    32247
  • STM32F103
    +關(guān)注

    關(guān)注

    34

    文章

    486

    瀏覽量

    66618
  • 頻率信號(hào)
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    8655
  • 時(shí)鐘信號(hào)
    +關(guān)注

    關(guān)注

    4

    文章

    491

    瀏覽量

    29572
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【NUCLEO-F412ZG申請(qǐng)】基于STM32F412的DDS信號(hào)發(fā)生器

    STM32F412對(duì)信號(hào)發(fā)生器部分電路進(jìn)行控制4.通過(guò)串口對(duì)信號(hào)發(fā)生器進(jìn)行交互實(shí)現(xiàn)PC對(duì)信號(hào)
    發(fā)表于 11-07 16:34

    用于Si5351任意頻率SI535x-20QFN-EVB

    SI535x-20QFN-EVB,用于Si5351任意頻率
    發(fā)表于 08-25 15:15

    國(guó)產(chǎn)時(shí)鐘發(fā)生芯片MS5351,完全兼容SI5351,代理商貨源

    MS5351M 是瑞盟科技推出的一款通用頻率綜合芯片,通過(guò)I2C配置,可產(chǎn)生從2.5kHz至200MHz的任意時(shí)鐘輸出。可替代晶體、晶體振
    發(fā)表于 07-27 15:07

    使用SI5351STM32F103制作的矢量天線分析儀

    描述矢量天線分析儀和WSPR TX使用 SI5351、數(shù)字混頻 4066 和STM32F103,天線分析儀可以達(dá)到高達(dá) 200Mhz。此外,它可以用作信號(hào)
    發(fā)表于 09-12 07:11

    Si5338 業(yè)界首個(gè)任意頻率、任意輸出時(shí)鐘發(fā)生器

    Si5338 業(yè)界首個(gè)任意頻率、任意輸出時(shí)鐘發(fā)生器 高性能模擬與混合信號(hào)領(lǐng)導(dǎo)廠商Silicon Laboratories日前發(fā)表全新的
    發(fā)表于 11-10 09:39 ?2134次閱讀

    基于ARM的變頻率PWM正弦信號(hào)發(fā)生器的設(shè)計(jì)

    為了實(shí)現(xiàn)對(duì)三相永磁式同步交流伺服電機(jī)頻域響應(yīng)的檢測(cè)需求,提出了一種基于ARM單片機(jī)的變頻率PWM正弦信號(hào)發(fā)生器的設(shè)計(jì)方案,并完成系統(tǒng)的軟硬件設(shè)計(jì)。該系統(tǒng)的硬件部分采用STM32F103
    發(fā)表于 11-08 14:53 ?17次下載
    基于ARM的變<b class='flag-5'>頻率</b>PWM正弦<b class='flag-5'>信號(hào)</b><b class='flag-5'>發(fā)生器</b>的設(shè)計(jì)

    AD9531:3通道時(shí)鐘發(fā)生器,24輸出數(shù)據(jù)表

    AD9531:3通道時(shí)鐘發(fā)生器,24輸出數(shù)據(jù)表
    發(fā)表于 05-15 15:24 ?11次下載
    AD9531:<b class='flag-5'>3</b><b class='flag-5'>通道</b><b class='flag-5'>時(shí)鐘發(fā)生器</b>,24<b class='flag-5'>輸出</b>數(shù)據(jù)表

    STM32F103C8T6的dds Vfo si5351開(kāi)源

    電子發(fā)燒友網(wǎng)站提供《帶STM32F103C8T6的dds Vfo si5351開(kāi)源.zip》資料免費(fèi)下載
    發(fā)表于 08-04 09:19 ?84次下載
    帶<b class='flag-5'>STM32F103</b>C8T6的dds Vfo <b class='flag-5'>si5351</b>開(kāi)源

    Si5351的10kHz至225MHz VFO/RF發(fā)生器

    電子發(fā)燒友網(wǎng)站提供《帶Si5351的10kHz至225MHz VFO/RF發(fā)生器.zip》資料免費(fèi)下載
    發(fā)表于 10-18 17:12 ?40次下載
    帶<b class='flag-5'>Si5351</b>的10kHz至225MHz VFO/RF<b class='flag-5'>發(fā)生器</b>

    基于Si5351的超外差接收設(shè)計(jì)

    在這個(gè)項(xiàng)目中,通過(guò) Si5351 時(shí)鐘發(fā)生器模塊和 Arduino 控制電路增強(qiáng)了本地振蕩。這款新接收器使用了帶有 3 個(gè)中頻變壓的中頻
    發(fā)表于 12-23 14:23 ?18次下載

    瑞盟三通道時(shí)鐘發(fā)生芯片MS5351,完全兼容SI5351

    MS5351M 是杭州瑞盟科技推出的一款通用頻率綜合芯片,通過(guò)I2C配置,可產(chǎn)生從2.5kHz至200MHz的任意時(shí)鐘輸出??商娲w、晶
    發(fā)表于 03-01 14:53 ?3497次閱讀
    瑞盟三<b class='flag-5'>通道</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>發(fā)生</b>芯片MS<b class='flag-5'>5351</b>,完全兼容<b class='flag-5'>SI5351</b>

    用于stm32f103 A/D信號(hào)采集的處理

    用于stm32f103 A/D信號(hào)采集的處理
    發(fā)表于 08-01 18:13 ?6次下載

    MS5351M瑞盟通用頻率綜合兼容SI5351

    MS5351M瑞盟通用頻率綜合兼容SI5351
    發(fā)表于 12-07 15:53 ?3次下載

    信號(hào)發(fā)生器怎么輸出調(diào)制信號(hào) 信號(hào)發(fā)生器輸出信號(hào)衰減如何調(diào)整?

    信號(hào)發(fā)生器怎么輸出調(diào)制信號(hào) 信號(hào)發(fā)生器輸出
    的頭像 發(fā)表于 12-21 14:56 ?8927次閱讀

    信號(hào)發(fā)生器怎么輸出調(diào)制信號(hào)頻率

    信號(hào)發(fā)生器是一種用于生成各種類(lèi)型的電信號(hào)的設(shè)備,廣泛應(yīng)用于電子測(cè)量、通信、科研等領(lǐng)域。在這些領(lǐng)域中,調(diào)制信號(hào)頻率是一個(gè)非常重要的參數(shù)。本文
    的頭像 發(fā)表于 06-03 15:24 ?2401次閱讀