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。
系统主要由dds芯片ad9854、单片机at89c51、看门狗定时器x25045和led显示驱动芯片max7219组成。在这个系统中提供了8位七段led显示器,其中前五位为输出频率值,显示范围为00.000~99.999mhz,后三位为幅度显示位,显示范围为0~999,表示幅值从零幅度到满幅度的变化。
电路二:
正交信号源选择了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地址的初值
……………………

台湾恒创第十一度获得“2018年度全球薄膜电容最佳产品质量奖“
近红外光谱仪在药品快速检验中的应用
2023年全球安防视频监控设备市场规模将达250亿美元
SMBus接口信号/应用框图/帧格式
中国与日本都研究过高考机器人
ad9854单片机程序详细说明(ad9854结构框图及电路)
Posiflex推出业界首款翻盖式POS终端Haydn ZT系列
一种高性能指纹锁硬件电路设计
超小型纯电动汽车或成为纯电动汽车普及的催化剂
华为魅族无人能及!小米6性能颜值逆天:六曲面+骁龙835+MIUI9!
TM52F1363为面包机提供MCU解决方案,内置LCD驱动器和A/D转换器
创新的板对板产品BergStak 连接器
共集放大电路(射极跟随器)的基础知识
第三代半导体头部企业基本半导体完成C4轮融资,全力加速产业化进程
指针的加法操作
工业AI质检走向爆发期,机器颠覆机器的战役正在打响
天下没有免费的午餐,申请SSL证书选择CA很关键!
速度达到10MBps的人体网络通信技术
国内最强三款旗舰手机: 一加5、小米6、努比亚Z17对比评测,哪款更适合你呢?
VR提供商KATVR已完成A轮3000万元融资