hb8421 发表于 2007-8-10 20:45:08

基于Mega8单片机和AD9833的正弦波信号发生器(原创)

去年9月开始学习、使用Mega单片机,从本站获得了许多帮助,特别是《新手入门》以及技术论坛,获益匪浅!为感谢阿莫、HJJourAVR及许多同仁的帮助,特展示一下我的设计:基于Mega8单片机和AD9833的正弦波信号发生器。AD公司生产的AD9833是一款低功耗、可编程波形发生器,在Mega8单片机的控制下可生成0-12.5MHz的正弦波,还可以生成三角波和方波。



   硬件电路:参考AD9833的典型电路。   

   软件方面:编程时需要注意以下几个问题:第一,Mega8单片机虽然具有硬件SPI总线功能,但是一次只能传输8位数据位,而AD9833在接收数据时是16位数据位,因此,需要用软件模拟SPI总线,如同软件模拟I2C总线;第二,AD9833在接收16位数据时是高位在前,低位在后;第三,先发送控制寄存器字(注意B28的定义,B28=1时,进行两次连续写操作)然后发送想要的频率字(注意低字节在前,高字节在后);第四,发送数据前必须把FSYNC置成低电平,发送完以后把FSYNC置成高电平。





http://cache.amobbs.com/bbs_upload782111/files_8/armok01165782.JPG

http://cache.amobbs.com/bbs_upload782111/files_8/armok01165783.JPG

http://cache.amobbs.com/bbs_upload782111/files_8/armok01165784.JPG

http://cache.amobbs.com/bbs_upload782111/files_8/armok01165785.JPG



上面展示的5Hz、50Hz、500Hz、5000Hz的正弦波。









补充:



    因为东西都在办公室的计算机上,今天上班才能把程序和原理图发过来!



点击此处下载armok01166279.rar



感谢网上朋友们的帮助!

hb8421 发表于 2007-8-10 21:12:06

请阿莫给我加点分呀!

armok 发表于 2007-8-10 21:28:32

波形不错啊!



呵呵,要上传SCH,源代码等才能置成COOL呢。

poppush 发表于 2007-8-10 22:09:33

ok不错

alien2006 发表于 2007-8-10 23:09:39

不错啊,顶下,我以前做过用ICL8038和MAX038搞的信号发生器,不过还是想搞搞DDS,不过芯片实在是不好找,顺路问下AD9833哪里能搞到啊,问遍了电子市场都没DDS芯片卖的

    另外有没有试试高频率比方说1MHZ的波形?贴个图看看啊,不知道10BIT的DAC出来的波形失真会不会比较高,我用MAX038做的信号发生器按PDF说可以达到千分之几的失真率,不知道10BIT的DDS能达到什么效果?

hb8421 发表于 2007-8-11 09:21:43

to 阿莫:

硬件电路原理图实际就是AD9833的数据手册中的典型电路。下载个数据手册看看即可。

软件方面我把要点已经讲的比较清楚,仿照I2C总线方式,软件模拟一个即可。

hb8421 发表于 2007-8-11 09:30:47

to alien2006:

   我在西安买的,价位50圆左右,不开票45圆拿到。

   高频试验过,到50KHz已经有些变形。

   另:Ad9833输出为0-0.6V的波形,实际使用中需要在输出端接放大电路。

laoki8888 发表于 2007-8-11 09:38:22

为什么要模拟SPI呢?16位数据发送两次8位不行吗?



我用过几个SPI设备也没有发现16bit不能用硬件的

ningmeng7294 发表于 2007-8-12 09:30:43

怎么没源程序捏,给个驱动参考也行呀!

ningmeng7294 发表于 2007-8-12 23:29:56

void DDS_Write(uint Write)

{

signed char i;



DDS_PORT &= ~DDS_SCS;

DDS_Delay();

for (i=15;i>=0;i--)

{

    if (Write&(1<<i))

        DDS_PORT |= DDS_DATA;

    else

        DDS_PORT &= ~DDS_DATA;

    DDS_Delay();

    DDS_PORT &= ~DDS_SCLK;

    DDS_Delay();

    DDS_PORT |= DDS_SCLK;

}

DDS_Delay();

DDS_PORT |= DDS_SCS;



}

hb8421 发表于 2007-8-13 16:25:30

阿莫注意了:

    因为东西都在办公室的计算机上,今天上班才能把程序和原理图发过来!



点击此处下载armok01166279.rar



感谢网上朋友们的帮助!

hb8421 发表于 2007-8-13 16:27:33

原理图为什么发不上来?



没办法,各位参考AD9833的数据手册中的典型电路即可!

hb8421 发表于 2007-8-13 16:30:52

阿莫给我加点分呀!

sudayan2006 发表于 2007-8-13 17:12:56

请问一下AD9833多少钱一片

finenesszhang 发表于 2007-8-13 23:53:51

上传个AD9833的数据手册

点击此处打开armok01166299.pdf

点击此处打开armok01166300.pdf

armok 发表于 2007-8-14 01:38:41

【10楼】 hb8421 ,



好的,已经帮你置到楼主位,并且置成COOL了。分数请放心,迟些我们升级论坛里,会将COOL贴的加分也统计入内的。

jacky2056 发表于 2007-8-15 15:47:32

楼主把原理图传上来吧,这样看起来完整,谢谢!

hb8421 发表于 2007-8-15 19:46:47

to laoki8888 阿虚:

我开始也想用硬件SPI总线方式,不过没有试验成功,不得以采用软件模拟SPI总线。或许我的编程能力有限,不妨把你的软件发到我的邮箱 hb8421@163.com 交流交流。

hb8421 发表于 2007-8-15 19:49:12

to jacky2056:

不知为何,原理图发送不上来,若有兴趣,可用邮件联系。



我的邮箱 hb8421@163.com

jacky2056 发表于 2007-8-16 10:12:54

AD9833不是标准的SPI总线接口,应该通过软件模拟的。

楼主,已给你发送邮件了,谢谢!

eagle2006 发表于 2007-8-16 15:38:10

好资料,正想用M32来控制AD9834

hb8421 发表于 2007-8-17 13:27:21

to jacky2056:

原理图已给你发出,望查收!

eagle2006 发表于 2007-8-17 17:38:54

hb8421 我这2天在搞9834,但发现数据写不进去,能跟你交流下吗?



我QQ:319302900

Christopher 发表于 2007-8-17 20:35:06

学习一下,谢谢楼主的分享。

lljyes 发表于 2007-8-18 11:36:07

有兴趣,想多了解!

niu711 发表于 2007-8-20 16:30:03

请问长期运行的话,输出会稳定吗?我怕单片机会异常。

AVRBeginner 发表于 2007-8-21 00:37:24

我的AD9833和AD9835 都是刚开始用的时候好好的,都是工作过程实然烧了,看现象是它的输出buffer烧了,AD的DDS片子好像很脆弱,我只按标准电路接了,负载直接接到了示波器上,结果工作过程中示波器的波形实然消失了,再查片子over了。

everglen 发表于 2007-8-21 02:39:59

1. "工作过程中示波器的波形实然消失了,再查片子over"

工作时能看到波形,连线应该没错.

2. 负载直接接到示波器?用示波器测负载两端的电压,除了直接用探针测量外,还有间接连接的保护措施?

3. 是不是电源的问题?

AVRBeginner 发表于 2007-8-21 10:59:08

工作正常,用单片机可以控制,结果也都对,看起来一切正常。

直接用示波器10X档测输出,没有接其它电路

应该不是电源问题,是7805做的电源,用了很久了,一直都很好啊。

另外,这两个片子我不是一起烧的,去年用的AD9833,莫名其妙烧了,当时以为可能是自己不小心呢。

今年又做了一个AD9835的,只工作了一个多小时,工作正常,波形挺好的,频率控制也很精确,芯片也不热,

然后发现示波器上波形实然消失了,

再摸芯片烫手,赶紧断电,可是片子还是烧了,还是莫名其妙。

warmbupt 发表于 2007-8-22 11:28:50

我是初学者,谁能解释一下楼主的这几句代码(加问号的)?谢谢!

        dds=dds<<2;//??

        dds_l=dds;                //低字节

        dds_h=dds>>16;        //高字节

       

        dds_l=dds_l>>2;//??

        dds_l=dds_l & 0x7FFF;//??

        dds_l=dds_l | 0x4000;//??

       

        dds_h=dds_h & 0x7FFF;//??

        dds_h=dds_h | 0x4000;//??

TO hb8421:我也想要个原理图,warmbupt@gmail.com.非常感谢!

ecat 发表于 2007-8-22 11:53:13

28楼AVRBeginner 的问题我也遇到的,我烧掉了10多枚DDS,都是莫名其妙的,正常工作时就over了!目前我还是重点怀疑电源问题,但还要进一步研究,究竟是什么原因。也希望有经验的大侠来指点。

jacky2056 发表于 2007-8-24 18:25:03

warmbupt ,楼主有给我发原理图,我把原理图发给你。请查收。



void output(unsigned long freq_value)

{

        unsigned long dds;

        unsigned int dds_l,dds_h;

       

       

        dds= freq_value *268.435456; //268435456/ FMCLK

        dds=dds<<2;

        dds_l=dds;                //低字节

        dds_h=dds>>16;        //高字节

       

        dds_l=dds_l>>2;

        dds_l=dds_l & 0x7FFF;

        dds_l=dds_l | 0x4000;

       

        dds_h=dds_h & 0x7FFF;

        dds_h=dds_h | 0x4000;

       

        Write_word(0x2000);        //28位连续,选择频率0,相位0,RESET=0

        Write_word(dds_l);       

        Write_word(dds_h);               

}

这个代码我也不太理解,还请楼主解释下,谢谢!

hb8421 发表于 2007-8-24 19:48:52

最近没上网,上来一看,大家比较感兴趣,现比程序中大家的问题讲一讲。



dds= freq_value *268.435456; //268435456/ FMCLK   // 2∧28方除以系统晶振(我的系统晶振为1MHz)

dds=dds<<2;                                       //为什么要左移两位,目的是给高字节一个有效值

dds_l=dds; //低字节

dds_h=dds>>16; //高字节



注意:频率寄存器的定义:

表2 频率和相位寄存器操作

             DB15        DB14        DB13        DB12        D11                 DB0       

相位寄存器0        1        1        0        ×        MSB 12 PHASE0 Bits        LSB       

相位寄存器1        1        1        1        ×        MSB 12 PHASE1 Bits        LSB       

频率寄存器0        0        1        MSB   14 FREQ0 REG Bits                 LSB       

频率寄存器1        1        0        MSB   14 FREQ1 REG Bits                 LSB

hb8421 发表于 2007-8-24 19:56:39

希望大家还是认真看看AD9833的数据手册,不要因为是英文就不想看,认真看看,就能明白控制寄存器、频率寄存器的内容。

minier 发表于 2007-8-27 20:00:23

我也表个态,我是用25M数字示波器调试的

波形在低频处很好,但是细致察看有很小的毛箣,当频率到1M时波形已经细节有问题,5M的时候波形有太多的大毛刺,8M时已经波形发生畸变!

经分析和测试,后面20p的电容滤波似乎有些牵强,派型滤波好了很多,但是还是没有能实现12M优良的波形输出!!!关于优良的DDS滤波器大家各抒己见吧!

minier 发表于 2007-8-27 20:02:51

软件设置还是要看手册,否则大家无法交流,要讲究讨论层次吗!

alien2006 发表于 2007-9-11 14:13:52

TO:【32楼】 hb8421兄,才看到你32楼的帖子,你说你用的晶振是1MHZ,我想这个是不是导致你在6楼回复说波形到50KHZ就严重失真的问题了?
   我看到网上的资料说是AD9833的正选波查表是,0-360度中分布228个点,就是一个完整的正弦波周期由228个点组成,因此要产生不失真的正弦波,最高的正弦波频率应该是25MHZ / 228 =0.109MHZ,是不是可以这样理解?
   对DDS也比较感兴趣,希望能多看到各位高手的好帖,继续顶。

ljy99731 发表于 2007-9-11 14:33:00

我看的9833数据手册里面是直接通过管脚输出的,到达1M的时候波形就很差了,需要外加低通滤波器,可以参考AD9851的电路设计,滤波器做得好的话可以到12.5M

hetao7241 发表于 2007-9-12 10:51:00

hb8421:你好,能把你的原理图给我发一分吗?非常感谢! email:hetao7241@163.com

hetao7241 发表于 2007-9-12 11:47:20

to alien2006:
   我在西安买的,价位50圆左右,不开票45圆拿到。
   高频试验过,到50KHz已经有些变形。
   另:Ad9833输出为0-0.6V的波形,实际使用中需要在输出端接放大电路。



不知道这种放大电路要注意些啥?怎么设计放大部分,对模拟电路做得较少,不要见笑,谢谢!

wwwavr 发表于 2007-9-12 20:54:03

楼主把原理图传上来吧,这样看起来完整

hb8421 发表于 2007-9-13 08:59:31

网上找了好久,终于找到了虚拟打印机,现将原理图上传。

点击此处打开armok01172849.pdf

hb8421 发表于 2007-9-13 09:11:13

简要说明:
   原理图上半部为M8控制DDS器件的电路图,下半部为单片机产生脉冲信号。
只所以用两个单片机,是因为项目开始前,DDS器件没把握,同时,M8非常便宜,所以分开来做。

hetao7241 发表于 2007-9-13 09:30:09

请教hb8421:74HC244有没有实际的作用,R10有什么作用?谢谢!

acai 发表于 2007-9-13 10:44:10

暑假用MEGA16操作了下AD9854,这块DDS的性能和他的发热量一样大

alien2006 发表于 2007-9-13 14:02:59

AD985X这些的功耗是不小,AD9834/AD9833这些就好多了,才20mW,绿色环保,呵呵!
    另外楼上几位兄弟DDS都是哪里搞到的啊, 可不可以帮偶也代买一块AD9834C 啊,谢谢

hb8421 发表于 2007-9-13 20:06:27

后级OP07电路及外围电路的作用:
1.放大。AD9833的输出只有0.6V,我要2V的峰峰值,必须要放大。
2.调零。AD9833的输出在0-0.6V ,是单极性,我要-1V到 1V的波形,用电位器调零,使基线到零值。

mchen 发表于 2007-10-26 10:50:39

谢谢分享

jeiboy 发表于 2007-12-18 09:51:16

谢谢分享!!

hb8421 发表于 2008-5-7 19:40:20

请版主帮我把我在17、18楼留下的邮箱地址删除,谢谢!拜托了!

hb8421 发表于 2008-5-8 08:42:58

请版主帮我把我在17、18楼留下的邮箱地址删除,谢谢!拜托了!

our_avr 发表于 2008-5-8 09:26:18

不错。顶一个。。。

说实话这个东西我还正不知道除了(信号源)仪器外还有什么地方能用的到的。比方讲变频器上能用吗?

哈哈。

yyzzhh2000 发表于 2008-7-5 18:14:38

有两个问题:
1.完全可以用SPI总线,无需模拟。
2.无需R10来调零,用一个电容隔离直流成分即可达到双极性。

stayzhang 发表于 2008-11-9 12:58:33

恩,不错。

nova8806 发表于 2009-1-5 14:01:24

DDS信号源

51mcu2008 发表于 2009-4-24 12:31:22

我也做过9850的DDS信号发生器

liyunavr 发表于 2009-7-14 13:44:36

很好啊~~~~~~`

yqing81 发表于 2009-7-14 18:55:03

学习了 很好哟

undeadhuman 发表于 2009-7-15 20:50:06

hoho!我也搞定了AT89S52+AD9833,现在可以随意出信号了,
上周搞的时候很简单的一个失误,让我整整搞了一个星期,求助了无数的人,只不过都没有回音,这个帖子也浏览了无数次。

现在心情大好。过一段时间在51版会贴出源码,输出信号、时序等信息供给大家。

ouyangyong817 发表于 2009-7-22 11:17:12

很好很强大!

coldwind 发表于 2009-7-29 10:46:42

用过169+AD9833

下载个AD9833的小工具

根据那个编程的话到时候改频率字很方便

7461639 发表于 2009-8-1 11:26:09

hm_huang 发表于 2009-8-5 15:58:51

谢谢分享!

khijfv 发表于 2009-8-5 17:34:00

我买了几个AD9835的片,都不知如何玩呢

有需要的低价点出了.
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_467811.jpg
(原文件名:ourdev_448449.jpg)

fujiachun 发表于 2009-8-6 15:06:11

请教9833如何出方波?控制字如何写

foolishMan 发表于 2009-8-7 09:01:38

记号+感谢+收藏

myworkmail 发表于 2009-8-7 09:36:17

mark

zlulu2006 发表于 2009-8-13 09:10:28

很好的参考资料

dengxiaofeng 发表于 2009-8-15 20:04:36

不错的资料!

coldwind 发表于 2009-9-22 15:54:06

【64楼】 fujiachun
积分:33
派别:
等级:------
来自:        请教9833如何出方波?控制字如何写


----------------------------------------------


你自己下个datasheet看看不就行了
 

xyq4513 发表于 2010-3-17 14:25:24

mark

ammcu 发表于 2010-3-17 20:10:50

mark

feiyu13 发表于 2010-3-22 14:31:54

回复【58楼】undeadhuman
-----------------------------------------------------------------------

我最近也想做一个,正在学习,可以把你的发给我看看吗?

邮箱gan-yu-13@163.com

谢了!

crazy_b-boy 发表于 2010-5-21 16:37:18

好的好的哈哈 动手了

chys01 发表于 2010-6-2 21:41:56

路过

chenhuwyl 发表于 2010-7-18 12:54:58

谢谢了

moon0213 发表于 2010-8-4 00:58:45

mark

fedora10 发表于 2010-9-29 20:56:59

ad9833

yqlomg 发表于 2010-9-29 21:09:19

mark

moon0213 发表于 2010-9-30 17:11:24

好资料,谢谢

myyule 发表于 2010-11-8 17:53:53

记号+感谢+收藏

60333tim 发表于 2010-12-7 22:05:16

mark

saga_2009 发表于 2011-3-8 22:10:45

楼主 能传个原理图给我吗,我主要想看看 滤波器设计部分 信箱saga.2009@live.cn

qgrom 发表于 2011-3-8 22:29:00

最近也在做信号发生器,向楼主学习!

superlong 发表于 2011-3-22 16:21:14

学习中。。。。

AllEle 发表于 2011-5-4 13:42:51

不错

martiny 发表于 2011-5-5 22:01:24

我用的是AD9834但是输出总是会随频率改变不知有没有办法稳幅?

maozi4779 发表于 2011-5-11 20:41:39

不知道AD9833能不能到10M 波形也很漂亮

gluck 发表于 2011-5-13 00:09:01

可以发一份电路原理图给我么?

gluck 发表于 2011-5-13 00:28:05

回复【30楼】ecat电子猫
-----------------------------------------------------------------------

可以发给我一份么?452281556@qq.com,,谢谢

steven_wangsr 发表于 2011-5-18 12:51:03

您好楼主!

   请问正弦波的幅值怎么通过单片机控制,我有个项目要用到,

   您说的 0-0.6V 是固定的吗?能通过程序设置可调吗?
   谢谢!!!

hysdh 发表于 2011-5-19 11:01:09

想问楼主一个问题。。。我也在看dds,是ad9834.。我不明白的是相位控制字p,为什么输出波的相位P0与控制字p的关系是:P0=p*2pi/2N(pi是圆周率,分母是2的N次方)啊!!希望能解答。。谢谢

qxj_2011 发表于 2011-5-21 14:46:59

不能下载,楼主传我一份,祝发财d_a_b@sina.com

micheal0311 发表于 2011-7-4 16:11:34

学习学习

hustestwolf 发表于 2011-7-6 15:10:07

回复【楼主位】hb8421
-----------------------------------------------------------------------

楼主,我在用AD9834做信号发生器,做了快两个月了,就是出不了波形啊,能不能指点一下啊,QQ:369444759.

hustestwolf 发表于 2011-7-6 15:18:53

回复【86楼】martiny
--------------------------------------------------------------------
我最近也在用AD9834,输出地波形也不对,正弦波频率不对,而且不稳定,像是噪声,可以交流一下吗?

413713031 发表于 2011-7-9 16:23:17

AD9833看起来输出波形很好,找到替代的了,真好!!

etiger999 发表于 2011-7-25 15:08:56

mark

charston1990 发表于 2011-8-10 20:31:36

不错

zxfzxmcxczxq 发表于 2011-8-19 18:38:46

mark
页: [1] 2
查看完整版本: 基于Mega8单片机和AD9833的正弦波信号发生器(原创)