本博客(RF Engineer)不再更新,将全面扎根新博客(射频那些事儿)
某发射机项目中需要一个频率范围为1.75GHz-1.81GHZ,频率步进为200KHz的扫频源。我选择了ADI的ADF4360系列锁相环芯片,该系列芯片内部集成了VCO,封装小巧(4mm*4mm),价格公道(官方批量价格3.06美元,我在人民币升值之前找本地公司买了10片,每片46人民币。注:我说的价格公道是指官方价格,不是指我买的价格;)),文档丰富,即便是对锁相环一窍不通的人,仔细看看文档也能设计出频率源。ADF4360-3满足我们的频率需求,其输出频率范围为1.6GHz-1.95GHz。系统的控制我用单片机,这是第一次用单片机,听说TI的MSP430系列不错,查了查资料,决定选用MSP430F169作为我们发射机项目的控制核心。
本文仅介绍如何用MSP430F169控制ADF4360-3。
========
硬件连接
========
MSP430F169与ADF4360-3之间的连接只需要3根线,我的是P5.1->DATA,P5.3->CLK,P5.4->LE,如图1所示。
图1 MSP430F169与ADF4360-3硬件连接图
========
软件程序
========
"The ADF4360 family has a simple SPI-compatible serial inter-face for writing to the device. "
ADF4360-3用与SPI兼容的方式进行通信,不过我用MSP430的SPI与ADF4360-3通信没有成功,时间紧迫,为了1天之内搞出来(因为第二天就要用),于是当天晚上我用单片机的普通IO口模拟SPI的工作方式来和ADF4360-3进行通信,获得了成功。
---------------------------------------------------------------------
#include <msp430x16x.h>
float fOUT = 1750;
int fREF = 10;
int fPFD = 200;
int R="50";
int NCounter="0";
int PCounter="8";
int BCounter="0";
int ACounter="0";
int N2=0;
int N1=0;
int N0=0;
int bindata[8]={0,0,0,0,0,0,0,0};
void InitSystemClock(void)
{
unsigned char i;
BCSCTL1 = RSEL0 + RSEL1 + RSEL2;
BCSCTL2=SELM_2+SELS;
do
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i > 0; i--);
}
while ((IFG1 & OFIFG) != 0);
}
void PortInit(void)
{
P1SEL=0X00;
P1DIR=0XFF;
P2SEL=0X00;
P2DIR=0XFF;
P3SEL=0X00;
P3DIR=0XFF;
P4SEL=0X00;
P4DIR=0XFF;
P5SEL=0X00;
P5DIR=0XFF;
P6SEL=0X00;
P6DIR=0XFF;
P1OUT=0X00;
P2OUT=0X00;
P3OUT=0X00;
P4OUT=0X00;
P5OUT=0X00;
P6OUT=0X00;
}
void delay(int count)
{
while(count!=0) count--;
}
void MO2(int dbin)
{
if(dbin==1)
{
P5OUT |= BIT1;
}
if(dbin==0)
{
P5OUT &= ~BIT1;
}
P5OUT |= BIT3;
P5OUT &= ~BIT3;
}
void bin(int n)
{
int i="0";
for(i=0;i<8;i++)
{
bindata=n%2;
n="n/2";
}
}
void data_out(int decidata)
{
int i="7";
bin(decidata);
for(i=7;i>=0;i--)
{
MO2(bindata);
}
}
void set_R(int fref,int fpfd) // fref为晶振频率(单位为MHz),fpfd为鉴相频率(单位为Khz)
{
int R2 = 0;
int R1 = 0;
int R0 = 0;
fREF = fref;
fPFD = fpfd;
R = fREF*1000/fPFD;
R2 = 0;
R1 = (R-R&0x003F)/64;
R0 = (R&0x003F)*4+1;
P5OUT &= ~BIT4;
data_out(R2);
data_out(R1);
data_out(R0);
P5OUT |= BIT4;
}
void set_Control(int P)
{
PCounter = P;
P5OUT &= ~BIT4;
if(P == 8)
{
MO2(0);MO2(0);
}
if(P == 16)
{
MO2(0);MO2(1);
}
if(P == 32)
{
MO2(1);MO2(0);
}
MO2(0);MO2(0);MO2(1);MO2(1);MO2(1);MO2(1);
MO2(1);MO2(1); MO2(1);MO2(1);MO2(1);MO2(0);MO2(0);MO2(1);
MO2(0);MO2(0); MO2(1);MO2(0);MO2(1);MO2(0);MO2(0);MO2(0);
P5OUT |= BIT4;
}
void set_N(float fOUT) // fOUT为锁相环频综输出频率(单位为MHz)
{
NCounter = fOUT*(1000/fPFD);
BCounter = NCounter/PCounter;
ACounter = NCounter-BCounter*PCounter;
N1 = BCounter&0x00FF;
N2 = (BCounter-N1)/256;
N0 = ACounter*4+2;
P5OUT &= ~BIT4;
delay(0x18FF);
data_out(N2);
data_out(N1);
data_out(N0);
P5OUT |= BIT4;
}
void main( void )
{
WDTCTL="WDTPW"+WDTHOLD;
InitSystemClock();
PortInit();
set_R(10,200); // 晶振频率10MHz,鉴相频率200KHz
set_Control(8); // 此项默认为8
set_N(1780); // 频综输出频率1780MHz
}
---------------------------------------------------------------------
ADF4360其他系列芯片的控制方法是一样的,可以类推。
『 原创文章如转载,请注明:转载自http://blog.ednchina.com/rfengineer/ 』
用户1748934 2014-4-29 12:24
用户389572 2008-12-21 13:29