纹哥--

【分享帖】ADF4350的调试(转)

纹哥-- 在 2014-6-11 建立的討論區
最後回覆由ADIForum於2014-6-13提供

下面的寄存器设置实现:在外部晶振10MHz的条件下,主端口输出1.4G射频信号。

R5: 0x00400005;
R4: 0x00950024;
R3: 0x000084B3;
R2: 0x140056C2;
R1: 0x08008191;
R0: 0x008C0000;

 

针对在调试时出现的情况对其中的几位说明一下:

 

(1)R5中的LD PIN MOD(DB23、DB22)
论坛里说这个关键不要接发光二极管,因为它只是一个逻辑高电平,不一定能驱动二极管发光。实际电路中我还是接了贴片发光二极管,完全可以发光。另外,这个管脚可以设置为输出高低电平,因此可以在程序中通过将其置高置低,通过观察二极管是否发光来判断寄存器写入有没有执行。

 

(2)R2中的MUXOUT(DB28、DB27、DB26)
一开始的时候我将这一位设置为N分频输出,然后ADF4350有输出,但是是1.07G左右而不是1.4G,从改管脚测量的N分频输出为7.6MHz左右。锁定指示灯不亮,我一直以为是环路滤波器的问题,换过几个电阻电容后发现结果没有变化,修改了很多寄存器值都没办法锁定。最后才想到MUXOUT,将其改为ANALOG LOCK DETECT后,输出就奇迹般的好了。在论坛里查了一下,也有人有相同的问题,MS这是ADF4350芯片自身的一个BUG。另外我想,这个管脚可以接回单片机,在其信号由高到底(即4350失锁)时,激活单片机从新对4350写寄存器,相当于重启。

 

(3)R2中的CHARGE PUMP CURRENT SETTING(DB12、DB11、DB10、DB9)
这个没有在网上翻到怎么设置,根据我自己的实验测试来看,Icp选择2mA与4mA之间的值都是可以的,其他值没有测试。

 

另外两点关于ADF4350电路的经验:
(1)外部的环路滤波器。根据软件计算出来的电阻电容值和实际市场上可以买到的有出入,不过不会影响锁相环正常锁定,对于最后信号的相位噪声影响有多大还没有测试。下面是采用快速锁定方式,鉴相频率为10MHz时的环路滤波器计算值与实际使用值:
201d7c344cebfa75241f1444.bmp
元件       计算值      实际值
C1         1.82nF      2.2nF
C2         24.8nF      47nF
C3         831pF       2.2nF
R1          450           510
R1a        1.35k         1.5K
R2          3.67K         3.7K

 

(2)ADF4350差分输出。
ADF4350的输出是一对差分信号,如果你只需要一路输出的话,另一路信号必须接50的匹配负载。同样,如果你想用示波器或频谱仪测试一下ADF4350的输出,不要忘了示波器自身也是50的负载。我犯得错误就是,在一对差分信号的输出端都接了50的匹配负载时,直接用示波器探头去测量一路输出,测到的信号功率只有-30dBmW,显然不对,而且这样有可能烧坏片子。

 

AD的官网上有读写ADF4350寄存器的C语言示例程序,下面这个是稍微修改后的,单片机采用ATMEGA16,中间加了一端与电脑串口通信的程序,用来检验程序是否正常执行。
#include <avr/io.h>
#include <avr/interrupt.h>

#define SET_LE()   PORTB = (PORTB | 0x40) //PB6->LE
#define CLR_LE()   PORTB = (PORTB & 0xBF)

#define SET_SCL()   PORTB = (PORTB | 0x20) //PB5->SCL
#define CLR_SCL()   PORTB = (PORTB & 0xDF)

#define SET_DATA()   PORTB = (PORTB | 0x10) //PB4->DATA
#define CLR_DATA()   PORTB = (PORTB & 0xEF)

#define SET_DATA_OUT() DDRB=0XFF;
#define SET_DATA_IN() DDRB=0X00;

unsigned char buf[4] = {0,0,0,0};

void delay (int length)
{
while (length >0)
    length--;
}

//Function that writes to the ADF4350 via the SPI port.
//--------------------------------------------------------------------------------
void WriteToADF4350(unsigned char count, unsigned char *buf)
{
unsigned char ValueToWrite = 0;
    unsigned char i = 0;
unsigned char j = 0;

 

SET_DATA_OUT();
delay(1);
CLR_SCL();
CLR_LE();
delay(1);

for(i=count;i>0;i--)
   {
ValueToWrite = *(buf + i - 1);
   for(j=0; j<8; j++)
   {
    if(0x80 == (ValueToWrite & 0x80))
    {
     SET_DATA();   //Send one to SDO pin
    }
    else
    {
     CLR_DATA();   //Send zero to SDO pin
    }
    delay(1);
    SET_SCL();
    delay(1);
    ValueToWrite <<= 1; //Rotate data
    CLR_SCL();
   }
}
CLR_DATA();
delay(1);
SET_LE();
delay(1);
CLR_LE();
}
/*****************串口初始化*********************************/

void usart_init(void)
{
    UCSRB = 0x00;     //disable while setting baud rate
    UCSRA = 0x00;     //Bit1为1则倍速发送
    UCSRC = 0x86;     //8位字符,1位停止位,无校验
    UBRRL = 0x19;     //波特率:9600 Bps
    UBRRH = 0x00;     //误差率:0.2%
    UCSRB = 0xD8;
}


/******************端口初始化*******************************/

void port_init(void)
{
   PORTA = 0xFF;
   DDRA = 0x00;
PORTB = 0xFF;
   DDRB = 0xFF;
   PORTC = 0xFF;
   DDRC = 0x00;

PORTD = 0xFF;   //设置RXD0和TXD0
DDRD = 0x02;
}


/******************初始器件**************************************/

void init_devices(void)
{
   port_init();
   usart_init();
}


/****************中断接收服务处理子程序*******************************/

ISR(USART_RXC_vect)
{
    unsigned char data_temp;
unsigned char data=':';
    //UCSRB=0x00;               //禁止发送和接收
    data_temp = UDR;          //从数据缓冲器中接收数据
   UCSRB=0xD8 ;              //允许发送和接收,接收和发送结束中断使能
   if(data_temp=='0')        //如果接收到的字符为'0'
   UDR = data;           //将数据data放入缓冲器,发送数据
   else
    UDR=data_temp;        //否则将接收到的数据返回

 

}

/*********************中断发送服务处理子程序**************************/

ISR(USART_TXC_vect)
{
   UCSRA |= (1<<6);                //发送结束清零
}


void main (void)
{
    cli();                      //总中断禁止
init_devices();


buf[3] = 0x00;
buf[2] = 0x40;
buf[1] = 0x00;     //write communication register 0x00400005 to control the progress
   buf[0] = 0x05;     //to write Register 5 to set digitock al ldetector
WriteToADF4350(4,buf); 

buf[3] = 0x00;
buf[2] = 0x95;     //(DB23=1)The signal is taken from the VCO directly;(DB22-20:4H)the RF divider is 16;(DB19-12:50H)R is 80
buf[1] = 0x00;     //(DB11=0)VCO powerd up;
   buf[0] = 0x24;     //(DB5=1)RF output is enabled;(DB4-3=3H)Output power level is 5
WriteToADF4350(4,buf); 

buf[3] = 0x00;
buf[2] = 0x00;
buf[1] = 0x84;     //(DB14-3:96H)clock divider value is 150.非快速锁定设为0x04;
   buf[0] = 0xB3;
WriteToADF4350(4,buf);

buf[3] = 0x14;
buf[2] = 0x00;     //(DB6=1)set PD polarity is positive;(DB7=1)LDP is 6nS;
buf[1] = 0x56;     //(DB8=0)enable fractional-N digital lock detect;
   buf[0] = 0xC2;     //(DB12-9:7H)set Icp 2.50 mA;
WriteToADF4350(4,buf);   //(DB23-14:1H)R counter is 1

buf[3] = 0x08;
buf[2] = 0x00;
buf[1] = 0x81;       //(DB14-3:6H)MOD counter is 6;
   buf[0] = 0x91;       //(DB26-15:6H)PHASE word is 1,neither the phase resync
WriteToADF4350(4,buf);     //nor the spurious optimization functions are being used
           //(DB27=1)prescaler value is 8/9

buf[3] = 0x00;
buf[2] = 0x8C;
buf[1] = 0x00;
   buf[0] = 0x00;     //(DB14-3:0H)FRAC value is 0;
WriteToADF4350(4,buf);   //(DB30-15:140H)INT value is 280;

sei();                      //总中断允许
while(1)
    {;}

}

結果