DDS(AD9851)驱动程序
作者:未知 来源:绿盟整理 发布时间:2014-1-14 9:47:07
作者:未知 来源:绿盟整理 发布时间:2014-1-14 9:47:07
AD9851是ADI公司采用先进的DDS技术推出的高集成度DDS频率合成器,它内部包括可编程DDS系统、高性能DAC及高速比较器,能实现全数字编程控制的频率合成和时钟发生。AD9851接口功能控制简单,可以用8位并行口或串行口直接输入频率、相位等控制数据。32位频率控制字,在180MHz时钟下,输出频率分辨率达0.0372Hz。先进的CMOS工艺使AD9851不仅性能指标一流,而且功耗低,在3.3V供电时,功耗仅为155mW。
各引脚介绍:
D0~D7: 8位数据输入口,可给内部寄存器装入40位控制数据。
PGND:6倍参考时钟倍频器的地。
PVCC:6倍参考时钟倍频器电源。
W—CLK:字装入信号,上升沿有效。
FQ—UD:频率更新控制信号,时钟上升沿确认输入数据有效。
REFCLOCK:外部参考时钟输入。
AGND:模拟地。
AVDD:模拟电源(+5V)。
DGND:数字地。
DVDD:数字电源(+5V)。
Rset:通过串联一个电阻到地,设置DAC输出满额时的电流。
VOUTN:内部比较器负向输出端。
VOUTP:内部比较器正向输出端。
VINN:内部比较器负向输入端。
VINP:内部比较器正向输入端。
DACBP:DAC旁路连接端。
IOUTB:”互补“DAC输出。
IOUT:内部DAC输出端。
RESET:复位端。
#include "msp430x22x4.h"
#define SERIAL_SDI P4OUT|=BIT0 //数据位D7
#define C_SERIAL_SDI P4OUT&=~BIT0
#define CS P4OUT|=BIT1 //AD8400控制信号
#define C_CS P4OUT&=~BIT1
#define CLK P4OUT|=BIT2 //写控制字时钟CLK
#define C_CLK P4OUT&=~BIT2
//#include "msp430x22x4.h"
#define FQ_UP P1OUT|=BIT1 //AD9851信号更新位FQ_UP
#define C_FQ_UP P1OUT&=~BIT1
#define W_CLK P1OUT|=BIT2 //写控制字时钟WCLK
#define C_W_CLK P1OUT&=~BIT2
#define SERIAL_DAT P1OUT|=BIT3 //数据位D7
#define C_SERIAL_DAT P1OUT&=~BIT3
#define reset P3OUT|=BIT1
#define c_reset P3OUT&=~BIT1
#define INT_U unsigned long int
void delay(unsigned int ms);// 延时子程序
void SetFreq(INT_U Frequency,INT_U Phase);//设置输出频率
void Reset9851SM(); //初始化设置为串行输入方式
void SetRES(int RES);//设置输出阻抗
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
//P1DIR |= 0x02;
P4DIR |= 0x07;
P1DIR |= 0x1e;
P3DIR |= 0x02;
reset;
delay(0);
c_reset;
Reset9851SM();
//while(1)
//{
SetFreq(10000000,0);
SetRES(40);
while(1);
}
static void write_RES(int RES)//写控制字
{
int i;
C_CLK;
C_CS;
CLK;
for(i=0; i<10; i++)
{
if (RES&0x80)//从高位开始串行输入
{
SERIAL_SDI;
}
else
{
C_SERIAL_SDI;
}
C_CLK;
CLK;
RES <<= 1;
}
C_CLK;
CS;
CLK;
}
void SetRES(int RES)//设置输出电阻
{
RES=RES*2.55;
write_RES(RES);
}
void delay(unsigned int ms)// 延时子程序
{
unsigned int i;
while(ms--)
for(i = 0; i< 2000; i++);
}
void Reset9851SM() //初始化设置为串行输入方式
{
C_W_CLK;
C_FQ_UP;
W_CLK;
delay(2);
C_W_CLK;
FQ_UP;
delay(2);
C_FQ_UP;
}
static void write_dds(INT_U Frequency,INT_U Phase)//写频率控制字
{
//INT_U temp=0x80;
INT_U i;
C_FQ_UP;
C_W_CLK;
for(i=0; i<33; i++)
{
C_W_CLK;
if( (Frequency&0x00000001) || (i==32) ) //6倍倍乘器启动
{
SERIAL_DAT;
}
else
{
C_SERIAL_DAT;
}
delay(2);// 延时子程序
W_CLK;
delay(5);// 延时子程序
Frequency >>= 1;
}
// for(i=0;i<2;i++)
// {
C_W_CLK;
delay(2);// 延时子程序
C_SERIAL_DAT;
W_CLK;
delay(5);// 延时子程序
C_W_CLK;
delay(2);// 延时子程序
C_SERIAL_DAT;
W_CLK;
delay(5);// 延时子程序
// }
for(i=0;i<5;i++)
{
C_W_CLK;
if( Phase&0x01 ) //设置相位
{
SERIAL_DAT;
}
else
{
C_SERIAL_DAT;
}
delay(2);// 延时子程序
W_CLK;
delay(5);// 延时子程序
Phase >>= 1;
}
FQ_UP;
C_W_CLK;
delay(2);// 延时子程序
C_FQ_UP;
文章来自绿盟(xDowns.com)转载请注明来路。
上一篇文章:VS2008安装失败解决办法 []