项目背景
为 AD9777提供可变时钟源,实现1KHz可调功能,以便适应不同参数下的数据采集。本次记录以代码、频率实现为主。
工作原理
输出频率计算
:输入频率(取值范围:10-250MHz)
:R预分频器(取值范围:1-1023)
INT :整数分频(取值范围:4/5预分频器为23-65535;8/9预分频器为75-65535)
:小数分频(MOD取值范围:2-4095,FRAC取值范围:0-(MOD-1))
DIV :VCO分频系数(系数范围:1,2,4,8,16,32,64)
通过对输入的参考频率进行整数、小数分频合成,VCO压控振荡器可以输出频率范围:2200MHz-4400MHz。再经过1,2,4,8,16,32,64分频,实现35MHz-4.4GHz频率输出。
以10MHz参考频率输入,100.001M频率输出为例。
经过R分频器对参考频率进行10分频,得到1MHz的PFD频率(此举是为了方便计算VCO的整数部分-INT),按照VCO频率区间(2200MHz-4400MHz),需要对其进行至少22分频输出,22向上取整,实际最低分频系数为32,对应VCO频率为3200.032MHz,经32分频后,输出频率为100.001MHz。INT为3200;FRAC/MOD=0.001。
手册总结
输入频率10-250MHz,输出频率35MHz-4.4GHz。
3线SPI,高位优先,最大速率50MHz,数据位宽32(包括低3位寄存器控制位)。
配置引脚:
CLK :串行时钟输入。数据在CLK上升沿时逐个输入32位移位寄存器。此输入为高阻抗CMOS 输入。
DATA:串行数据输入。串行数据以MSB优先方式加载,三个LSB用作控制位。此输入为高阻抗CMOS输入。
LE :加载使能。当LE变为高电平时,存储在32位移位寄存器中的数据载入三个控制位所选择的寄存器。此输入为高阻抗CMOS输入。
CE :芯片使能信号,高电平有效
寄存器说明
待更新...
Reg0
Reg1
Reg2
Reg3
Reg4
Reg5
#define Freq 10000;//KHz
alt_u16 ADF4351_R_CNT;
alt_u16 ADF4351_DIV ;//分频系数
alt_u32 ADF4351_VCO ;//压控振荡器频率
alt_u32 ADF4351_INT ;//整数部分
alt_u32 ADF4351_MODE ;
alt_u32 ADF4351_FRAC ;
alt_u32 ADF4351_PFD ;//PFD频率1MHz
//计算频率系数
void freq_4351(alt_u32 ADF4351_FREQ)//35M-4400M
{
alt_u32 div ;//分频系数
alt_u32 SUM1 ;
alt_u32 SUM2 ;
alt_u32 EXT ;
ADF4351_PFD=Freq/ADF4351_R_CNT;
ADF4351_R_CNT=10;//R分频器系数
//输入频率范围判断
if(ADF4351_FREQ>=4400000)
ADF4351_FREQ=4400000;
else if(ADF4351_FREQ<=35000)
ADF4351_FREQ=35000;
//参数计算
if(ADF4351_FREQ<=68750)
{
div=64;
ADF4351_DIV=6;
}
else if((68750<ADF4351_FREQ)&&(ADF4351_FREQ<=137500))
{
div=32;
ADF4351_DIV=5;
}
else if((137500<ADF4351_FREQ)&&(ADF4351_FREQ<=275000))
{
div=16;
ADF4351_DIV=4;
}
else if((275000<ADF4351_FREQ)&&(ADF4351_FREQ<=550000))
{
div=8;
ADF4351_DIV=3;
}
else if((550000<ADF4351_FREQ)&&(ADF4351_FREQ<=1100000))
{
div=4;
ADF4351_DIV=2;
}
else if((1100000<ADF4351_FREQ)&&(ADF4351_FREQ<=2200000))
{
div=2;
ADF4351_DIV=1;
}
else if(ADF4351_FREQ>2200000)
{
div=1;
ADF4351_DIV=0;
}
ADF4351_VCO=ADF4351_FREQ*div; //VCO频率
ADF4351_INT=ADF4351_VCO/1000/ADF4351_PFD; //VCO分频系数-整数部分-单位MHz
EXT=ADF4351_VCO%1000; //VCO分频系数-小数部分-单位KHz
//printf("VCO频率 :%d\n",ADF4351_VCO);
//printf("整数int :%d\n",ADF4351_INT);
//printf("分频系数:%d\n",div);
//printf("小数部分:%d\n",EXT);
for(ADF4351_MODE=2;ADF4351_MODE<4096;ADF4351_MODE++)
{
for(ADF4351_FRAC=0;ADF4351_FRAC<ADF4351_MODE;ADF4351_FRAC++)
{
SUM1=ADF4351_FRAC*1000;
SUM2=EXT*ADF4351_MODE;
if(SUM1==SUM2) break;
}
if(SUM1==SUM2) break;
}
//printf("VCO频率 :%d\n",ADF4351_VCO);
//printf("分频系数:%d\n",div);
//printf("小数部分:%d\n",EXT);
//printf("整数int :%d\n",ADF4351_INT);
//printf("ADF4351_FRAC:%d\n",ADF4351_FRAC);
//printf("ADF4351_MODE:%d\n",ADF4351_MODE);
//printf("ADF4351_R_CNT:%d\n",ADF4351_R_CNT);
}
寄存器配置
//配置寄存器地址参数
void reg_4351()
{
adf4351_para[0]=0x0+(ADF4351_INT<<15)+(ADF4351_FRAC<<3);
adf4351_para[1]=0x1+(1<<27)+(1<<15)+(ADF4351_MODE<<3);
adf4351_para[2]=0x2+0X0E40+(ADF4351_R_CNT<<14);
adf4351_para[3]=0x3+0X4B0;
adf4351_para[4]=(1<<23)+(ADF4351_DIV<<20)+0x0803C;
adf4351_para[5]=0x5+0X580000;
}