AD9854 驱动程序设计_第1页
AD9854 驱动程序设计_第2页
AD9854 驱动程序设计_第3页
AD9854 驱动程序设计_第4页
AD9854 驱动程序设计_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/=/ AD9854 驱动程序设计/硬件连接: P0 Data; / P2 Adr; / RESET P37; / UDCLK P36; / WR P3.5; / RD p3.4; / FDATA P33; / OSK P32; / VDD-逻辑电源(3.3V)/ VSS-GND(0V) /AD9854.c/writer:谷雨 2008年8月22日24日于EDA实验室/说明:本程序基于硬件的外接晶振为20MHZ/=#include <STC89C51RC.h> /STC单片机头文件#include <intrins.h> #define uint unsigned in

2、t#define uchar unsigned char#define ulong unsigned longuchar FreqWord6; /6个字节频率控制字/*以下为系统时钟以及其相关变量设置*/* 此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个 CLK_Set为时钟倍频设置,可设置420倍倍频,但最大不能超过300MHZ Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型*/*#define CLK_Set 4const ulong Freq_mult_ulong = 3518437;co

3、nst double Freq_mult_doulle = 3518437.2088832;*/*#define CLK_Set 5const ulong Freq_mult_ulong = 2814750;const double Freq_mult_doulle = 2814749.76710656;*/#define CLK_Set 6const ulong Freq_mult_ulong = 2345625;const double Freq_mult_doulle = 2345624.80592213;/*#define CLK_Set 7const ulong Freq_mult_

4、ulong = 2010536;const double Freq_mult_doulle = 2010535.54793326;*/*#define CLK_Set 8const ulong Freq_mult_ulong = 1759219;const double Freq_mult_doulle = 1759218.6044416;*/*#define CLK_Set 9const ulong Freq_mult_ulong = 1563750;const double Freq_mult_doulle = 1563749.87061476;*/*#define CLK_Set 10c

5、onst ulong Freq_mult_ulong = 1407375;const double Freq_mult_doulle = 1407374.88355328;*/*#define CLK_Set 11const ulong Freq_mult_ulong = 1279432;const double Freq_mult_doulle = 1279431.712321164;*/*#define CLK_Set 12const ulong Freq_mult_ulong = 1172812;const double Freq_mult_doulle = 1172812.402961

6、067;*/*#define CLK_Set 13const ulong Freq_mult_ulong = 1082596;const double Freq_mult_doulle = 1082596.064271754;*/*#define CLK_Set 14const ulong Freq_mult_ulong = 1005268;const double Freq_mult_doulle = 1005267.773966629;*/*#define CLK_Set 15const ulong Freq_mult_ulong = 938250;const double Freq_mu

7、lt_doulle = 938249.9223688533;*/*修改硬件时要修改的部分*#define AD9854_DataBus P0#define AD9854_AdrBus P2sbit AD9854_RST = P37; /AD9854复位端口sbit AD9854_UDCLK = P36; /AD9854更新时钟sbit AD9854_WR = P35; /AD9854写使能,低有效sbit AD9854_RD = P34; /AD9854读使能,低有效sbit AD9854_FDATA = P33; /AD9854 FSK,PSK控制sbit AD9854_OSK = P32;

8、 /AD9854 OSK控制端/*以下部分为函数定义*static void AD9854_WR_Byte(uchar addr,uchar dat); extern void AD9854_Init(void); static void Freq_convert(long Freq); extern void AD9854_SetSine(ulong Freq,uint Shape); static void Freq_double_convert(double Freq); extern void AD9854_SetSine_double(double Freq,uint Shape);

9、extern void AD9854_InitFSK(void);extern void AD9854_SetFSK(ulong Freq1,ulong Freq2); extern void AD9854_InitBPSK(void); extern void AD9854_SetBPSK(uint Phase1,uint Phase2);extern void AD9854_InitOSK(void); extern void AD9854_SetOSK(uchar RateShape); extern void AD9854_InitAM(void); extern void AD985

10、4_SetAM(uint Shape);extern void AD9854_InitRFSK(void); extern void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate);static void delay (uint us);/=/函数名称:void AD9854_WR_Byte(uchar addr,uchar dat)/函数功能:AD9854并行口写入数据/入口参数:addr 6位地址/ dat 写入的数据/出口参数:无/=void AD9854_WR_Byte(uc

11、har addr,uchar dat)AD9854_AdrBus = (addr&0x3f) | (P2&0xc0);AD9854_DataBus = dat;AD9854_WR = 0;AD9854_WR = 1;/=/函数名称:void AD9854_Init(void)/函数功能:AD9854初始化/入口参数:无/出口参数:无/=void AD9854_Init(void)AD9854_WR=1;/将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; /复位AD9854 AD9854_RST=0;AD9854_WR

12、_Byte(0x1d,0x10); /关闭比较器AD9854_WR_Byte(0x1e,CLK_Set); /设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x00); /设置系统为模式0,由外部更新AD9854_WR_Byte(0x20,0x60); /设置为可调节幅度,取消插值补偿AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void Freq_convert(long Freq)/函数功能:正弦信号频率数据转换/入口参数:Freq 需要转换的频率,取值从0SYSCLK/2/出口参数:无 但是影响全局变量FreqWord6

13、的值/说明: 该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK/ 得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK/ 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord6/=void Freq_convert(long Freq) ulong FreqBuf; ulong Temp=Freq_mult_ulong; uchar Array_Freq4; /将输入频率因子分为四个字节Array_Freq0=(uchar)Freq;

14、Array_Freq1=(uchar)(Freq>>8);Array_Freq2=(uchar)(Freq>>16);Array_Freq3=(uchar)(Freq>>24);FreqBuf=Temp*Array_Freq0; FreqWord0=FreqBuf; FreqBuf>>=8; FreqBuf+=(Temp*Array_Freq1); FreqWord1=FreqBuf; FreqBuf>>=8; FreqBuf+=(Temp*Array_Freq2); FreqWord2=FreqBuf; FreqBuf>>

15、;=8;FreqBuf+=(Temp*Array_Freq3); FreqWord3=FreqBuf; FreqBuf>>=8; FreqWord4=FreqBuf; FreqWord5=FreqBuf>>8; /=/函数名称:void AD9854_SetSine(ulong Freq,uint Shape)/函数功能:AD9854正弦波产生程序/入口参数:Freq 频率设置,取值范围为0(1/2)*SYSCLK/ Shape 幅度设置. 为12 Bit,取值范围为(04095) ,取值越大,幅度越大 /出口参数:无/=void AD9854_SetSine(ulon

16、g Freq,uint Shape)uchar count;uchar Adress;Adress = 0x04; /选择频率控制字地址的初值Freq_convert(Freq); /频率转换for(count=6;count>0;) /写入6字节的频率控制字 AD9854_WR_Byte(Adress+,FreqWord-count); AD9854_WR_Byte(0x21,Shape>>8); /设置I通道幅度AD9854_WR_Byte(0x22,(uchar)(Shape&0xff);AD9854_WR_Byte(0x23,Shape>>8);

17、/设置Q通道幅度AD9854_WR_Byte(0x24,(uchar)(Shape&0xff);AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void Freq_doublt_convert(double Freq)/函数功能:正弦信号频率数据转换/入口参数:Freq 需要转换的频率,取值从0SYSCLK/2/出口参数:无 但是影响全局变量FreqWord6的值/说明: 有公式FTW = (Desired Output Frequency × 2N)/SYSCLK得到该函数,/ 其中N=48,Desired Output

18、 Frequency 为所需要的频率,即Freq,SYSCLK/ 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord6/注意: 该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确/ 谷雨建议在100HZ以下用本函数,在高于100HZ的情况下用函数void Freq_convert(long Freq)/=void Freq_double_convert(double Freq) ulong Low32;uint High16; double Temp=Freq_mult_doulle; /23ca99为2的48次方除以120MFreq*=(doub

19、le)(Temp);/1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295High16 = (int)(Freq/4294967295); /232 = 4294967295Freq -= (double)High16*4294967295;Low32 = (ulong)Freq; FreqWord0=Low32; FreqWord1=Low32>>8; FreqWord2=Low32>>16; FreqWord3=Low32>>24; FreqWord4=High16; FreqWord5=High1

20、6>>8; /=/函数名称:void AD9854_SetSine_double(double Freq,uint Shape)/函数功能:AD9854正弦波产生程序/入口参数:Freq 频率设置,取值范围为01/2*SYSCLK/ Shape 幅度设置. 为12 Bit,取值范围为(04095) /出口参数:无/=void AD9854_SetSine_double(double Freq,uint Shape)uchar count=0;uchar Adress;Adress=0x04; /选择频率控制字1地址的初值Freq_double_convert(Freq); /频率转

21、换 for(count=6;count>0;) /写入6字节的频率控制字 AD9854_WR_Byte(Adress+,FreqWord-count); AD9854_WR_Byte(0x21,Shape>>8); /设置I通道幅度AD9854_WR_Byte(0x22,(uchar)(Shape&0xff);AD9854_WR_Byte(0x23,Shape>>8); /设置Q通道幅度AD9854_WR_Byte(0x24,(uchar)(Shape&0xff);AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0

22、;/=/函数名称:void AD9854_InitFSK(void)/函数功能:AD9854的FSK初始化/入口参数:无/出口参数:无/=void AD9854_InitFSK(void)AD9854_WR=1; /将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; /复位AD9854 AD9854_RST=0;AD9854_WR_Byte(0x1d,0x10); /关闭比较器AD9854_WR_Byte(0x1e,CLK_Set); /设置系统时钟倍频AD9854_WR_Byte(0x1f,0x02); /设置系统为模式1,由外部更

23、新AD9854_WR_Byte(0x20,0x60); /设置为可调节幅度,取消插值补偿AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void AD9854_SetFSK(ulong Freq1,ulong Freq2)/函数功能:AD9854的FSK设置/入口参数:Freq1 FSK频率1 / Freq2 FSK频率2/出口参数:无/=void AD9854_SetFSK(ulong Freq1,ulong Freq2) uchar count=6;uchar Adress1,Adress2;const uint Shape=4000;

24、 /幅度设置. 为12 Bit,取值范围为(04095)Adress1=0x04; /选择频率控制字1地址的初值Adress2=0x0a; /选择频率控制字2地址的初值Freq_convert(Freq1); /频率转换1for(count=6;count>0;) /写入6字节的频率控制字 AD9854_WR_Byte(Adress1+,FreqWord-count); Freq_convert(Freq2); /频率转换2for(count=6;count>0;) /写入6字节的频率控制字 AD9854_WR_Byte(Adress2+,FreqWord-count); AD98

25、54_WR_Byte(0x21,Shape>>8); /设置I通道幅度AD9854_WR_Byte(0x22,(uchar)(Shape&0xff);AD9854_WR_Byte(0x23,Shape>>8); /设置Q通道幅度AD9854_WR_Byte(0x24,(uchar)(Shape&0xff);AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void AD9854_InitBPSK(void)/函数功能:AD9854的BPSK初始化/入口参数:无/出口参数:无/=void AD9854_I

26、nitBPSK(void)AD9854_WR=1; /将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; /复位AD9854 AD9854_RST=0;AD9854_WR_Byte(0x1d,0x10); /关闭比较器AD9854_WR_Byte(0x1e,CLK_Set); /设置系统时钟倍频AD9854_WR_Byte(0x1f,0x08); /设置系统为模式4,由外部更新AD9854_WR_Byte(0x20,0x60); /设置为可调节幅度,取消插值补偿AD9854_UDCLK=1; /更新AD9854输出 AD9854_UD

27、CLK=0;/=/函数名称:void AD9854_SetBPSK(uint Phase1,uint Phase2)/函数功能:AD9854的BPSK设置/入口参数:Phase1 调制相位1/ Phase2调制相位2/出口参数:无/说明: 相位为14Bit,取值从016383,谷雨建议在用本函数的时候将Phase1设置为0,/ 将Phase1设置为8192,180°相位/=void AD9854_SetBPSK(uint Phase1,uint Phase2)uchar count;const ulong Freq=60000; const uint Shape=4000;uchar

28、 Adress;Adress=0x04; /选择频率控制字1地址的初值AD9854_WR_Byte(0x00,Phase1>>8); /设置相位1AD9854_WR_Byte(0x01,(uchar)(Phase1&0xff);AD9854_WR_Byte(0x02,Phase2>>8); /设置相位2AD9854_WR_Byte(0x03,(uchar)(Phase2&0xff);Freq_convert(Freq); /频率转换for(count=6;count>0;) /写入6字节的频率控制字 AD9854_WR_Byte(Adress+,F

29、reqWord-count); AD9854_WR_Byte(0x21,Shape>>8); /设置I通道幅度AD9854_WR_Byte(0x22,(uchar)(Shape&0xff);AD9854_WR_Byte(0x23,Shape>>8); /设置Q通道幅度AD9854_WR_Byte(0x24,(uchar)(Shape&0xff);AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void AD9854_InitOSK(void)/函数功能:AD9854的OSK初始化/入口参数:无/出口参

30、数:无/=void AD9854_InitOSK(void)AD9854_WR=1; /将读、写控制端口设为无效AD9854_RD=1;AD9854_UDCLK=0;AD9854_RST=1; /复位AD9854AD9854_RST=0; AD9854_WR_Byte(0x1d,0x10); /关闭比较器AD9854_WR_Byte(0x1e,CLK_Set); /设置系统时钟倍频AD9854_WR_Byte(0x1f,0x00); /设置系统为模式0,由外部更新AD9854_WR_Byte(0x20,0x70); /设置为可调节幅度,取消插值补偿,通断整形内部控制AD9854_UDCLK=1

31、; /更新AD9854输出AD9854_UDCLK=0;/=/函数名称:void AD9854_SetOSK(uchar RateShape)/函数功能:AD9854的OSK设置/入口参数: RateShape OSK斜率,取值为4255,小于4则无效/出口参数:无/=void AD9854_SetOSK(uchar RateShape)uchar count;const ulong Freq=60000; /设置载频 const uint Shape=4000;/幅度设置. 为12 Bit,取值范围为(04095)uchar Adress;Adress=0x04; /选择频率控制字地址的初值

32、Freq_convert(Freq); /频率转换for(count=6;count>0;) /写入6字节的频率控制字 AD9854_WR_Byte(Adress+,FreqWord-count); AD9854_WR_Byte(0x21,Shape>>8); /设置I通道幅度AD9854_WR_Byte(0x22,(uchar)(Shape&0xff);AD9854_WR_Byte(0x23,Shape>>8); /设置Q通道幅度AD9854_WR_Byte(0x24,(uchar)(Shape&0xff); AD9854_WR_Byte(0x2

33、5,RateShape); /设置OSK斜率AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void AD9854_InitAM(void)/函数功能:AD9854的AM初始化/入口参数:无/出口参数:无/=void AD9854_InitAM(void)uchar count;const ulong Freq=60000; /设置载频uchar Adress;Adress=0x04; /选择频率控制字地址的初值 AD9854_WR=1; /将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_R

34、ST=1; /复位AD9854 AD9854_RST=0;AD9854_WR_Byte(0x1d,0x10); /关闭比较器AD9854_WR_Byte(0x1e,CLK_Set); /设置系统时钟倍频AD9854_WR_Byte(0x1f,0x00); /设置系统为模式0,由外部更新AD9854_WR_Byte(0x20,0x60); /设置为可调节幅度,取消插值补偿Freq_convert(Freq); /频率转换for(count=6;count>0;) /写入6字节的频率控制字 AD9854_WR_Byte(Adress+,FreqWord-count); AD9854_UDCL

35、K=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void AD9854_SetAM(uchar Shape)/函数功能:AD9854的AM设置/入口参数:Shape 12Bit幅度,取值从04095 /出口参数:无/=void AD9854_SetAM(uint Shape)AD9854_WR_Byte(0x21,Shape>>8); /设置I通道幅度AD9854_WR_Byte(0x22,(uchar)(Shape&0xff);AD9854_WR_Byte(0x23,Shape>>8); /设置Q通道幅度AD9854_WR_By

36、te(0x24,(uchar)(Shape&0xff);AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void AD9854_InitRFSK(void)/函数功能:AD9854的RFSK初始化/入口参数:无/出口参数:无/=void AD9854_InitRFSK(void)AD9854_WR=1; /将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; /复位AD9854 AD9854_RST=0;AD9854_WR_Byte(0x1d,0x10); /关闭比较器AD9

37、854_WR_Byte(0x1e,CLK_Set); /设置系统时钟倍频AD9854_WR_Byte(0x1f,0x24); /设置系统为模式2,由外部更新,使能三角波扫频功能AD9854_WR_Byte(0x20,0x60); /设置为可调节幅度,取消插值补偿AD9854_UDCLK=1; /更新AD9854输出 AD9854_UDCLK=0;/=/函数名称:void AD9854_SetRFSK(void)/函数功能:AD9854的RFSK设置/入口参数:Freq_Low RFSK低频率 48Bit/ Freq_High RFSK高频率 48Bit/ Freq_Up_Down 步进频率 4

38、8Bit/ FreRate 斜率时钟控制 20Bit/出口参数:无/注: 每两个脉冲之间的时间周期用下式表示(FreRate +1)*(System Clock ),一个脉冲,/ 频率 上升或者下降 一个步进频率/=void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate)uchar count=6;uchar Adress1,Adress2,Adress3; const uint Shape=4000; /幅度设置. 为12 Bit,取值范围为(04095)Adress1=0x04; /选择频率控制字地址的初值 Adress2=0x0a;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论