历史上的今天
今天是:2024年11月28日(星期四)
2019年11月28日 | AD9850与单片机波形生成程序及设计
2019-11-28 来源:51hei
概述=================================================
AD9850/AD9851模块是采用ADI应用最广泛的DDS(AD9850和AD9851)制作的模块。ADI的性能就不用多说了。模块主要参考AD9850和AD9851的资料做的。
主要功能特点:
* 模块能够输出正弦波和方波,2个正弦波和2个方波输出。
AD9850: 0-40MHz
AD9851: 0-70MHz
频率在20-30MHz后谐波越来越大,波形会越来越不干净。
方波: 0-1MHz
* 采用70MHz的低通滤波器,使波形的SN比更好
* 比较器的基准输入端电压由可变电阻产生,调节该电阻可以得到不同的占空比方波
注:在输出正弦波的情况下,接线到方波输出的IO口,直接调节蓝色的电位器可输出方波。
* AD9850模块采用125MHz的有源晶振,AD9851模块采用30MHZ的有源晶振
AD9850和AD9851主要区别
* AD9850的时钟频率最高125MHz,AD9851的时钟频率最高180MHz。输出最高频率AD9851要比AD9850高。
* AD9850没有6倍频,AD9851有
功能框图============================================================
1:下载对应的HEX程序
见AD9850_1_V4_C程序文件夹
OUT1和OUT2端能测试到对应输出1KHz信号。如需测试方波,调节可变电位器,可在方波1和方波2端测试到方波。
单片机源程序如下:
//***************************************************//
//函数1: ad9851_reset() //
//函数2: ad9851_reset_serial() //
//函数3: ad9851_wr_parrel(unsigned char w0,double frequence)//
//函数4: ad9851_wr_serial(unsigned char w0,double frequence)//
//版本: V1.1 //
//***************************************************//
// 子程序说明 //
//***************************************************//
//函数1: ad9851_reset()
// 复位ad9851,之后为并口写入模式
//函数2: ad9851_reset_serial()
// 复位ad9851,之后为串口写入模式
//函数3: ad9851_wr_parrel(unsigned char w0,double frequence)
// 并口写ad9851数据,w0为ad9851中w0的数据,frequence
// 为写入的频率
//函数4: ad9851_wr_serial(unsigned char w0,double frequence)
// 串口写ad9851数据,w0为ad9851中w0的数据,frequence
// 为写入的频率
//需定义的位:
//ad9851_w_clk ;
//ad9851_fq_up ;
//ad9851_rest ;
//ad9851_bit_data ;
//例:
//sbit ad9851_w_clk =P2^2;
//sbit ad9851_fq_up =P2^1;
//sbit ad9851_rest =P2^0;
//sbit ad9851_bit_data =P1^7;
//***************************************************//
// 写数据说明 //
//***************************************************//
//写数据例:
// ad9851_reset()
// wr_lcd02_data(unsigned char x)
// ad9851_wr_parrel(0x01,1000)
// ad9851_wr_serial(0x01,1000)
//***************************************************//
//---------------------------------------------------//
// 程序 //
//---------------------------------------------------//
# include # include # include sbit ad9851_w_clk =P2^2; //P2.2口接AD9851的w_clk脚/PIN7 sbit ad9851_fq_up =P2^1; //P2.1口接AD9851的fq_up脚/PIN8 sbit ad9851_rest =P2^0; //P2.0口接AD9851的rest脚/PIN12 sbit ad9851_bit_data =P1^7; //P1.7口接AD9851的D7脚/PIN25 //P1为8位数据口 //***************************************************// // ad9851复位(并口模式) // //---------------------------------------------------// void ad9851_reset() { ad9851_w_clk=0; ad9851_fq_up=0; //rest信号 ad9851_rest=0; ad9851_rest=1; ad9851_rest=0; } //***************************************************// // ad9851复位(并口模式) // //---------------------------------------------------// void ad9851_reset_serial() { ad9851_w_clk=0; ad9851_fq_up=0; //rest信号 ad9851_rest=0; ad9851_rest=1; ad9851_rest=0; //w_clk信号 ad9851_w_clk=0; ad9851_w_clk=1; ad9851_w_clk=0; //fq_up信号 ad9851_fq_up=0; ad9851_fq_up=1; ad9851_fq_up=0; } //***************************************************// // 向ad9851中写命令与数据(并口) // //---------------------------------------------------// void ad9851_wr_parrel(unsigned char w0,double frequence) { unsigned char w; long int y; double x; //计算频率的HEX值 x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频) //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!! frequence=frequence/1000000; frequence=frequence*x; y=frequence; //写w0数据 w=w0; P1=w; //w0 ad9851_w_clk=1; ad9851_w_clk=0; //写w1数据 w=(y>>24); P1=w; //w1 ad9851_w_clk=1; ad9851_w_clk=0; //写w2数据 w=(y>>16); P1=w; //w2 ad9851_w_clk=1; ad9851_w_clk=0; //写w3数据 w=(y>>8); P1=w; //w3 ad9851_w_clk=1; ad9851_w_clk=0; //写w4数据 w=(y>>=0); P1=w; //w4 ad9851_w_clk=1; ad9851_w_clk=0; //移入始能 ad9851_fq_up=1; ad9851_fq_up=0; } //***************************************************// // 向ad9851中写命令与数据(串口) // //---------------------------------------------------// void ad9851_wr_serial(unsigned char w0,double frequence) { unsigned char i,w; long int y; double x; //计算频率的HEX值 x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频) //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!! frequence=frequence/1000000; frequence=frequence*x; y=frequence; //写w4数据 w=(y>>=0); for(i=0;i<8;i++) { ad9851_bit_data=(w>>i)&0x01; ad9851_w_clk=1; ad9851_w_clk=0; } //写w3数据 w=(y>>8); for(i=0;i<8;i++) { ad9851_bit_data=(w>>i)&0x01; ad9851_w_clk=1; ad9851_w_clk=0; } //写w2数据 w=(y>>16); for(i=0;i<8;i++) { ad9851_bit_data=(w>>i)&0x01; ad9851_w_clk=1; ad9851_w_clk=0; } //写w1数据 w=(y>>24); for(i=0;i<8;i++) { ad9851_bit_data=(w>>i)&0x01; ad9851_w_clk=1; ad9851_w_clk=0; } //写w0数据 w=w0; for(i=0;i<8;i++) { ad9851_bit_data=(w>>i)&0x01; ad9851_w_clk=1; ad9851_w_clk=0; } //移入始能 ad9851_fq_up=1; ad9851_fq_up=0; } //***************************************************// // 测试程序1000Hz // //---------------------------------------------------// main() { P0=0x00; P1=0x00; P2=0x00; P3=0x00; //---------------------------------------------------// ……………………
上一篇:51单片机温控风扇
史海拾趣
|
简介: 内容简介: 本书主要介绍数字信号处理的基础理论,并给出300多道解答步骤完整的习题。因而,本书是相关教材的有益补充,是自学有效问题求解方法的理想读物。 全书共9章,涵盖了数字信号处理导论教程的核心内容,包括数字信号处 ...… 查看全部问答> |
|
小弟初学嵌入式,最近想在一个RTOS上开发一个小的系统,初步考虑是最简单的μCOS-Ⅱ,但是由于苦于无人指导,甚至都不知道其模拟软件开发环境及其对硬件环境的要求,在网上查了一下,好像说用Borland C 4.5可以,但是好像那是一个C语言的编 ...… 查看全部问答> |
|
我是嵌入式系统专业的大学生,大学混了2年半,时间很快,今年6月份就要毕业了,我的大学生活每天基本都在寝室渡过的,因为有宽带,网速也过得去,玩魔兽世界,梦幻,玩dota,cs,war3,劲舞团,一个星期也 ...… 查看全部问答> |
|
调试出现:chosen derivative (msp430f133) and actual hardware(device unknown) do not match. 大致的意思是说:选择的器件型号和实际硬件不匹配。 可是在IAR的环境里我选择的是MSP430F133,本人目标系统用的片子也是msp430f133。 用的仿真器 ...… 查看全部问答> |
|
LM3S6911最近一直很缺货的 因为原厂晶圆供应不足 从而导致的缺货 我们公司同样用LM3S6911做了一个uart转以太网接口的产品 当时也是急疯了 因为我们一直有做TI的电子元器件贸易 跟原厂有联系 所以方案就一直没有更换 现在好了, 货终于到了 ...… 查看全部问答> |
|
如题,本人参加了成都的某机构嵌入式培训,现在就业困难啊。请大家支招。 本人在学校期间在电子实验室呆了3年,做过大量的单片机项目,会上位机开发。linux相关知识在培训期间习得。… 查看全部问答> |




