Quavarion 发表于 2011-7-28 11:56:58

自制单片机信号发生器 vs dds模块

自制单片机信号发生器 vs dds模块

一.单片机信号发生器,利用定时中断与函数查表法。

实物图:
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661585W3XZAG.jpg
自制信号发生器实物图 (原文件名:YH}6F1@YC]JQ1TLW~]VXOE0.jpg)

三个开关选择三种波形,按钮开关控制频率


Protues仿真:
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661586V2DN24.jpg
自制信号发生器仿真 (原文件名:



方波:
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661587H0H917.jpg
自制信号发生器方波 (原文件名:5`P8XM0

三角波:

http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661588JCXL7J.jpg
自制信号发生器三角波 (原文件名:F}S%XJMH@WYDS.jpg)


正弦波:
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661589IJ4MXV.jpg
自制信号发生器正弦波 (原文件名:LK5MJNLXQ]0D3$7MGQDVREU.jpg)





二.dds模块,网上买的,实物我就不上了,用ad9851,有示例程序,编程还是很容易。


正弦波:
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661590KQJC8F.jpg
dds正弦波 (原文件名:T{R13U$HFBYH_G]]_I%CZ%F.jpg)


结论:用单片机做的信号发生器编程困难,外围芯片多,要用到dac0832数模转换,运放741进行电压转换,正弦波频率范围为0--3.9khz(我的算法),而且误差大。

用dds模块产生信号的关键是ad9851芯片,有示例程序,理论上频率范围为0---70M,误差小(低频时),且幅度可调。但价格贵(100元)

另外,我发现如果输出接瓷片电容对输出产生很大影响:
直接输出:
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661598EPTZAJ.jpg
直接输出 (原文件名:L2Q(_O%G6]}L~5O_S01R%%A.jpg)

接104到地:

http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661599SC9GZE.jpg
输出与地接一个104电容 (原文件名:ZN0]82]_4WRBCSPCPX7L7RL.jpg)

接221到地:
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661600FMA9QK.jpg
接一个221电容 (原文件名:JCYVJGO}W%715@_)R4)R_TE.jpg)

并接2个221到地:
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_661601M4H4RX.jpg
并接2个221电容 (原文件名:9E]X%)%`3X3{CZN1UC1]VWU.jpg)


先写到这吧有人就继续

catwill 发表于 2011-7-28 12:06:37

mark

huangdog 发表于 2011-7-28 12:09:12

记号

huayuliang 发表于 2011-7-28 12:10:21

如果你的单片机频率够高,输出信号的频率误差是不会太大的。

难道就没考虑过噪声是如何产生的?

ssaweee 发表于 2011-7-28 12:20:38

输出频率的差距是巨大的!

Quavarion 发表于 2011-7-28 12:41:32

用单片机频率误差是有很大,我设置周期是20ms, 但实际上周期是25ms

Quavarion 发表于 2011-7-28 12:43:00

我老师说可能是运放电源引来了噪声,我也想知道为什么,加个电容太神奇了回复【3楼】huayuliang 花生
如果你的单片机频率够高,输出信号的频率误差是不会太大的。
难道就没考虑过噪声是如何产生的?
-----------------------------------------------------------------------

我老师说可能是运放电源引来了噪声,我也想知道为什么,加个电容太神奇了

ruinedone 发表于 2011-7-28 12:51:01

不加buffer直接带容性负载,输出不稳。

ssaweee 发表于 2011-7-28 13:14:51

cpld做还差不多

huayuliang 发表于 2011-7-28 18:44:51

回复【6楼】Quavarion
-----------------------------------------------------------------------

如果你的电路就是仿真的图,基础上就是不完整的。滤波是必须的。

Quavarion 发表于 2011-7-28 18:53:27

回复【9楼】huayuliang 花生
回复【6楼】quavarion   
-----------------------------------------------------------------------
如果你的电路就是仿真的图,基础上就是不完整的。滤波是必须的。
-----------------------------------------------------------------------


长经验了,噪声是从电源来的吗?输出经过了741运放,将dac0832的电流输出转为电压输出。

ssaweee 发表于 2011-7-28 23:19:37

回复【10楼】Quavarion
-----------------------------------------------------------------------

你有没有展开看?   是不是欠采样了?

huayuliang 发表于 2011-7-29 00:08:49

回复【10楼】Quavarion
-----------------------------------------------------------------------

我是指输出滤波,不是对电源噪声处理,电源是之后的事情。

gzhuli 发表于 2011-7-29 00:45:30

DAC0832的波形存在两个问题:
1. DAC0832的WR1/WR2没用上,输出肯定产生毛刺。抱着手册研究一下CS/ILE/WR1/WR2/XFER这5个信号的关系,至少要用单缓冲,51注意利用好ALE。
2. 大多数运放输出直接带电容负载会振荡,这是基本常识。

至于频率不准的问题,你把中断进入时间考虑进去了吗?

Quavarion 发表于 2011-7-29 07:52:15

回复【11楼】ssaweee
回复【10楼】quavarion   
-----------------------------------------------------------------------
你有没有展开看?   是不是欠采样了?
-----------------------------------------------------------------------

正弦波用查表法,每个定时中断发生时查到对应的2进制值,然后用da转为模拟值

Quavarion 发表于 2011-7-29 07:57:20

回复【12楼】huayuliang 花生
回复【10楼】quavarion   
-----------------------------------------------------------------------
我是指输出滤波,不是对电源噪声处理,电源是之后的事情。
-----------------------------------------------------------------------

最近正好在看滤波方面的问题,理论和实际偏差太大了

Quavarion 发表于 2011-7-29 08:03:54

回复【13楼】gzhuli 咕唧霖
dac0832的波形存在两个问题:
1. dac0832的wr1/wr2没用上,输出肯定产生毛刺。抱着手册研究一下cs/ile/wr1/wr2/xfer这5个信号的关系,至少要用单缓冲,51注意利用好ale。
2. 大多数运放输出直接带电容负载会振荡,这是基本常识。
至于频率不准的问题,你把中断进入时间考虑进去了吗?
-----------------------------------------------------------------------

问题应该就是出在这儿,那些我直接接地或+5V.
频率的话,方波频率误差很小,几乎没有,但正弦波就比较大了,应该是正弦波中断查表时占了时间,所以实际上频率比理论上小。


/******方波T = 20 ms **********/
/*
void main()
{
        EA= 1;
        TR0 = 1;
        TF0 = 0;

        TMOD = 0x01;

        TH0 = ( 65536 - 10000 ) / 256;
        TL0 = ( 65536 - 10000 ) % 256;

        P2 = 0xff;

        while(1)
                {
                        if( TF0 )
                                {
                                        TF0 = 0;
                                        P2 = ~P2;

                                                TH0 = ( 65536 - 10000 ) / 256;
                                                TL0 = ( 65536 - 10000 ) % 256;
                                }
                }
}


/************正弦波 T= 20ms计数器初值=(65536 – 20ms/4/64/1us***********/
#include<reg52.h>

unsigned int i = 0;

unsigned char code sin2={    0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,                       
                                          0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,
                                                                 0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,
                                                                        0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,
                                                        0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                                                                     0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,
                                                        0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,
                                                        0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,
                                                        0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,
                                                        0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,
                                                        0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,
                                                        0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,
                                                        0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,
                                                        0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,
                                                        0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                                        0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
                                                        0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,
                                                        0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,
                                                        0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,
                                  0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };



void sinfun()
{
        P2 = sin2;
        i = i %255;
}


void Timer0( void ) interrupt 1 using 0
{
                TH0 = ( 65536 - 78 ) / 256;
                TL0 = (        65536 - 78 ) % 256;
                sinfun();
}


void main()
{
        EA   = 1;
        TR0= 1;
        TMOD = 0x01;
        ET0= 1;

                TH0 = ( 65536 - 78 ) / 256;
                TL0 = (        65536 - 78 ) % 256;

        while(1);
}

ssaweee 发表于 2011-7-29 08:16:51

回复【14楼】Quavarion
回复【11楼】ssaweee
回复【10楼】quavarion   
-----------------------------------------------------------------------
你有没有展开看?   是不是欠采样了?
-----------------------------------------------------------------------
正弦波用查表法,每个定时中断发生时查到对应的2进制值,然后用da转为模拟值
-----------------------------------------------------------------------

我是说你9851未滤波输出,是不是示波器欠采样了?

如果示波器打到比较慢的档位去看高频的信号就会这样。

Quavarion 发表于 2011-7-29 08:43:41

回复【17楼】ssaweee
回复【14楼】quavarion   
回复【11楼】ssaweee
回复【10楼】quavarion   
-----------------------------------------------------------------------
你有没有展开看?   是不是欠采样了?
-----------------------------------------------------------------------
正弦波用查表法,每个定时中断发生时查到对应的2进制值,然后用da转为模拟值
-----------------------------------------------------------------------
我是说你9851未滤波输出,是不是示波器欠采样了?
如果示波器打到比较慢的档位去看高频的信号就会这样。
-----------------------------------------------------------------------

那个输出有杂波要加电容的是我用单片机自己做的信号源,见protues电路图。
买的DDS模块使用的是9851,能直接输出效果很好的波形(模块里有滤波电路)

fuwa 发表于 2011-8-7 00:47:56

请问自制DDS模块怎么输出的正弦波杂波很多啊,而且不稳定...求解关于后端加电容的经验。谢谢~~

fuwa 发表于 2011-8-7 13:13:52

回复【18楼】Quavarion
-----------------------------------------------------------------------
LZ能不能把你买的DDS模块的电路图和程序发过来参考下啊,最近在做DDS,效果不是很好...小弟在这谢了~~~邮箱546427209@qq.com

hongdan0714j 发表于 2011-8-9 22:07:42

回复【20楼】fuwa
-----------------------------------------------------------------------

汗,貌似都买的100¥的DDS啊。。。

Quavarion 发表于 2011-8-12 16:46:29

回复【20楼】fuwa
回复【18楼】quavarion
-----------------------------------------------------------------------
lz能不能把你买的dds模块的电路图和程序发过来参考下啊,最近在做dds,效果不是很好...小弟在这谢了~~~邮箱546427209@qq.com
-----------------------------------------------------------------------

注意查收:)

ICANDO 发表于 2011-8-13 15:34:31

正努力做,有问题还要多请教你呢,哈哈哈

Quavarion 发表于 2011-8-14 10:36:41

欢迎大家讨论

myfriend6042 发表于 2011-8-16 10:49:24

mark

yangjinke1118 发表于 2012-1-5 21:58:51

mark

kangkai613 发表于 2012-2-14 13:33:15

回复【26楼】Quavarion
欢迎大家讨论
-----------------------------------------------------------------------

楼主也发一份资料吧 正需要用呢,不知这个副值能调吗
kkang.mail@tom.com 谢谢

QQ240923760 发表于 2012-4-23 22:34:33

有全部的程序吗???求共享!!!

xiaolaba 发表于 2012-4-24 10:28:37

俺玩過這個開源的, 參考看看

http://xiaolaba.wordpress.com/2011/11/19/70khz-lf-receiver-different-waveform-and-dds-performance/]http://xiaolaba.wordpress.com/2011/11/19/70khz-lf-receiver-different-waveform-and-dds-performance/

Quavarion 发表于 2012-4-27 19:42:05

还是把购买的DDS模块芯片资料发上来

Quavarion 发表于 2012-4-27 20:09:34

kangkai613 发表于 2012-2-14 13:33 static/image/common/back.gif
回复【26楼】Quavarion
欢迎大家讨论
---------------------------------------------------------------- ...

已经发到你邮箱了
页: [1]
查看完整版本: 自制单片机信号发生器 vs dds模块