单片机DDS函数信号发生器设计

该设计以AT89S52为主控芯片,通过控制高性能DDS(直接数字频率合成)芯片AD9834产生不同频率的信号,经过6阶巴特沃兹低通滤波电路,连接数字电位器的运算放大电路,输出信号。可以输出不同频率的正弦波、三角波和方波,使用LCD1602液晶显示屏实时显示输出波形的类型、频率和幅值等信息。

一.引言

函数信号发生器有多种设计方法,本文设计是基于单片机的DDS函数信号发生器。它的基本原理是通过单片机控制DDS芯片产生不同类型、不同频率以及不同幅值的波形信号,这种方法具有精度高、性能稳定的特点,得到了广泛的应用

二.硬件设计

主要包括单片机控制电路、USB供电电路、下载程序电路、按键电路、稳压电路、DDS电路、低通滤波电路、调幅电路以及显示电路。整体设计框图如下图所示。

1.1 单片机控制电路 采用AT89S52单片机作为控制芯片,图2.2所示为单片机控制电路。按下复位按钮K6,复位脚得到VCC的高电平,单片机复位,按钮松开后,单片机开始工作。时钟电路和单片机内部振荡电路一起构成了单片机的内部时钟方式。

1.2 DDS电路

设计采用的是ADI公司生产的一款DDS芯片AD9834。AD9834 是一款低功耗、可编程的波形发生器,它不仅能产生正弦波,还能输出三角波和方波,其时钟频率为75MHz,故最大能产生37.5MHz的信号。AD9834输出的正弦波和三角波的频率、相位都可以通过控制芯片进行编程控制,调节简单,本文通过单片机控制AD9834,进行编程控制,输出波形、频率和幅值。

1.3 滤波电路

由于DDS芯片产生的信号频率并不是纯净的,且由于各种仪器的相互干扰,所以滤波电路就显得极其重要。因为巴特沃斯滤波器有着最平坦的通带幅频特性,根据本设计需求,阶数增高,滤波效果就越好。

1.4 稳压电路 采用AMS1117-3.3V芯片,将主电路电源5V稳压为3.3V,提供给DDS电路(AD9834电路),使其功耗较低。

1.5 按键电路 本设计需要通过按键输入所需函数信号的输出波形、频率和幅值,采用独立按键,每个按键占用一个I/O资源口,设计电路简单。按键K1-K5分别连接到单片机AT89S52的P3.2-P3.6引脚,K1是数字按键,可以改变频率值;K2是频率的位选按键;K3是增加幅值按键;K4是减小幅值按键;K5是波形选择按键。 1.6 调幅电路 由于要使输出波形的幅值可调,所以在DDS的输出端加上一个数字电位器MCP41010和运算放大器AD8065,对运算放大器使用单电源5.0V进行供电,后续6倍放大,数字电位器MCP41010的片选CS、CLK、SI端口分别连接单片机的P1.0、P1.2、P1.3,如下图所示。 1.7 供电与下载电路 采用自锁开关,USB供电方式,给单片机主电路供电,下载采用ISP在线烧写程序方式。 1.7 显示电路 显示采用LCD1602液晶实现。液晶显示屏的DB0-DB7端口分别与单片机的P0.0-P0.7连接;RS、RW、E端口分别与单片机的P2.1、P2.2、P2.3连接,通过编写程序在液晶上显示信息,第一行显示幅值“am”,单位是“V”、波形类型,第二行显示频率值和位选信号;引脚VO外接一个2K可调电阻器,可以通过改变其阻值,调节液晶显示屏的亮度。

二.软件设计

采用模块化设计。 主要优点是:单个模块比起一个完整的程序易编写、调试及修改,程序的易读性好,程序的修改可局部化、模块可以共存,一个模块可以被多个任务在不同条件下调用。 本程序设计主要分为main主函数、AD9834部分、按键部分、LCD1602显示部分。设计流程图如下图所示。

2.1 AD9834写入数据

AD9834拥有三个标准串行接口,分别是引脚13(SDATA)、引脚 14(SCLK)、引脚14(FSYNC),分别连接单片机P1.3、P1.2和P1.1端口。SCLK是串行时钟输入,为内部时钟,下降沿触发SDATA,16位串行数据字通过端口SDATA输入。当时序时间为SCLK的下降沿时,16位数据被依次被读入AD9834,FSYNC处于低电平时输入有效,当它位于高电平时,数据不能被输入,SDATA更新。所以FSYNC可以被用作片选信号,当FSYNC保持低电平时,新的控制字被写入AD9834中,当FSYNC保持上升沿时,可以从引脚19、引脚20输出信号。 AD9834开始写入16位数据代码:

void AD9834_Write_16Bits(unsigned int Data) //向AD9834要写入的16位数据

{

unsigned char i = 0 ;

SCLK=1;

FSYNC=1;

FSYNC=0; //低电平使数据有效

for(i=0 ;i<16 ;i++)

{

if(Data & 0x8000)

SDATA=1 ;

else

SDATA=0 ;

SCLK=0;

Data <<= 1 ;

SCLK=1;

}

FSYNC=1;

}

2.2 AD9834输出信号 AD9834通过不同的时序控制产生信号,三角波和正弦波采用同一输出端,方波采用单独的输出端。

void AD9834_Select_Wave(unsigned int initdata)

{

FSYNC=1;

SCLK=1;

RESET =1;

RESET =0;

FSYNC=0;

AD9834_Write_16Bits(initdata);//initdata-要输入的命令

}

频率寄存器为28位,每次输入16位数据,从高位到低位输入,设置修改频率程序如下:

void AD9834_Set_Freq(unsigned char freq_chanel, unsigned long freq)

{

unsigned long FREQREG = (unsigned long)(268435456.0/AD9834_SYSTE

M_COLCK*freq);

unsigned int FREQREG_LSB_14BIT = (unsigned int)FREQREG;

unsigned int FREQREG_MSB_14BIT = (unsigned int)(FREQREG>>14);

if(freq_chanel == FREQ_0)

{

FREQREG_LSB_14BIT &= ~(1U<<15);

FREQREG_LSB_14BIT |= 1<<14;

FREQREG_MSB_14BIT &= ~(1U<<15);

FREQREG_MSB_14BIT |= 1<<14;

}

else

{

FREQREG_LSB_14BIT &= ~(1<<14);

FREQREG_LSB_14BIT |= 1U<<15;

FREQREG_MSB_14BIT &= ~(1<<14);

FREQREG_MSB_14BIT |= 1U<<15;

}

AD9834_Write_16Bits(FREQREG_LSB_14BIT);

AD9834_Write_16Bits(FREQREG_MSB_14BIT);

}

CS引脚拉低,才能输入数据,设置幅值程序如下:

void AD9834_AmpSet(unsigned char amp)

{

unsigned char i;

unsigned int temp;

CS=0;

temp =0x1100|amp;

for(i=0;i<16;i++)

{

SCLK=0;

AD9834_Delay();

if(temp&0x8000)

SDATA=1 ;

else

SDATA=0 ;

temp<<=1;

AD9834_Delay();

SCLK=1;

AD9834_Delay();

}

CS=1;

}

2.3 控制部分 该程序部分为主函数部分,主要负责初始化配置单片机、AD9834和LCD1602,通过单片机控制,利用5个按键,设置波形、频率和幅值,控制AD9834输出相应的波形、频率和幅值,将这些参数信息显示在LCD1602液晶屏上。 例如波形键K5设置:按1下波形类型加1,一共3种波形。按1下初始为正弦波,按2下为方波,按3下为三角波,再按一下则为1正弦波,依次循环。以下是显示设置波形主要部分代码。

else if(key5==0)

{

WaveModle=WaveModle+1;

if(WaveModle==3)WaveModle=0;

if(WaveModle==1){AD9834_WaveSeting(FreqData,0,SIN_WAVE,0 );DispStrAt("sinWave", 8, 0);}

elseif(WaveModle==0){AD9834_WaveSeting(FreqData,0,TRI_WAVE,0 );Dis

pStrAt("TriWave", 8, 0);}

elseif(WaveModle==2){AD9834_WaveSeting(FreqData,0,SQU_WAVE,0 );Di

spStrAt("SquWave", 8, 0);}

while(key5==0);

}

2.4 显示部分

主函数调用LCD1602显示控制函数,根据指令显示相应的信息,在液晶显示屏LCD1602上进行显示。LCD1602可显示两行数据,每行16个数据。首先根据其指令编码对其进行初始化;LCD1602是一个慢显示,所以对其读写数据需要一定的延时,以待其完全接收;在显示时,首先根据其地址分配,设定第一行的起始位置,再显示第一行的内容。第二行显示同理。 LCD1602主要显示信息程序如下:

void SendToLCD(const uchar data val, bit flag)

{

bit EAFlag;

uchar timeout = 0xef;

EAFlag = EA;

EA = 0;

while(LCDisBusy() && --timeout);

RS_LCD = flag;

RW_LCD = 0;

DB_LCD = val;

E_LCD= 1;

E_LCD= 0;

EA = EAFlag;

}

三.数据采集及分析

本设计正弦波输出频率为1Hz-10MHz,三角波和方波输出频率为1Hz-5MHz,正弦波和三角波幅值可调,范围是0-3.6V,通过安捷伦示波器测输出信号,进行数据采集并分析。 3.1 正弦波测试 把正弦波输出端接入示波器,以10KHz,100KHz,1MHz,2MHz,3MHz,4MHz,5MHz,6MHz,7MHz,8MHz,9MHz,10MHz作为测试点。 从上表可以得到,相对误差:3M时,相对误差为0.33%;8M时,相对误差为1.25% ;9M时,相对误差为1.11% ;10M时,相对误差为1.00% ;其余所测值相对误差均为0,所以,随着频率增加,相对误差稍变大。

3.2 三角波测试 把三角波输出端接入示波器,以10KHz,100KHz,1MHz,2MHz,3MHz,4MHz,5MHz作为测试点。 从小表可以得出,相对误差:3M时,相对误差为0.33%,其余所测值相对误差为0,所以,实测频率与理论频率相比,误差较小。 但是和正弦波一样,随着频率的增大,幅值在变小,信号衰减,频率越增大,信号衰减的越明显。同样,频率越小,调幅作用越好;频率越增加,幅值误差就会越大,调幅作用也减弱。 3.3 方波测试 把方波输出端接入示波器,以10KHz,100KHz,1MHz,2MHz,3MHz,4MHz,5MHz作为测试点。 从下表可以看出,相对误差:2M时,相对误差为1.00%,3M时,相对误差为0.33% ,所以,实测频率误差较小,因为方波是由AD9834芯片的内部比较器产生的,幅值不变,几近为3.44V,占空比不变,为50%。

四.小结

根据以上正弦波、三角波和方波不同频率的波形图以及实测的频率、幅值等数据,可以得出,正弦波、三角波和方波的频率误差情况,每种波形仅有较少几个理论频率,所测的实测频率存在误差,其余均无。相对误差最大为1.25%,最小为0,所以,实测频率结果较好,误差较小。 但是正弦波和三角波随着频率的增大,幅值在减小,频率越增加,幅值越下降,导致这种情况的原因有: 1、AD9834芯片的自身特性导致的,由于DAC的输出是阶梯状的波形,在频域上表示为Sinc效应,即随着频率的增加,幅度下降;2、运算放大器对输出信号也有一定的衰减。所以,频率小时,调幅作用比较明显,随着越增加,幅值下降越大,调幅作用也减弱。 源设计图及相关程序链接:源程序、PCB图、实物图等

五.附录

设计的电路图、PCB图及相关程序等。

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: