当前位置:   article > 正文

基于单片机的DDS函数信号发生器

基于单片机的DDS函数信号发生器

单片机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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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-要输入的命令
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

频率寄存器为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); 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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);
}	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

三.数据采集及分析

本设计正弦波输出频率为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图及相关程序等。

在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/283191?site
推荐阅读
相关标签
  

闽ICP备14008679号