主题中讨论的其它部件:CDCE913、 、CLOCKPRO
大家好、
客户输入频率为12MHz、目标输出频率为1196kHz。
客户开发了以下代码、这是用于计算和设置 CDCE913部分频率的正确代码。 然而、设定的输出目标频率为1196kHz、实际示波器测量值为1160kHz。
/** CDCEL913芯片外接晶振频率 单位:kHz*/
#define CLK_IN 12000
/**
*@说明:调整ad芯片的输入频率
*@param f_out 目标频率单位:百Hz
*@返回 NULL
*
void CDCE_Init_set (float f_out)
{
uint8_t i = 0;
uint32_t correctnum = 0;
uint32_t M、N、Q、R;
浮点 Pdiv;
uint8_t reg18、reg19、reg1A、reg1B;
int32_t P;
f_VCO = 0;
uint8_t f_ODR=1;
printf ("f_out:%f\r\n"、f_out);
//a =(float)(f_out /(float) 1000.0f);
f_out =(f_out / 1000.0f);
printf ("f_out:%f\r\n"、f_out);
开始:
I = 0;
f_VCO = f_out;
printf ("f_VCO:%f\r\n"、f_VCO);
f_ODR = f_VCO/1000;
bool 结果= false;
uint8_t f_range;
如果(f_out <= 0)返回;
if (f_ODR<8)
{
while (f_VCO < f_ODR*12 * 1000)
{
i++;
f_VCO = f_out * i;
}
}
其他
{
而(f_VCO < 84 * 1000)
{
i++;
f_VCO = f_out * i;
}
}
而(f_VCO < 231 * 1000)
{
对于(N = 4095;N > 0;N-)
{
对于(M = 511;M > 0;M--)
{
if (((uint32_t)(f_VCO * 1000)% 1000 = 0))
{
if ((uint32_t)((N *(CLK_IN)/M))==(uint32_t)(f_vco))
{
结果= true;
中断;
}
}
其他
{
if (((uint32_t)((float) N *(float)(clk_in)/(float) M)+ correctnum)=(uint32_t)(((f_VCO * 1000)/ 1000))))
{
{
结果= true;
中断;
}
}
}
}
IF (结果)
{
中断;
}
}
IF (结果)
{
中断;
}
其他
{
i++;
f_VCO = f_out * i;
}
}
printf ("M:%d\r\n"、M);
printf ("否:%d\r\n"、N);
printf ("f_VCO:%f\r\n"、f_VCO);
if (((M =0)&&(N =0))||(f_VCO > 231 * 1000))
{
if (correctnum < 11) correctnum++;
否则 correctnum = 1;
printf ("重新查找 M N\r\n");
转到开始;
}
P = 4 -(int)((log ((double) N /(double) M)/ log (2)));
如果(P < 0)
{
P = 0;
}
q =(int)((double) N * pow (2、(double) P)/(double) M);
R =(double) N * pow (2、(double) P)- M * Q;
如果(f_VCO < 125 * 1000)
{
f_range = 0;
}
否则、如果((f_VCO >= 125 * 1000)&&(f_VCO < 150 * 1000))
{
f_range = 1;
}
否则、如果((f_VCO >= 150 * 1000)&&(f_VCO < 175 * 1000))
{
f_range = 2;
}
其他
{
f_range = 3;
}
Pdiv =(uint32_t)(f_VCO)/(uint32_t)(f_out);
printf ("f_VCO:%f\r\n"、f_VCO);
printf ("pdiv:%d\r\n"、(uint8_t) pdiv);
CDCE913_I2C_WriteByte (0x02、0xB4);
CDCE913_I2C_WriteByte (0x03、(uint8_t) Pdiv);
CDCE913_I2C_WriteByte (0x04、0x02);
CDCE913_I2C_WriteByte (0x05、0x50);
CDCE913_I2C_WriteByte (0x06、0x40);
CDCE913_I2C_WriteByte (0x10、0x00);
CDCE913_I2C_WriteByte (0x11、0x00);
CDCE913_I2C_WriteByte (0x12、0x00);
CDCE913_I2C_WriteByte (0x13、0x00);
CDCE913_I2C_WriteByte (0x14、0x0d);//Y2、Y3开关控制,y1不是该引脚控制,固定有Y1
CDCE913_I2C_WriteByte (0x15、0x02);
CDCE913_I2C_WriteByte (0x16、0);
CDCE913_I2C_WriteByte (0x17、0);
reg18 =(N >> 4)& 0xFFF;
reg19 =(N & 0xF)<< 4 |(R & 0xf0)>> 5;
reg1A =(R & 0x1f)<< 3 |((Q >> 3)& 0x7);
reg1B =(Q & 0x7)<< 5 |(P & 0x07)<< 2 |(f_range & 0x03);
CDCE913_I2C_WriteByte (0x18、reg18);
CDCE913_I2C_WriteByte (0x19、reg19);
CDCE913_I2C_WriteByte (0x1A、reg1A);
CDCE913_I2C_WriteByte (0x1B、reg1B);
CDCE913_I2C_WriteByte (0x1C、N);
CDCE913_I2C_WriteByte (0x1D、((N & 0xF)<< 4)|(R & 0xf0));
CDCE913_I2C_WriteByte (0x1E、(R & 0x0F)|(Q & 0xf0));
CDCE913_I2C_WriteByte (0x1F、((Q & 0x07)<< 5)|((P & 0x07)<< 2)|(f_range & 0x03));
使能时钟输出*
HAL_GPIO_WritePin (CLK_CTRL_S0_GPIO_Port、CLK_CTRL_S0._引脚、GPIO_PIN_SET);
}
客户将 Pro-Clock 软件生成的 M、N、fvco 和 Pdiv1值直接放入寄存器中、软件显示输出1.196MHz、但实际测试输出大约为1.156MHz
那么、我想知道这是否正常?
CDCEL913输出频率的精度是多少? 还是最大偏差?
此致、
罗美