基于C语言的信号发生器的设计

时间:2022-10-24 04:18:51

基于C语言的信号发生器的设计

摘要:本文首先对信号发生器的设计方案进行了论证,接着提出了系统的整体设计框图,重点论述了由DDFS芯片AD9833构成的信号发生模块的设计。并给出了C语言设计的信号产生程序。较好的实现了C语言在单片机上的应用。

关键词:信号发生器;频率

Design of the Signal Generator Based On C-language

Wan Huan,Geng Jian

(Electronic&Information Institute of Nanchang Technology College,Nanchang330044,China)

Abstract:This article firstly demonstrated the Formula of the signal generator,then give the overall diagram of system.We focuses on the signal modules of the composition of the DDFS chip AD9833.A signal generate program based on C language is given.It achieved good results for C language using in the MCU application.

Keywords:Signal Generator;Frequency

一、方案论证

目前,市面上使用的信号发生器主要有两种:

一种是是采用晶体管、运放和IC等通用器件制作,更多的则是用诸如L8038/BA205/XR2209等专门的信号发生IC来实现。该设计方法设计出来的信号发生器,确实能够输出较完整且不失真的波形,但是输出波形的精度不高,频率的上限值也只有300kHz左右,如勉强使其输出较高频率的波形的话,我们会发现输出信号的幅度有明显下降。简而言之,该类信号发生器输出的信号频率稳定度较差、精度低、抗干扰能力低、成本高、而且灵活性比较差。这样的信号发生器只能用于简单的教学实验当中,无法承担起高精度科研和设计的要求;

另一种是基于FPGA芯片的信号发生器,这种信号发生器采用DDFS技术产生波形。该类信号发生器的各方面指标都不错,但是价格太高。虽然有人提出了采用FPGA并结合DDFS技术自行设计信号发生器的理论和方案。但是在具体设计过程中,由于的DDFS的实现要依赖于高速、高性能的数字器件,而作为一个数字逻辑器件的设计,竞争和冒险成为较为突出的问题,因此利用FPGA设计信号发生器时,只要稍有不当,就可能会出现毛刺,毛刺的清除以及相关的抗干扰设计,将增大电路和程序的复杂程度和可实施性。

本文将结合自身的研究经验,利用专用的直接数字合成(DDS)芯片AD9833来实现高频带高精度的信号发生器的设计。设计出来的信号发生器可以实现正弦波、三角波、方波的自动切换输出。且具有输出频率高,带宽宽、响应时间快、频率分辨率高等优点。可以实现输出信号的幅度、频率以及相位的步进和预置。

二、硬件系统整体设计

硬件的总体设计框图如图1所示:

该系统采用了模块化的设计思想。其中的单片机控制芯片选用了STC89C52RC芯片,它的内部自带8K的FLASH程序存储器,后经系统调试证明,8K的存储空间基本能满足我们的设计要求;键盘显示模块是采用常用的4*4点阵键盘和12864液晶显示器来实现;幅度控制则是采用DAC0832这款D/A转换器的内部的电阻分压网络进行了程控。功放电路采用了成熟的OCL功率放大器,采用对管互推从而实现功率的放大输出;信号产生模块的设计

采用的核心芯片AD9833,该芯片是ADI公司生产的一款低功耗、安全集成了DDS电路的可编程芯片,能够产生正弦波、三角波和方波。输出频率和相位可通过软件编程实现,易于调节,频率寄存器是28位的,主时钟为25MHz时,精度为0.1Hz,主频时钟为1MHz时,输出频率范围为0MHz―12.5MHz,精度可以达到0.004Hz。

可以通过3线SPI接口将数据写入AD9833,这3个串口的最高工作频率可以达到40MHz,该芯片采用10引脚MSOP型表面封装,体积很小。

三、频率参数的计算

本文设计的波形发生器的频率步进可调值为0.1Hz,通过改变输入到AD9833中相位器的步长值,可达到改变频率的目的,根据DDFS原理有:

fout=M(fMCLK/228) =>M=(228*fout)/25*106 =10.73fout

根据要输出的频率可以算出M值。

四、波形产生的程序设计

波形发生程序,采用C语言编程实现,较好的实现了正弦波的输出。下面给出波形产生程序的程序代码:

void Wave_Generate(unsigned long Freq,unsigned char Shape ) //波形发生函数

{ unsigned long temp;

unsigned char k;

if (Freq>12000000)

Freq=12000000;

Config_Data[0]=0x2108;

Config_Data[7]=0x2008; // 设置AD9833的控制寄存器

Temp=Freq*10.73; //Freq为预置的频率值

Config_Data[1]=temp&0x00003fff;//以下为:将24位数据写入AD9833的频率寄存器

Config_Data[3]= Config_Data[1]; //每一个寄存器写两次

Config_Data[2]=( temp&0x0fffc000)>>14;

Config_Data[4]= Config_Data[2];

Config_Data[1]= Config_Data[1]|0x4000;

Config_Data[2]= Config_Data[2]|0x4000;

Config_Data[3]= Config_Data[3]|0x4000;

Config_Data[4]= Config_Data[4]|0x4000;

Config_Data[5]= 0xC000; //设置相位寄存器,使得初相位为零

Config_Data[6]= 0xE000;

For(k=0;k

{ AD9833_send_word(Config_Date[k])};}

参考文献:

[1]胡学武.用AT89C51 实现超低频任意函数发生器[J].现代电子技术,2005,28(17),p105-106

[2]刘复华.MCS296 单片机及应用系统设计[M].北京:清华大学出版社,2004

上一篇:浅谈小学语文多媒体课件制作 下一篇:基于Nios的数字图像处理