東南博士 发表于 2020-2-26 09:30

LMX2594的使用案例

LMX2594的使用案例

東南博士 发表于 2020-2-26 09:31

TI公司的LMX2594、LMX2595就是其中具有代表性的一种锁相环集成电路。
本文对集成VCO的锁相环芯片LMX2594、LMX2594进行了介绍,并与Hittite公司的HMC704芯片进行了横向的对比,展示出其优缺点,频综工程师按系统要求合理选择芯片提供了依据。

1、    LMX2594、LMX2595集成VCO,LMX2595为LMX2594内集成2倍频器版本。

LMX2594输出频率范围:10MHz~15GHz

LMX2595输出频率范围:10MHz~19GHz

对比HMC704输出范围:RF输入DC~8GHz

東南博士 发表于 2020-2-26 09:31

2、    LMX2594环路内归一化噪声基底为-236dBc/Hz,归一化1/f噪声为-129dBc/Hz。与Hittite公司的HMC704对比,HMC704的归一化噪声基底为-233dBc/Hz,归一化1/f噪声为-126dBc/Hz。ßLMX2594VCO为7段VCO典型相噪指标:



当VCO=14.5GHz时

10kHz            – 73

100kHz            –99

1MHz               – 121

10MHz             – 143

90MHz            – 152

東南博士 发表于 2020-2-26 09:32

東南博士 发表于 2020-2-26 09:33

3、锁相环中高的鉴相频率能使锁相环倍频次数降低,这样通常意味着输出信号带内噪声的降低。在整数模式下LMX2594的鉴相频率最高为400MHz,小数模式下鉴相频率最高为300MHz。相比HMC704,在整数模式下鉴相频率最高为115MHz,在小数模式下(小数B模式)鉴相频率最高为100MHz。

4、在LMX2594内部VCO输出频率反馈支路上没有预分频器,直接进入高速N分频器,因此能显著的降低杂散的大小与数量。对比HMC704,当VCO反馈频率大于4GHz时必须使用/2预分频器使N分频器的输入频率限制在4GHz以下。

東南博士 发表于 2020-2-26 09:38

5、LMX2594跳频速度=VCO校准时间+环路锁定时间

VCO校准时间:

Noassist   50μs

Partialassist   35μs

Closefrequency   20μs

Fullassist   5μs

東南博士 发表于 2020-2-26 09:39

以下是微控制器控制LMX2594的代码
话说 TI 的LMX2594 真好用!

東南博士 发表于 2020-2-26 09:40

#include "./bsp_lm2592.h"
#include "./bsp_usart.h"
#include <stdio.h>
#include <math.h>

//失锁重置
unsigned long LMX25941_lose_ld_cnt = 0;
unsigned long LMX25951_lose_ld_cnt = 0;

unsigned int LM2594_Reg_Set = {0};
unsigned int LM2595_Reg_Set = {0};

unsigned int IN_FRQ = 0;
unsigned int OUT_FRQ = 0;

unsigned int LM2594_Reg = {
0x700000
, 0x6F0000
, 0x6E0000
, 0x6D0000
, 0x6C0000
, 0x6B0000
, 0x6A0000
, 0x690021
, 0x680000
, 0x670000
, 0x660000
, 0x650011
, 0x640000
, 0x630000
, 0x620000
, 0x610888
, 0x600000
, 0x5F0000
, 0x5E0000
, 0x5D0000
, 0x5C0000
, 0x5B0000
, 0x5A0000
, 0x590000
, 0x580000
, 0x570000
, 0x560000
, 0x550000
, 0x540000
, 0x530000
, 0x520000
, 0x510000
, 0x500000
, 0x4F0000
, 0x4E0003
, 0x4D0000
, 0x4C000C
, 0x4B0800
, 0x4A0000
, 0x49003F
, 0x480001
, 0x470081
, 0x46C350
, 0x450000
, 0x4403E8
, 0x430000
, 0x4201F4
, 0x410000
, 0x401388
, 0x3F0000
, 0x3E0322
, 0x3D00A8
, 0x3C0000
, 0x3B0001
, 0x3A8001
, 0x390020
, 0x380000
, 0x370000
, 0x360000
, 0x350000
, 0x340820
, 0x330080
, 0x320000
, 0x314180
, 0x300300
, 0x2F0300
, 0x2E07FC
, 0x2DC8DF //fix
, 0x2C1FA4 //1FA3
, 0x2B0000
, 0x2A0000
, 0x290000
, 0x280000
, 0x27FFFD //
, 0x26FFFF //
, 0x250604
, 0x240041 //fix
, 0x230004
, 0x220000
, 0x211E21
, 0x200393
, 0x1F43EC
, 0x1E318C
, 0x1D318C
, 0x1C0488
, 0x1B0002
, 0x1A0DB0
, 0x190C2B
, 0x18071A
, 0x17007C
, 0x160001
, 0x150401
, 0x14C848
, 0x1327B7
, 0x120064
, 0x11012C
, 0x100080
, 0x0F064F
, 0x0E1E40 //电荷泵3mA
, 0x0D4000
, 0x0C5001
, 0x0B0018
, 0x0A10D8
, 0x091604
, 0x082000
, 0x0740B2
, 0x06C802
, 0x0500C8
, 0x040A43
, 0x030642
, 0x020500
, 0x010808
, 0x00251C
};

unsigned int LM2595_Reg = {
0x700000
, 0x6F0000
, 0x6E0000
, 0x6D0000
, 0x6C0000
, 0x6B0000
, 0x6A0000
, 0x690021
, 0x680000
, 0x670000
, 0x660000
, 0x650011
, 0x640000
, 0x630000
, 0x620000
, 0x610888
, 0x600000
, 0x5F0000
, 0x5E0000
, 0x5D0000
, 0x5C0000
, 0x5B0000
, 0x5A0000
, 0x590000
, 0x580000
, 0x570000
, 0x560000
, 0x550000
, 0x540000
, 0x530000
, 0x520000
, 0x510000
, 0x500000
, 0x4F0000
, 0x4E0003
, 0x4D0000
, 0x4C000C
, 0x4B0800
, 0x4A0000
, 0x49003F
, 0x480001
, 0x470081
, 0x46C350
, 0x450000
, 0x4403E8
, 0x430000
, 0x4201F4
, 0x410000
, 0x401388
, 0x3F0000
, 0x3E0322
, 0x3D00A8
, 0x3C0000
, 0x3B0001
, 0x3A8001
, 0x390020
, 0x380000
, 0x370000
, 0x360000
, 0x350000
, 0x340820
, 0x330080
, 0x320000
, 0x314180
, 0x300300
, 0x2F0300
, 0x2E07FC
, 0x2DD0DF
, 0x2C1FA4 //1FA3
, 0x2B0000
, 0x2A0000
, 0x290000
, 0x280000
, 0x271A80 //03E8
, 0x26FFFF //0000
, 0x25FFFF //0404
, 0x240028
, 0x230004
, 0x220000
, 0x211E21
, 0x200393
, 0x1F43EC
, 0x1E318C
, 0x1D318C
, 0x1CC048
, 0x1B0003
, 0x1A0DB0
, 0x190C2B
, 0x18071A
, 0x17007C
, 0x160001
, 0x150401
, 0x14C848
, 0x1327B7
, 0x120064
, 0x11012C
, 0x100080
, 0x0F064F
, 0x0E1E40 //电荷泵3mA
, 0x0D4000
, 0x0C5001
, 0x0B0018
, 0x0A10D8
, 0x091604
, 0x082000
, 0x0740B2
, 0x06C802
, 0x0500C8
, 0x040A43
, 0x030642
, 0x020500
, 0x010808
, 0x00251C
};

東南博士 发表于 2020-2-26 09:40

static void SPI_delay_us(unsigned int Cnt)
{
while (Cnt--) {
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
}
}

void LM2594_GPIO_all_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(LM2594_1_CE_CLK |
                         LM2594_1_SCK_CLK |
                         LM2594_1_SDI_CLK |
                         LM2594_1_LD_CLK, ENABLE);
//out_put
GPIO_InitStructure.GPIO_Pin = LM2594_1_CE_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(LM2594_1_CE_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = LM2594_1_SCK_PIN;
GPIO_Init(LM2594_1_SCK_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = LM2594_1_SDI_PIN;
GPIO_Init(LM2594_1_SDI_PORT, &GPIO_InitStructure);

//in_put
GPIO_InitStructure.GPIO_Pin = LM2594_1_LD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(LM2594_1_LD_PORT, &GPIO_InitStructure);
}

void LM2595_GPIO_all_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(LM2595_1_CE_CLK |
                         LM2595_1_SCK_CLK |
                         LM2595_1_SDI_CLK |
                         LM2595_1_LD_CLK, ENABLE);
//out_put
GPIO_InitStructure.GPIO_Pin = LM2595_1_CE_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(LM2595_1_CE_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = LM2595_1_SCK_PIN;
GPIO_Init(LM2595_1_SCK_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = LM2595_1_SDI_PIN;
GPIO_Init(LM2595_1_SDI_PORT, &GPIO_InitStructure);

//in_put
GPIO_InitStructure.GPIO_Pin = LM2595_1_LD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(LM2595_1_LD_PORT, &GPIO_InitStructure);
}


int LM2594_ALL_init(void)
{
LM2594_1_CE_Hi;
LM2594_1_SCK_Hi;
LM2594_1_SDI_Hi;
return 0;
}

int LM2595_ALL_init(void)
{
LM2595_1_CE_Hi;
LM2595_1_SCK_Hi;
LM2595_1_SDI_Hi;
return 0;
}

東南博士 发表于 2020-2-26 09:40

static void LM2594_W_1_byte(unsigned char Dat)
{
int i;
for (i = 0; i <= 7; i++) {//数据低8位,共24位
    LM2594_1_SCK_Lo;
    if (Dat & 0x80) {
      LM2594_1_SDI_Hi;
    } else {
      LM2594_1_SDI_Lo;
    }
    SPI_delay_us(500);
    LM2594_1_SCK_Hi;
    SPI_delay_us(500);
    Dat = Dat << 1;   //左移一位
}
}

void LMX2594_W_3_bytes_Add(unsigned char Add, unsigned int Reg)
{
unsigned char Addr;
unsigned char Dat1;
unsigned char Dat2;

Addr = Add;
Dat1 = (Reg >> 8) & 0XFF;
Dat2 = (Reg >> 0) & 0XFF;

//CS高
LM2594_1_CE_Hi;
SPI_delay_us(500);
//CS低
LM2594_1_CE_Lo;
SPI_delay_us(500);
//SPI写数据
LM2594_W_1_byte(Addr);
LM2594_W_1_byte(Dat1);
LM2594_W_1_byte(Dat2);
SPI_delay_us(500);
//CS高
LM2594_1_CE_Hi;
}


void LMX2594_W_3_bytes(unsigned int Reg)
{
unsigned char Addr;
unsigned char Dat1;
unsigned char Dat2;

Addr = (Reg >> 16) & 0XFF;
Dat1 = (Reg >> 8) & 0XFF;
Dat2 = (Reg >> 0) & 0XFF;

//CS高
LM2594_1_CE_Hi;
SPI_delay_us(500);
//CS低
LM2594_1_CE_Lo;
SPI_delay_us(500);
//SPI写数据
LM2594_W_1_byte(Addr);
LM2594_W_1_byte(Dat1);
LM2594_W_1_byte(Dat2);
SPI_delay_us(500);
//CS高
LM2594_1_CE_Hi;
}

void LMX2594_W_All_dat(unsigned int Reg[])
{
for (unsigned char W_cnt = 0; W_cnt < 113; W_cnt++) {
    LMX2594_W_3_bytes(Reg);
}
}

東南博士 发表于 2020-2-26 09:41

static void LM2595_W_1_byte(unsigned char Dat)
{
int i;
for (i = 0; i <= 7; i++) {//数据低8位,共24位
    LM2595_1_SCK_Lo;
    if (Dat & 0x80) {
      LM2595_1_SDI_Hi;
    } else {
      LM2595_1_SDI_Lo;
    }
    SPI_delay_us(500);
    LM2595_1_SCK_Hi;
    SPI_delay_us(500);
    Dat = Dat << 1;   //左移一位
}
}

void LMX2595_W_3_bytes_Add(unsigned char Add, unsigned int Reg)
{
unsigned char Addr;
unsigned char Dat1;
unsigned char Dat2;

Addr = Add;
Dat1 = (Reg >> 8) & 0XFF;
Dat2 = (Reg >> 0) & 0XFF;

//CS高
LM2595_1_CE_Hi;
SPI_delay_us(50);
//CS低
LM2595_1_CE_Lo;
SPI_delay_us(50);
//SPI写数据
LM2595_W_1_byte(Addr);
LM2595_W_1_byte(Dat1);
LM2595_W_1_byte(Dat2);
SPI_delay_us(50);
//CS高
LM2595_1_CE_Hi;
}


void LMX2595_W_3_bytes(unsigned int Reg)
{
unsigned char Addr;
unsigned char Dat1;
unsigned char Dat2;

Addr = (Reg >> 16) & 0XFF;
Dat1 = (Reg >> 8) & 0XFF;
Dat2 = (Reg >> 0) & 0XFF;

//CS高
LM2595_1_CE_Hi;
SPI_delay_us(500);
//CS低
LM2595_1_CE_Lo;
SPI_delay_us(500);
//SPI写数据
LM2595_W_1_byte(Addr);
LM2595_W_1_byte(Dat1);
LM2595_W_1_byte(Dat2);
SPI_delay_us(500);
//CS高
LM2595_1_CE_Hi;
}

void LMX2595_W_All_dat(unsigned int Reg[])
{
for (unsigned char W_cnt = 0; W_cnt < 113; W_cnt++) {
    LMX2595_W_3_bytes(Reg);
}
}

東南博士 发表于 2020-2-26 09:41

//REG22
//REG24
//REG2A
//REG2B
int In_frq_lmx2594_set(unsigned char IN_Frq_H, unsigned char IN_Frq_M, unsigned char IN_Frq_L, unsigned char OUT_Frq_H, unsigned char OUT_Frq_M, unsigned char OUT_Frq_L, unsigned int reg[])
{
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
unsigned intIN_Frq_rcv = 0;
unsigned intOUT_Frq_rcv = 0;
floatFrq_out_tmp1 = 0;
unsigned intFrq_out_tmp2 = 0;
unsigned intOUT_frac = 0;
unsigned intIN_frac = 0;
unsigned intREF_frac = 0;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
unsigned intout_x00_mhz = 0;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
unsigned intset_reg_int = 0;
unsigned intset_reg_frac = 0;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//频率:in(*10K)
IN_Frq_rcv = (IN_Frq_H << 16) + (IN_Frq_M << 8) + IN_Frq_L;
OUT_Frq_rcv = (OUT_Frq_H << 16) + (OUT_Frq_M << 8) + OUT_Frq_L;
IN_FRQ = IN_Frq_rcv;

IN_frac = IN_Frq_rcv % 10000;
OUT_frac = OUT_Frq_rcv % 10000;

///////////////////////////////////////////////////////////////////////////////////////////////////
//判断,REF_frac取绝对值>0
if (OUT_frac > IN_frac) {
    REF_frac = OUT_frac - IN_frac;
}
if (OUT_frac <= IN_frac) {
    REF_frac = IN_frac - OUT_frac;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

if ((REF_frac > 400) && (REF_frac < 9600)) { //1.100<-x-<9900

    //步骤1:频率寄存器计算:(Frq_rcv+28G*10^5-4.2G*10^5)/0.2G*10^5,
    Frq_out_tmp1 = (float)((IN_Frq_rcv + 2380000) / 10000) / 2;
    Frq_out_tmp2 = (unsigned int)(Frq_out_tmp1 / 2);

    //步骤2:对步骤1向下取整,除2,输出频率_?百MHZ;
    out_x00_mhz = Frq_out_tmp2;

    //步骤3:对步骤2除2取整,寄存器的整数位
    set_reg_int = out_x00_mhz;

    //步骤3:对步骤2除2取余,转换为10khz
    set_reg_frac = (unsigned int)((unsigned int)((Frq_out_tmp1 - out_x00_mhz * 2) * 4) * 536870912);

    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    //寄存器0X24
    reg = set_reg_int;
    //寄存器0X2b
    reg = 0X2B0000 + set_reg_frac % 65536;
    reg = 0X2A0000 + set_reg_frac / 65536;
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...接受频率字*10KHZ:%d... \r\n", IN_Frq_rcv);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...输入的百兆:%d... \r\n", Frq_out_tmp1);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...out_x00_mhz:%d... \r\n", out_x00_mhz);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...set_reg_frac:%d... \r\n", set_reg_frac);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...reg:%x... \r\n", reg);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...reg:%x... \r\n", reg);
} else { //

    //步骤1:频率寄存器计算:(Frq_rcv+28G*10^5-4.2G*10^5)/0.2G*10^5,
    Frq_out_tmp1 = (float)((IN_Frq_rcv + 2380000.0) / 10000.0) / 2;
    Frq_out_tmp2 = (unsigned int)(Frq_out_tmp1 / 2);

    //步骤2:对步骤1向下取整,除2,输出频率_?百MHZ;
    out_x00_mhz = Frq_out_tmp2;

    //步骤3:对步骤2除2取整,寄存器的整数位
    set_reg_int = out_x00_mhz;

    //步骤3:对步骤2除2取余,转换为10khz

    set_reg_frac = (unsigned int)((unsigned int)((Frq_out_tmp1 - out_x00_mhz * 2) * 4) * 536870912 + 107374182);

    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    //寄存器0X24
    reg = set_reg_int;
    //寄存器0X2b
    reg = 0X2B0000 + set_reg_frac % 65536;
    reg = 0X2A0000 + set_reg_frac / 65536;
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...接受频率字*10KHZ:%d... \r\n", IN_Frq_rcv);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...输入的百兆:%d... \r\n", Frq_out_tmp1);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...out_x00_mhz:%d... \r\n", out_x00_mhz);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...set_reg_frac:%d... \r\n", set_reg_frac);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...reg:%x... \r\n", reg);
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...reg:%x... \r\n", reg);
}
return 0;
}

東南博士 发表于 2020-2-26 09:41

//2018年12月24日10:09:08
//2019年1月4日15:06:37
int In_frq_lmx2595_set(unsigned char IN_Frq_H, unsigned char IN_Frq_M, unsigned char IN_Frq_L, unsigned char OUT_Frq_H, unsigned char OUT_Frq_M, unsigned char OUT_Frq_L, unsigned int reg[])
{
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
unsigned intIN_Frq_rcv = 0; //
unsigned intOUT_Frq_rcv = 0;
unsigned intOUT_Frq_rcv_crac = 0;


unsigned intIN_frac = 0;
unsigned intOUT_frac = 0;
unsigned intREF_frac = 0;
unsigned intOUT_Frq_rcv_tem = 0;


float   set_reg_int = 0;
float   set_reg_frac = 0;

float         reg_2a_2b_tmp = 0.0;
float         f_tmp_int = 0.0;

///////////////////////////////////////////////////////////////////////////////////////////////////
//频率:in(*10K)
IN_Frq_rcv = (IN_Frq_H << 16) + (IN_Frq_M << 8) + IN_Frq_L;
OUT_Frq_rcv = (OUT_Frq_H << 16) + (OUT_Frq_M << 8) + OUT_Frq_L;
usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n IN_Frq_rcv:%d\r\n", IN_Frq_rcv);
usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n OUT_Frq_rcv:%d\r\n", OUT_Frq_rcv);
OUT_Frq_rcv_tem = (unsigned int)(OUT_Frq_rcv / 10000);
//小数
IN_frac = IN_Frq_rcv % 10000;
OUT_frac = OUT_Frq_rcv % 10000;
///////////////////////////////////////////////////////////////////////////////////////////////////
/*
    1.100<-x-<9900
    2.x<=100||x>=9900
    3.x=OUT_frac-IN_frac
*/
///////////////////////////////////////////////////////////////////////////////////////////////////
//判断,REF_frac取绝对值>0
if (OUT_frac > IN_frac) {
    REF_frac = OUT_frac - IN_frac;
}
if (OUT_frac <= IN_frac) {
    REF_frac = IN_frac - OUT_frac;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
if ((REF_frac > 400) && (REF_frac < 9600)) { //1.100<-x-<9900
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n无杂散区间%d\r\n", REF_frac);
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    //计算寄存器
    if (OUT_Frq_rcv > 100000) { //倍频
      //判断整数与小数
      if (OUT_frac >= IN_frac) {
      set_reg_int = (unsigned int)((OUT_Frq_rcv / 10000 + 140) / 4) * 4;
      set_reg_frac = OUT_frac - IN_frac + ((unsigned int)(OUT_Frq_rcv / 10000) + 140) % 4 * 10000;
      } else {
      set_reg_int = (unsigned int)((OUT_Frq_rcv / 10000 + 139) / 4) * 4;
      set_reg_frac = 10000 + OUT_frac - IN_frac + ((unsigned int)(OUT_Frq_rcv / 10000) + 139) % 4 * 10000;
      }
      reg_2a_2b_tmp = set_reg_frac * 214748.36465;
//    reg_2a_2b_tmp=set_reg_frac*20;

      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 倍频set_reg_frac:%d\r\n", set_reg_frac);
      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 倍频set_reg_int: %d\r\n", set_reg_int);

      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 倍频reg_2a_2b_tmp:%.2f\r\n", reg_2a_2b_tmp);

      //寄存器
      reg = 0X1b0003; //open
      reg = 0X2DD0DF;
      reg = 0X2C1FA3;
      reg = 0X27FFFF;
      reg = 0X26FFFF;
      reg = 0X240000 + (unsigned int)(set_reg_int / 4);
      reg = 0X220000;
      reg = 0X2b0000 + (unsigned int)((unsigned int)(reg_2a_2b_tmp / 2) % 65536);
      reg = 0X2a0000 + (unsigned int)((unsigned int)(reg_2a_2b_tmp / 2) / 65536);
      reg = 0x250304; // reg=0x250304;
      reg = 0x0c5001;
      reg = 0x0a10d8;
    } else { //不倍频
      //判断整数与小数
      if (OUT_frac >= IN_frac) {
      set_reg_int = (unsigned int)((OUT_Frq_rcv / 10000 + 140) / 2) * 2;
      set_reg_frac = OUT_frac - IN_frac + ((unsigned int)(OUT_Frq_rcv / 10000) + 140) % 2 * 10000;
      } else {
      set_reg_int = (unsigned int)((OUT_Frq_rcv / 10000 + 139) / 2) * 2;
      set_reg_frac = 10000 + OUT_frac - IN_frac + ((unsigned int)(OUT_Frq_rcv / 10000) + 139) % 2 * 10000;
      }
      reg_2a_2b_tmp = set_reg_frac * 214748.36465;
//    reg_2a_2b_tmp=set_reg_frac*20;

      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 不倍频set_reg_frac:%d\r\n", set_reg_frac);
      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 不倍频set_reg_int: %d\r\n", set_reg_int);
      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 不倍频set_reg_frac:%d\r\n", set_reg_frac);

      //寄存器
      reg = 0X1b0002; //close
      reg = 0X2DC8DF;
      reg = 0X2C1FA3;
      reg = 0X27FFFF;
      reg = 0X26FFFF;
      reg = 0X240000 + (unsigned int)(set_reg_int / 2);
      reg = 0X220000;
      reg = 0X2b0000 + (unsigned int)((unsigned int)(reg_2a_2b_tmp) % 65536);
      reg = 0X2a0000 + (unsigned int)((unsigned int)(reg_2a_2b_tmp) / 65536);
      reg = 0x250404;
      reg = 0x0c5001;
      reg = 0x0a10d8;
    }
}

else { //1.(x<200||x>9800)
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n有杂散区间%d\r\n", REF_frac);
    //判断整数与小数
    if (OUT_frac >= IN_frac) {
      OUT_Frq_rcv_crac = OUT_Frq_rcv + 1401000 - IN_frac; //输出频率
    } else {
      OUT_Frq_rcv_crac = OUT_Frq_rcv + 1391000 - IN_frac; //输出频率
    }

    //1.OUT_Frq_rcv/10000%3
//      if(OUT_Frq_rcv_tem%7!=0)//输出频率
//      {
    usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n有杂散区间模%d", OUT_Frq_rcv_crac);

    //计算寄存器
    if (OUT_Frq_rcv > 100000) { ////输出频率>150000
      //倍频计算整数小数
      set_reg_int = (OUT_Frq_rcv_crac - OUT_Frq_rcv_crac % 40000);
      set_reg_frac = OUT_Frq_rcv_crac % 40000;
      reg_2a_2b_tmp = set_reg_frac * 214748.3648; //(2^32/140/100)

      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 倍频reg_2a_2b_tmp:%.2f", reg_2a_2b_tmp);
      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 倍频set_reg_int: %d", set_reg_int);
      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 倍频set_reg_frac:%d", set_reg_frac);

      //寄存器
      reg = 0X1b0003; //open
      reg = 0X2C1FA3;
      reg = 0X2DD0DF;
      reg = 0X27FFFF;
      reg = 0X26FFFF;
      reg = 0X240000 + (unsigned int)(set_reg_int / 40000);
      reg = 0X220000;
      reg = 0X2b0000 + (unsigned int)(reg_2a_2b_tmp / 2) % 65536;
      reg = 0X2a0000 + (unsigned int)(reg_2a_2b_tmp / 2) / 65536;
      reg = 0x250404; // reg=0x250304;
      reg = 0x0c5001;
      reg = 0x0a10d8;

    } else { //不倍频
      //不倍频计算整数小数
      set_reg_int = (OUT_Frq_rcv_crac - OUT_Frq_rcv_crac % 20000) / 10000;
      f_tmp_int = (OUT_Frq_rcv_crac - OUT_Frq_rcv_crac % 20000);
      set_reg_frac = OUT_Frq_rcv_crac % 20000;
      reg_2a_2b_tmp = set_reg_frac * 214748.3648; //(30000/150/100)

      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 不倍频reg_2a_2b_tmp:%.2f", reg_2a_2b_tmp);
      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 不倍频set_reg_int: %d", set_reg_int);
      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 不倍频f_tmp_int: %.2f", f_tmp_int);
      usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n 不倍频set_reg_frac:%d", set_reg_frac);

      //寄存器
      reg = 0X1b0002; //close
      reg = 0X2C1FA3;
      reg = 0X2DC8DF;
      reg = 0X27FFFF;
      reg = 0X26FFFF;
      reg = 0X240000 + (unsigned int)(f_tmp_int / 20000);
      reg = 0X220000;
      reg = 0X2b0000 + (unsigned int)(reg_2a_2b_tmp / 1) % 65536;
      reg = 0X2a0000 + (unsigned int)(reg_2a_2b_tmp / 1) / 65536;
      reg = 0x250404;
      reg = 0x0c5001;
      reg = 0x0a10d8;

    }
//      }


//      if((OUT_Frq_rcv/10000%3==0)&&(OUT_Frq_rcv/10000%7!=0))
//      {
//            usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n有杂散区3-7间模%d",OUT_Frq_rcv_crac);

//            //计算寄存器
//            if(OUT_Frq_rcv>100000)////输出频率>150000
//            {
//                //倍频计算整数小数
//                set_reg_int=(OUT_Frq_rcv_crac-OUT_Frq_rcv_crac%35000);
//                set_reg_frac=OUT_Frq_rcv_crac%35000;
//                reg_2a_2b_tmp=set_reg_frac*245426.70263;//(2^32/175/100)

//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 倍频reg_2a_2b_tmp:%.2f",reg_2a_2b_tmp);
//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 倍频set_reg_int: %d", set_reg_int);
//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 倍频set_reg_frac:%d",set_reg_frac);

//                //寄存器
//                reg=0X1b0003;//open
//                reg=0X2DD0DF;
//                reg=0X27FFFF;
//                reg=0X240000+(unsigned int)(set_reg_int/35000);
//                reg=0X220000;
//                reg=0X2b0000+(unsigned int)(reg_2a_2b_tmp/2)%65536;
//                reg=0X2a0000+(unsigned int)(reg_2a_2b_tmp/2)/65536;
//                reg=0x250304;// reg=0x250304;
//                reg=0x0c5008;
//                reg=0x0a13d8;

//            }
//            else//不倍频
//            {
//                //不倍频计算整数小数
//                set_reg_int=(OUT_Frq_rcv_crac-OUT_Frq_rcv_crac%17500)/10000;
//                f_tmp_int=(OUT_Frq_rcv_crac-OUT_Frq_rcv_crac%17500);
//                set_reg_frac=OUT_Frq_rcv_crac%17500;
//                reg_2a_2b_tmp=set_reg_frac*245426.70263;//(2^32/175/100)

//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 不倍频reg_2a_2b_tmp:%.2f",reg_2a_2b_tmp);
//                usart_ALL_Printf_En_Dis(UART1_USART,0,"\r\n 不倍频set_reg_int: %d", set_reg_int);
//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 不倍频f_tmp_int: %.2f", f_tmp_int);
//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 不倍频set_reg_frac:%d",set_reg_frac);

//                //寄存器
//                reg=0X1b0002;//close
//                reg=0X2DC8DF;
//                reg=0X27FFFF;
//                reg=0X240000+(unsigned int)(f_tmp_int/15000);
//                reg=0X220000;
//                reg=0X2b0000+(unsigned int)(reg_2a_2b_tmp/1)%65536;
//                reg=0X2a0000+(unsigned int)(reg_2a_2b_tmp/1)/65536;
//                reg=0x250404;
//                reg=0x0c5008;
//                reg=0x0a13d8;
//            }
//      }

//    if((OUT_Frq_rcv/10000/3==0)&&(OUT_Frq_rcv/10000/7==0))
//      if((OUT_Frq_rcv_crac/10000%3==0)&&(OUT_Frq_rcv_crac/10000%7==0)&&(OUT_Frq_rcv_crac/10000%5!=0))
//      {
//            usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n有杂散区3-7-5间模%d",OUT_Frq_rcv_crac);

//            //计算寄存器
//            if(OUT_Frq_rcv>100000)////输出频率>150000
//            {
//                //倍频计算整数小数
//                set_reg_int=(OUT_Frq_rcv_crac-OUT_Frq_rcv_crac%25000);
//                set_reg_frac=OUT_Frq_rcv_crac%25000;
//                reg_2a_2b_tmp=set_reg_frac*343597.38368;//(2^32/175/100)

//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 倍频reg_2a_2b_tmp:%.2f",reg_2a_2b_tmp);
//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 倍频set_reg_int: %d", set_reg_int);
//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 倍频set_reg_frac:%d",set_reg_frac);

//                //寄存器
//                reg=0X1b0003;//open
//                reg=0X2DD0DF;
//                reg=0X27FFFF;
//                reg=0X240000+(unsigned int)(set_reg_int/25000);
//                reg=0X220000;
//                reg=0X2b0000+(unsigned int)(reg_2a_2b_tmp/2)%65536;
//                reg=0X2a0000+(unsigned int)(reg_2a_2b_tmp/2)/65536;
//                reg=0x250304;// reg=0x250304;
//                reg=0x0c5008;
//                reg=0x0a12d8;

//            }
//            else//不倍频
//            {
//                //不倍频计算整数小数
//                set_reg_int=(OUT_Frq_rcv_crac-OUT_Frq_rcv_crac%12500)/10000;
//                f_tmp_int=(OUT_Frq_rcv_crac-OUT_Frq_rcv_crac%12500);
//                set_reg_frac=OUT_Frq_rcv_crac%12500;
//
//                reg_2a_2b_tmp=set_reg_frac*343597.38368;//(2^32/175/100)

//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 不倍频reg_2a_2b_tmp:%.2f",reg_2a_2b_tmp);
//                usart_ALL_Printf_En_Dis(UART1_USART,0,"\r\n 不倍频set_reg_int: %d", set_reg_int);
//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 不倍频f_tmp_int: %.2f", f_tmp_int);
//                usart_ALL_Printf_En_Dis(UART1_USART,1,"\r\n 不倍频set_reg_frac:%d",set_reg_frac);

//                //寄存器
//                reg=0X1b0002;//close
//                reg=0X2DC8DF;
//                reg=0X27ffff;
//                reg=0X240000+(unsigned int)(f_tmp_int/12500);
//                reg=0X220000;
//                reg=0X2b0000+(unsigned int)(reg_2a_2b_tmp/1)%65536;
//                reg=0X2a0000+(unsigned int)(reg_2a_2b_tmp/1)/65536;
//                reg=0x250404;
//                reg=0x0c5008;
//                reg=0x0a12d8;
//            }
//      }
}


//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...接受频率字*10KHZ:%d", IN_Frq_rcv);
usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...接受频率字*10KHZ:%d", OUT_Frq_rcv);
usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...reg:0X%X", reg);
usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...reg:0X%X", reg);
usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...reg:0X%X", reg);
usart_ALL_Printf_En_Dis(UART1_USART, 0, "\r\n ...reg:0X%X", reg);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

return 0;
}

東南博士 发表于 2020-2-26 09:42

#ifndef __BSP_LM2592_H
#define __BSP_LM2592_H

#include "stm32f4xx.h"
//LM2594_1
//LD
#define      LM2594_1_LD_CLK                           RCC_AHB1Periph_GPIOC
#define      LM2594_1_LD_PORT                     GPIOC
#define      LM2594_1_LD_PIN                    GPIO_Pin_2
#define               LM2594_1_LD_Read                    GPIO_ReadInputDataBit(LM2594_1_LD_PORT,LM2594_1_LD_PIN)
//CE
#define      LM2594_1_CE_CLK                           RCC_AHB1Periph_GPIOC
#define      LM2594_1_CE_PORT               GPIOC
#define      LM2594_1_CE_PIN                GPIO_Pin_0
#define               LM2594_1_CE_Hi                                   GPIO_SetBits(LM2594_1_CE_PORT,LM2594_1_CE_PIN);
#define               LM2594_1_CE_Lo                            GPIO_ResetBits(LM2594_1_CE_PORT,LM2594_1_CE_PIN);
//SDK
#define      LM2594_1_SCK_CLK                           RCC_AHB1Periph_GPIOC
#define      LM2594_1_SCK_PORT            GPIOC
#define      LM2594_1_SCK_PIN               GPIO_Pin_13
#define               LM2594_1_SCK_Hi                    GPIO_SetBits(LM2594_1_SCK_PORT,LM2594_1_SCK_PIN);
#define               LM2594_1_SCK_Lo                    GPIO_ResetBits(LM2594_1_SCK_PORT,LM2594_1_SCK_PIN);
//SDI
#define      LM2594_1_SDI_CLK                           RCC_AHB1Periph_GPIOC
#define      LM2594_1_SDI_PORT            GPIOC
#define      LM2594_1_SDI_PIN               GPIO_Pin_1
#define               LM2594_1_SDI_Hi                    GPIO_SetBits(LM2594_1_SDI_PORT,LM2594_1_SDI_PIN);
#define               LM2594_1_SDI_Lo                    GPIO_ResetBits(LM2594_1_SDI_PORT,LM2594_1_SDI_PIN);

//LM2595_1
//LD
#define      LM2595_1_LD_CLK                           RCC_AHB1Periph_GPIOA
#define      LM2595_1_LD_PORT                     GPIOA
#define      LM2595_1_LD_PIN                    GPIO_Pin_4
#define               LM2595_1_LD_Read                    GPIO_ReadInputDataBit(LM2595_1_LD_PORT,LM2595_1_LD_PIN)
//CE
#define      LM2595_1_CE_CLK                           RCC_AHB1Periph_GPIOA
#define      LM2595_1_CE_PORT               GPIOA
#define      LM2595_1_CE_PIN                GPIO_Pin_2
#define               LM2595_1_CE_Hi                                   GPIO_SetBits(LM2595_1_CE_PORT,LM2595_1_CE_PIN);
#define               LM2595_1_CE_Lo                            GPIO_ResetBits(LM2595_1_CE_PORT,LM2595_1_CE_PIN);
//SDK
#define      LM2595_1_SCK_CLK                           RCC_AHB1Periph_GPIOA
#define      LM2595_1_SCK_PORT            GPIOA
#define      LM2595_1_SCK_PIN               GPIO_Pin_1
#define               LM2595_1_SCK_Hi                    GPIO_SetBits(LM2595_1_SCK_PORT,LM2595_1_SCK_PIN);
#define               LM2595_1_SCK_Lo                    GPIO_ResetBits(LM2595_1_SCK_PORT,LM2595_1_SCK_PIN);
//SDI
#define      LM2595_1_SDI_CLK                           RCC_AHB1Periph_GPIOA
#define      LM2595_1_SDI_PORT            GPIOA
#define      LM2595_1_SDI_PIN               GPIO_Pin_3
#define               LM2595_1_SDI_Hi                    GPIO_SetBits(LM2595_1_SDI_PORT,LM2595_1_SDI_PIN);
#define               LM2595_1_SDI_Lo                    GPIO_ResetBits(LM2595_1_SDI_PORT,LM2595_1_SDI_PIN);

//失锁重置
extern unsigned long LMX25941_lose_ld_cnt;
extern unsigned long LMX25951_lose_ld_cnt;
extern unsigned int LM2594_Reg_Set[];
extern unsigned int LM2595_Reg_Set[];

extern unsigned int LM2594_Reg[];
extern unsigned int LM2595_Reg[];

extern unsigned int IN_FRQ;
extern unsigned int OUT_FRQ;

extern void LM2594_GPIO_all_Init(void);
extern void LM2595_GPIO_all_Init(void);

extern int LM2594_ALL_init(void);
extern int LM2595_ALL_init(void);

extern void LMX2594_W_3_bytes_Add(unsigned char Add,unsigned int Reg);
extern void LMX2594_W_3_bytes(unsigned int Reg);
extern void LMX2594_W_All_dat(unsigned int Reg[]);

extern void LMX2595_W_3_bytes_Add(unsigned char Add,unsigned int Reg);
extern void LMX2595_W_3_bytes(unsigned int Reg);
extern void LMX2595_W_All_dat(unsigned int Reg[]);

int In_frq_lmx2594_set(unsigned char IN_Frq_H,unsigned char IN_Frq_M,unsigned char IN_Frq_L,unsigned char OUT_Frq_H,unsigned char OUT_Frq_M,unsigned char OUT_Frq_L,unsigned int reg[]);
int In_frq_lmx2595_set(unsigned char IN_Frq_H,unsigned char IN_Frq_M,unsigned char IN_Frq_L,unsigned char OUT_Frq_H,unsigned char OUT_Frq_M,unsigned char OUT_Frq_L,unsigned int reg[]);

#endif


東南博士 发表于 2020-2-26 09:43

LMX2594的源码和头文件

東南博士 发表于 2020-2-26 10:58

LM624衰减器源码与资料

東南博士 发表于 2020-2-26 10:58

如果大家有关于信号链的疑问,我们可以一起探讨。本人一直从事雷达、射频、软件无线电之类的行业。并且在这个行业深耕多年,

wangjiahao88 发表于 2020-2-26 12:45

LMX2594时序倒是简单不复杂。和TI的其他的SPI模式基本上一样。难度比较大的就是频点的计算。。。
射频方面的知识才是难度的挑战。

LHQGYL12 发表于 2020-4-19 11:28

你好,我最近在用LMX2594在做一个项目。要求调频时间≤30us,但是我打开快速校准模式后实际测试跳频最多也就80us左右,这个是什么原因呢?我的参考100MHz,鉴相频率为100MHz,环路带宽为280Khz。

wudixiaocaoge 发表于 2020-4-28 08:27

你好!
页: [1] 2
查看完整版本: LMX2594的使用案例