TI论坛
直播中

从未拥有

9年用户 971经验值
擅长:可编程逻辑 电源/新能源 光电显示
私信 关注
[问答]

CDCEL913软件调制频率与实际输出不一致是哪里的问题?



  • /** CDCEL913芯片外接晶振频率 单位:kHz*/#define CLK_IN    12000/*** @Description:调整ad芯片的输入频率* @param f_out 目标频率 单位:百Hz* @return NULL*/void CDCE_Init_set(float f_out){    uint8_t i = 0;    uint32_t correctnum = 0;    uint32_t M, N,  Q, R;    float Pdiv;    uint8_t reg18, reg19, reg1A, reg1B;    int32_t P;    float f_vco = 0;    uint8_t f_odr=1;    printf("f_out:%frn", f_out);    //a = (float)(f_out / (float)1000.0f);    f_out = (f_out / 1000.0f);    printf("f_out :%frn", f_out);begin:    i = 0;    f_vco = f_out;    printf("f_vco :%frn", f_vco);    f_odr = f_vco/1000;    bool result    = false;    uint8_t f_range;    if (f_out <= 0) return;    if(f_odr<8)    {            while (f_vco < f_odr*12 * 1000)                {                    i++;                    f_vco = f_out * i;                }            }    else    {                while (f_vco < 84 * 1000)                {                    i++;                    f_vco = f_out * i;                }    }          while (f_vco < 231 * 1000)        {            for (N = 4095; N > 0; N--)                {                    for (M = 511; M > 0; M--)                        {                            if(((uint32_t)(f_vco * 1000) % 1000 == 0))                                {                                    if ((uint32_t)((N * (CLK_IN) / M)) == (uint32_t)(f_vco))                                        {                                                                                        result = true;                                            break;                                        }                                }                            else                                {                                    if(((uint32_t)((float)N * (float)(CLK_IN) / (float)M) + correctnum) == (uint32_t)((f_vco * 1000) / 1000))                                        {                                            {                                                                                    result = true;                                                break;                                            }                                        }                                }                        }                    if (result)                        {                            break;                        }                }            if (result)                {                    break;                }            else                {                    i++;                    f_vco = f_out * i;                }        }    printf("M:%drn", M);    printf("N:%drn", N);    printf("f_vco:%frn", f_vco);    if(((M == 0) && (N == 0)) || (f_vco > 231 * 1000))        {            if(correctnum < 11)correctnum++;            else correctnum = 1;            printf("refind M Nrn");            goto begin;        }    P = 4 - (int)((log((double)N / (double)M)) / log(2));    if (P < 0)        {            P = 0;        }    Q = (int)((double)N * pow(2, (double)P) / (double)M);    R = (double)N * pow(2, (double)P) - M * Q;    if (f_vco < 125 * 1000)        {            f_range = 0;        }    else if ((f_vco >= 125 * 1000) && (f_vco < 150 * 1000))        {            f_range = 1;        }    else if ((f_vco >= 150 * 1000) && (f_vco < 175 * 1000))        {            f_range = 2;        }    else        {            f_range = 3;        }    Pdiv = (uint32_t)(f_vco) / (uint32_t)(f_out);    printf("f_vco:%frn", f_vco);    printf("Pdiv:%drn", (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_Pin, GPIO_PIN_SET);}f_out:1196032.000000
    f_out :1196.031982
    f_vco :1196.031982
    bbbbbbb
    M:498
    N:546
    f_vco:13156.351563
    f_vco:13156.351563
    Pdiv:11
    我的目标输出为1196kHz,
    但是示波器测量到频率为1160kHz。
    但是我用这个代码去计算和设置cdce913的某些频率却是正确的。所以我可以确认是软件计算的 M,N的数值有问题。项目马上交付发现这个问题,希望能尽快解决掉。我看论坛和网上也几乎没有相关的驱动程序。

回帖(2)

夏日余晖

2024-11-12 09:45:04

您输入信号频率是12MHZ吗?您可以附上您配置的ClockPro截图吗?我配置的如下截图:


举报

陈勇

2024-11-12 18:11:13
CDCEL913软件调制频率与实际输出不一致的问题可能由以下几个方面引起:

1. 晶振频率不准确:晶振频率是调制频率的基础,如果晶振频率不准确,会导致调制频率与实际输出不一致。请检查晶振频率是否符合规格要求。

2. 软件算法问题:软件算法可能存在错误或不足,导致调制频率计算不准确。请检查代码中的计算公式和参数设置是否正确。

3. 硬件电路问题:硬件电路可能存在问题,导致调制频率与实际输出不一致。请检查电路连接是否正确,以及各个元器件是否正常工作。

4. 外部干扰:外部干扰可能导致调制频率与实际输出不一致。请检查周围环境是否存在电磁干扰,并采取相应的抗干扰措施。

针对您提供的代码,以下是一些建议:

1. 检查晶振频率是否正确设置。在代码中,晶振频率定义为12000kHz,即12MHz。请确保实际使用的晶振频率与此值一致。

2. 检查代码中的计算公式和参数设置。在CDCE_Init_set函数中,有多个参数和计算公式,需要确保这些参数和公式正确无误。

3. 检查硬件电路。请检查电路连接是否正确,以及各个元器件是否正常工作。

4. 检查外部干扰。请检查周围环境是否存在电磁干扰,并采取相应的抗干扰措施。

5. 调试和测试。在实际应用中,可能需要对代码进行调试和测试,以确保调制频率与实际输出一致。可以尝试使用示波器等工具,观察实际输出的调制频率,与软件计算的频率进行对比,找出问题所在。

总之,解决CDCEL913软件调制频率与实际输出不一致的问题需要从多个方面进行排查和调整。希望以上建议对您有所帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分