[转]ADF4350调试
0赞
下面的寄存器设置实现:在外部晶振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时的环路滤波器计算值与实际使用值:

元件 计算值 实际值
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)
{;}
}
转自:http://apps.hi.baidu.com/share/detail/33497236
