0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ad9854单片机程序详细说明(ad9854结构框图及电路)

姚小熊27 来源:网络整理 2018-05-17 08:32 次阅读

ad9854结构框图

ad9854单片机程序详细说明(ad9854结构框图及电路)

如图4-2所示,AD9854内部包括一个具有48位相位累加器、一个可编程时钟倍频器、一个反sinc滤波器、两个12位300MHzDAC,一个高速模拟比较器以及接口逻辑电路。其主要性能特点如下:

1.高达300MHz的系统时钟;

2.能输出一般调制信号,FSK,BPSK,PSK,CHIRP,AM等:

3.100MHz时具有80dB的信噪比:

4.内部有4*到20*的可编程时钟倍频器:

5.两个48位频率控制字寄存器,能够实现很高的频率分辨率。

6.两个14位相位偏置寄存器,提供初始相位设置。

7.带有100MHz的8位并行数据传输口或10MHz的串行数据传输口。

两款ad9854应用电路

电路一:

下面给出一种用AD9854开发高精度频率信号发生器的简易方法,开发者只需要熟悉MCS-51单片机编程即可。该系统具有开发周期短,开发成本低的特点,也可以作为探索AD9854功能的一种方法,它的电路原理图见图2。

ad9854单片机程序详细说明(ad9854结构框图及电路)

系统主要由DDS芯片AD9854、单片机AT89C51、看门狗定时器X25045和LED显示驱动芯片MAX7219组成。在这个系统中提供了8位七段LED显示器,其中前五位为输出频率值,显示范围为00.000~99.999MHz,后三位为幅度显示位,显示范围为0~999,表示幅值从零幅度到满幅度的变化。

电路二:

ad9854单片机程序详细说明(ad9854结构框图及电路)

正交信号源选择了DDS芯片AD9854,具体实现电路见下图。对AD9854进行编程控制,使之输出两路幅度相同并且正交的信号,然后对输出信号进行滤波,使得正弦波变得更加平滑,滤波之后再把输出峰值为512mV的信号放大2倍到1.24V。

ad9854单片机程序

//=====================================================================

// AD9854 驱动程序设计

//AD9854.c

//说明:10MHZ 有源晶振

//=====================================================================

#include 《reg52.h》

#include 《lcd1602.h》

#include 《intrins.h》

sfr P4 = 0xC0; //1111,1111 端口4

sbit KEY1 = P3^5;

sbit KEY2 = P3^4;

sbit KEY3 = P3^3;

sbit KEY4 = P3^2;

unsigned char FreqWord[6]; //6个字节频率控制字

/*

CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ

Freq_mult_unsigned long和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型

*/

#define CLK_Set 20

const unsigned long Freq_mult_ulong = 1407375;

const double Freq_mult_doulle = 1407374.88355328;

//**************************修改硬件时要修改的部分********************************

#define AD9854_DataBus P2

#define AD9854_AdrBus P0

sbit AD9854_RST = P3^6; //AD9854复位端口

sbit AD9854_UDCLK = P3^7; //AD9854更新时钟

sbit AD9854_WR = P4^1; //AD9854写使能,低有效

sbit AD9854_RD = P4^2; //AD9854读使能,低有效

sbit AD9854_FDATA = P4^3; //AD9854 FSK,PSK控制

sbit AD9854_OSK = P4^4; //AD9854 OSK控制端

unsigned char flag = 1;

unsigned int fc = 1000;

unsigned long LFerq = 750;

unsigned long HFerq = 1250;

void AD9854_WR_Byte(unsigned char addr,unsigned char dat);

void AD9854_Init(void);

void Freq_convert(long Freq);

void AD9854_InitFSK(void);

void AD9854_SetFSK(unsigned long Freq1,unsigned long Freq2);

//void delay (unsigned int us);

void UpDisplay()

{

unsigned char disbuf[5];

LCD_Write_String(0, 0, “BaseFerq M”);

LCD_Write_String(0, 1, “Now Ferq M”);

disbuf[0] = fc / 1000 + ‘0’;

disbuf[1] = ‘。’;

disbuf[2] = fc % 1000 / 100 + ‘0’;

disbuf[3] = fc % 100 / 10 + ‘0’;

disbuf[4] = fc % 10 + ‘0’;

disbuf[5] = 0;

LCD_Write_String(9, 0, disbuf);

disbuf[0] = HFerq / 1000 + ‘0’;

disbuf[1] = ‘。’;

disbuf[2] = HFerq % 1000 / 100 + ‘0’;

disbuf[3] = HFerq % 100 / 10 + ‘0’;

disbuf[4] = HFerq % 10 + ‘0’;

disbuf[5] = 0;

LCD_Write_String(9, 1, disbuf);

}

void DownDisplay()

{

unsigned char disbuf[5];

LCD_Write_String(0, 0, “BaseFerq M”);

LCD_Write_String(0, 1, “Now Ferq M”);

disbuf[0] = fc / 1000 + ‘0’;

disbuf[1] = ‘。’;

disbuf[2] = fc % 1000 / 100 + ‘0’;

disbuf[3] = fc % 100 / 10 + ‘0’;

disbuf[4] = fc % 10 + ‘0’;

disbuf[5] = 0;

LCD_Write_String(9, 0, disbuf);

disbuf[0] = LFerq / 1000 + ‘0’;

disbuf[1] = ‘。’;

disbuf[2] = LFerq % 1000 / 100 + ‘0’;

disbuf[3] = LFerq % 100 / 10 + ‘0’;

disbuf[4] = LFerq % 10 + ‘0’;

disbuf[5] = 0;

LCD_Write_String(9, 1, disbuf);

}

void AD9854_SetSine(unsigned long Freq,unsigned int Shape)

{

unsigned char count;

unsigned char 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,(unsigned char)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape》》8); //设置Q通道幅度

AD9854_WR_Byte(0x24,(unsigned char)(Shape&0xff));

AD9854_UDCLK=1; //更新AD9854输出

AD9854_UDCLK=0;

}

void main()

{

LCD_Init();

LCD_Clear();

/*LCD_Write_String(0,0,“BaseFerq 0.875 M”);

LCD_Write_String(0,1,“Now Ferq 1.125 M”);*/

UpDisplay();

AD9854_Init();

AD9854_SetSine(HFerq * 1000,4000);

// AD9854_SetSine(1000000,4000);

// while(1);

// AD9854_InitFSK();

//

// AD9854_SetFSK(HFerq * 1000, LFerq * 1000);

// AD9854_SetFSK(1000000,1000000);

// AD9854_FDATA = 1;

// while(1);

while(1)

{

if(!KEY1)

{

if (flag == 1)

{

AD9854_SetSine(0,0);

//AD9854_InitFSK();

flag = 0;

}

else

{

// AD9854_InitFSK();

// AD9854_SetFSK(HFerq * 1000, LFerq * 1000);

AD9854_SetSine(HFerq * 1000,4000);

flag = 1;

}

while (!KEY1);

}

if (flag == 1)

{

if (!KEY2)

{

AD9854_SetSine(0,0);

fc += 100;

if (fc == 7900) fc = 7800;

LFerq = fc * 3 / 4;

HFerq = fc * 5 / 4;

UpDisplay();

AD9854_SetSine(HFerq * 1000,4000);

// AD9854_InitFSK();

// AD9854_SetFSK(HFerq * 1000, LFerq * 1000);

while (!KEY2);

}

if (!KEY3)

{

AD9854_SetSine(0,0);

fc -= 100;

if (fc == 300) fc = 400;

LFerq = fc * 3 / 4;

HFerq = fc * 5 / 4;

UpDisplay();

AD9854_SetSine(HFerq * 1000,4000);

// AD9854_InitFSK();

// AD9854_SetFSK(HFerq * 1000, LFerq * 1000);

while (!KEY3);

}

if (!KEY4)

{

//AD9854_FDATA = 1;

AD9854_SetSine(LFerq * 1000,4000);

DownDisplay();

while (!KEY4);

AD9854_SetSine(HFerq * 1000,4000);

//AD9854_FDATA = 0;

UpDisplay();

}

}

}

}

//====================================================================================

//函数名称:void AD9854_WR_Byte(unsigned char addr,unsigned char dat)

//函数功能:AD9854并行口写入数据

//入口参数:addr 6位地址

// dat 写入的数据

//出口参数:无

//====================================================================================

void AD9854_WR_Byte(unsigned char addr,unsigned char dat)

{

AD9854_AdrBus = (addr&0x3f) | (AD9854_AdrBus&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_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 需要转换的频率,取值从0~SYSCLK/2

//出口参数:无 但是影响全局变量FreqWord[6]的值

//说明: 该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK

// 得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK

// 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]

//====================================================================================

void Freq_convert(long Freq)

{

unsigned long FreqBuf;

unsigned long Temp=Freq_mult_ulong;

unsigned char Array_Freq[4]; //将输入频率因子分为四个字节

Array_Freq[0]=(unsigned char)Freq;

Array_Freq[1]=(unsigned char)(Freq》》8);

Array_Freq[2]=(unsigned char)(Freq》》16);

Array_Freq[3]=(unsigned char)(Freq》》24);

FreqBuf=Temp*Array_Freq[0];

FreqWord[0]=FreqBuf;

FreqBuf》》=8;

FreqBuf+=(Temp*Array_Freq[1]);

FreqWord[1]=FreqBuf;

FreqBuf》》=8;

FreqBuf+=(Temp*Array_Freq[2]);

FreqWord[2]=FreqBuf;

FreqBuf》》=8;

FreqBuf+=(Temp*Array_Freq[3]);

FreqWord[3]=FreqBuf;

FreqBuf》》=8;

FreqWord[4]=FreqBuf;

FreqWord[5]=FreqBuf》》8;

}

//====================================================================================

//函数名称: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,由外部更新

AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿

AD9854_UDCLK=1; //更新AD9854输出

AD9854_UDCLK=0;

}

//====================================================================================

//函数名称:void AD9854_SetFSK(unsigned long Freq1,unsigned long Freq2)

//函数功能:AD9854的FSK设置

//入口参数:Freq1 FSK频率1

// Freq2 FSK频率2

//出口参数:无

//====================================================================================

void AD9854_SetFSK(unsigned long Freq1,unsigned long Freq2)

{

unsigned char count=6;

unsigned char Adress1,Adress2;

const unsigned int Shape=4000; //幅度设置。 为12 Bit,取值范围为(0~4095)

Adress1=0x04; //选择频率控制字1地址的初值

Adress2=0x0a; //选择频率控制字2地址的初值

……………………

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 信号发生器
    +关注

    关注

    28

    文章

    1271

    浏览量

    107737
  • AD9854
    +关注

    关注

    12

    文章

    50

    浏览量

    27802
收藏 人收藏

    评论

    相关推荐

    基于AD9854的正交扫频信号源设计

    本文首先阐述了AD9854原理,其次介绍了AD9854引脚功能及工作过程,最后介绍了信号的产生及显示控制以及系统软件设计方法。
    发表于 05-18 08:29 4133次阅读
    基于<b class='flag-5'>AD9854</b>的正交扫频信号源设计

    很好的AD9854程序

    `很好的AD9854程序`
    发表于 08-30 11:54

    如何判断AD9854芯片

    又重新编了一个小程序测试了一下FPGA,结果可以产生正常的信号,初步怀疑AD9854芯片坏了,可是我不知道如何判断这个芯片的好坏,请问有什么办法可以测试一下这个芯片的好坏吗?谢谢您能热心的给我解答!
    发表于 11-08 19:05

    AD9854产生正交信号的程序分享

    刚买了AD9854芯片,需用单片机控制产生正交信号,求大神给个程序
    发表于 10-31 15:28

    ad9854中文资料汇总(ad9854引脚图及功能_内部结构及应用电路

    本文首先介绍了AD9854特征与内部结构框图,其次介绍了AD9854引脚功能和AD9854的编程,最后介绍了两款
    发表于 05-16 15:17 2.3w次阅读
    <b class='flag-5'>ad9854</b>中文资料汇总(<b class='flag-5'>ad9854</b>引脚图及功能_内部<b class='flag-5'>结构</b>及应用<b class='flag-5'>电路</b>)

    基于AD9854产生MSK调制信号详细说明

    AD9854数字合成器是高集成度的器件。本文首先介绍了AD9854的特征,其次介绍了AD9854构成的信号发生电路,最后介绍了AD9854
    发表于 05-16 15:50 4428次阅读
    基于<b class='flag-5'>AD9854</b>产生MSK调制信号<b class='flag-5'>详细说明</b>

    16位单片机AD9854控制的探讨

    本文首先介绍了AD9854的优势和特点,其次介绍了AD9854高精度频率信号发生器的电路图,最后详细介绍了16位单片机
    的头像 发表于 05-16 16:16 6148次阅读
    16位<b class='flag-5'>单片机</b>对<b class='flag-5'>AD9854</b>控制的探讨

    STM32的AD9854 DDS模块调试总结

    本文首先介绍了DDS的基本原理和特点,其次介绍了DDS芯片AD9854的概念,最后详细介绍了STM32的AD9854 DDS模块调试经验总结。
    发表于 05-16 16:43 1.7w次阅读
    STM32的<b class='flag-5'>AD9854</b> DDS模块调试总结

    ad9854应用电路图大全(五款ad9854信号发生/频率发生器/正交信号源电路

    本文介绍了五款ad9854的应用电路图。其中包括了ad9854信号发生电路ad9854高精度频率发生器、
    发表于 05-16 17:33 8459次阅读
    <b class='flag-5'>ad9854</b>应用<b class='flag-5'>电路</b>图大全(五款<b class='flag-5'>ad9854</b>信号发生/频率发生器/正交信号源<b class='flag-5'>电路</b>)

    stm32驱动ad9854程序分享_ad9854构成信号发生器电路

    AD9854数字合成器是高集成度的器件。本文首先介绍了ad9854优势和特点,其次介绍了ad9854构成的信号发生器电路,最后分享了stm32驱动a
    的头像 发表于 05-17 09:23 1.5w次阅读
    stm32驱动<b class='flag-5'>ad9854</b><b class='flag-5'>程序</b>分享_<b class='flag-5'>ad9854</b>构成信号发生器<b class='flag-5'>电路</b>

    基于FPGA控制AD9854产生正弦波

    本文首先介绍了ad9854的工作原理,其次介绍了两款AD9854应用电路图,最后介绍了基于FPGA控制AD9854产生正弦波。
    发表于 05-17 09:53 6246次阅读
    基于FPGA控制<b class='flag-5'>AD9854</b>产生正弦波

    AD9854的FPGA程序免费下载

    本文档的主要内容详细介绍的是AD9854的FPGA程序免费下载。
    发表于 11-16 08:00 18次下载

    AD9854参考代码

    AD9854参考代码
    发表于 03-18 11:07 40次下载
    <b class='flag-5'>AD9854</b>参考代码

    AD9854评估板原理图

    AD9854评估板原理图
    发表于 04-23 13:48 19次下载
    <b class='flag-5'>AD9854</b>评估板原理图

    AD9854/AD9852评估板说明

    AD9854/AD9852评估板说明
    发表于 05-11 14:31 15次下载
    <b class='flag-5'>AD9854</b>/AD9852评估板<b class='flag-5'>说明</b>