LMX2594的使用案例
LMX2594的使用案例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 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 3、锁相环中高的鉴相频率能使锁相环倍频次数降低,这样通常意味着输出信号带内噪声的降低。在整数模式下LMX2594的鉴相频率最高为400MHz,小数模式下鉴相频率最高为300MHz。相比HMC704,在整数模式下鉴相频率最高为115MHz,在小数模式下(小数B模式)鉴相频率最高为100MHz。
4、在LMX2594内部VCO输出频率反馈支路上没有预分频器,直接进入高速N分频器,因此能显著的降低杂散的大小与数量。对比HMC704,当VCO反馈频率大于4GHz时必须使用/2预分频器使N分频器的输入频率限制在4GHz以下。 5、LMX2594跳频速度=VCO校准时间+环路锁定时间
VCO校准时间:
Noassist 50μs
Partialassist 35μs
Closefrequency 20μs
Fullassist 5μs 以下是微控制器控制LMX2594的代码
话说 TI 的LMX2594 真好用! #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
}; 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;
} 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);
}
}
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);
}
}
//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;
} //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;
}
#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
LMX2594的源码和头文件
LM624衰减器源码与资料
如果大家有关于信号链的疑问,我们可以一起探讨。本人一直从事雷达、射频、软件无线电之类的行业。并且在这个行业深耕多年, LMX2594时序倒是简单不复杂。和TI的其他的SPI模式基本上一样。难度比较大的就是频点的计算。。。
射频方面的知识才是难度的挑战。 你好,我最近在用LMX2594在做一个项目。要求调频时间≤30us,但是我打开快速校准模式后实际测试跳频最多也就80us左右,这个是什么原因呢?我的参考100MHz,鉴相频率为100MHz,环路带宽为280Khz。 你好!
页:
[1]
2