DDS信号发生器硬件电路主要包括:主控电路、DA9833模块电路、独立按键、液晶显示等。
本方案选择了AD9833(AD9833数据手册)作为核心芯片,并与单片机STC89C52(STC89C52数据手册)结合,设计一款简易的高精度频率信号发生器,具有体积小功耗低等优点。AD9833是AD公司生产的一款采用DDS技术、低功耗、可编程波形发生器。 可产生正弦波,三角波,方波三种波形,正弦波0~4MHz,三角波0~3MHz,方波0~2MHz;任意调节幅度范围0~15V; 仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
电路原理图如下:
Altium Designer画的DDS信号发生器原理图和PCB图如下:(51hei附件中可下载工程文件)
幅度的放大电路:
单片机源码:
- #include <reg52.h> //头文件
- #include <intrins.h>
- #include <stdio.h>
- #include <math.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- uchar s1num,shape,num,a,b,c,d,e,f,h,boxing;
- ulong Freq,g;
- uint Config_Data[8];
-
- uchar code table1[]="波形选择 : SIN ";
- uchar code table2[]="波形频率 : ";
- uchar code table3[]="0 0 0 0 0 0 0 HZ";
- uchar code table4[]="DDS 信号发生器 ";
- sbit rs=P2^7; //12864液晶端口的定义
- sbit rw=P2^6;
- sbit ep=P2^5;
- sbit lcd_psb=P2^4;
- sbit FSYNC=P1^4; //AD9833端口的定义
- sbit SCLK =P1^3;
- sbit SDATA=P1^2;
- sbit s1=P2^0; //光标键
- sbit s2=P2^1; //上调键
- sbit s3=P2^2; //下调键
- void Wave_Generate(ulong,uchar); //波形的频率和波形的选择
- void AD9833_Send_Word(uint); //AD9833的数据接收函数
- void delay(uint); //延时函数
- void delay(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void lcd_cmd(uchar cmd) //12864写入的指令
- {
- rs=0;
- rw=0;
- ep=0;
- P0=cmd;
- delay(5);
- ep=1;
- delay(5);
- ep=0;
- }
- void lcd_dat(uchar dat) //12864写入的数据
- {
- rs=1;
- rw=0;
- ep=0;
- P0=dat;
- delay(5);
- ep=1;
- delay(5);
- ep=0;
- }
- void lcd_init() //12864液晶的初始化
- {
-
- lcd_psb=1;
- delay(5);
- lcd_cmd(0x34);
- delay(5);
- lcd_cmd(0x30);
- delay(5);
- lcd_cmd(0x0c);
- delay(5);
- lcd_cmd(0x01);
- delay(5);
-
- }
- void display()
- {
- uint i;
- lcd_cmd(0x80); //第一行显示
- while(table1[i]!='\0')
- {
- lcd_dat(table1[i]);
- i++;
- }
-
- i=0;
- lcd_cmd(0x90); //第二行显示
- while(table2[i]!='\0')
- {
- lcd_dat(table2[i]);
- i++;
- }
-
- i=0;
- lcd_cmd(0x88); //第三行显示
- while(table3[i]!='\0')
- {
- lcd_dat(table3[i]);
- i++;
- }
-
- i=0;
- lcd_cmd(0x98); //第四行显示
- while(table4[i]!='\0')
- {
- lcd_dat(table4[i]);
- i++;
- }
- }
- void input_freq() //矩形键盘扫描函数
- {
- if(s1==0) //光标键
- {
- delay(5);
- if(s1==0)
- {
- s1num++;
- while(!s1);
- lcd_cmd(0x0f);
- if(s1num==1)
- {
- lcd_cmd(0x80+7);
- }
- if(s1num==2)
- {
- lcd_cmd(0x88+6);
- }
- if(s1num==3)
- {
- lcd_cmd(0x88+5);
- }
- if(s1num==4)
- {
- lcd_cmd(0x88+4);
- }
- if(s1num==5)
- {
- lcd_cmd(0x88+3);
- }
- if(s1num==6)
- {
- lcd_cmd(0x88+2);
- }
- if(s1num==7)
- {
- lcd_cmd(0x88+1);
- }
- if(s1num==8)
- {
- lcd_cmd(0x88+0);
- }
- if(s1num==9)
- {
- s1num=0;
- lcd_cmd(0x0c);
- g=a+10*b+100*c+1000*d+10000*e+100000*f+1000000*h;
- Freq=g;
- boxing=shape;
- Wave_Generate(Freq,boxing);
- }
- }
- }
- if(s1num!=0) //上调键
- {
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- while(!s2);
- if(s1num==1)
- {
- shape++;
- if(shape==3)
- shape=0;
- lcd_cmd(0x80+6);
- switch(shape)
- {
-
- case 0:
- lcd_dat('S'); //按0为正弦波
- delay(5);
- lcd_dat('I');
- delay(5);
- lcd_dat('N');
- delay(5);
- break;
- case 1:
- lcd_dat('T'); //按1为三角波
- delay(5);
- lcd_dat('R');
- delay(5);
- lcd_dat('I');
- delay(5);
- break;
- case 2:
- lcd_dat('D'); //按2为方波
- delay(5);
- lcd_dat('A');
- delay(5);
- lcd_dat('C');
- delay(5);
- break;
- }
- }
- if(s1num==2)
- {
- a++;
- if(a==10)
- a=0;
- lcd_cmd(0x88+6);
- lcd_dat(0x30+a);
- }
- if(s1num==3)
- {
- b++;
- if(b==10)
- b=0;
- lcd_cmd(0x88+5);
- lcd_dat(0x30+b);
- }
- if(s1num==4)
- {
- c++;
- if(c==10)
- c=0;
- lcd_cmd(0x88+4);
- lcd_dat(0x30+c);
- }
- if(s1num==5)
- {
- d++;
- if(d==10)
- d=0;
- lcd_cmd(0x88+3);
- lcd_dat(0x30+d);
- }
- if(s1num==6)
- {
- e++;
- if(e==10)
- e=0;
- lcd_cmd(0x88+2);
- lcd_dat(0x30+e);
- }
- if(s1num==7)
- {
- f++;
- if(f==10)
- f=0;
- lcd_cmd(0x88+1);
- lcd_dat(0x30+f);
- }
- if(s1num==8)
- {
- h++;
- if(h==10)
- h=0;
- lcd_cmd(0x88+0);
- lcd_dat(0x30+h);
- }
-
- }
- }
- }
- if(s1num!=0)
- {
- if(s3==0)
- {
- delay(5);
- if(s3==0)
- {
- while(!s3);
- if(s1num==1)
- {
- shape--;
- if(shape==-1)
- shape=2;
- lcd_cmd(0x80+6);
- switch(shape)
- {
-
- case 0:
- lcd_dat('S'); //按0为正弦波
- delay(5);
- lcd_dat('I');
- delay(5);
- lcd_dat('N');
- delay(5);
- break;
- case 1:
- lcd_dat('T'); //按1为三角波
- delay(5);
- lcd_dat('R');
- delay(5);
- lcd_dat('I');
- delay(5);
- break;
- case 2:
- lcd_dat('D'); //按2为方波
- delay(5);
- lcd_dat('A');
- delay(5);
- lcd_dat('C');
- delay(5);
- break;
- }
- }
- if(s1num==2)
- {
- a--;
- if(a==-1)
- a=9;
- lcd_cmd(0x88+6);
- lcd_dat(0x30+a);
- }
- if(s1num==3)
- {
- b--;
- if(b==-1)
- b=9;
- lcd_cmd(0x88+5);
- lcd_dat(0x30+b);
- }
- if(s1num==4)
- {
- c--;
- if(c==-1)
- c=9;
- lcd_cmd(0x88+4);
- lcd_dat(0x30+c);
- }
- if(s1num==5)
- {
- d--;
- if(d==-1)
- d=9;
- lcd_cmd(0x88+3);
- lcd_dat(0x30+d);
- }
- if(s1num==6)
- {
- e--;
- if(e==-1)
- e=9;
- lcd_cmd(0x88+2);
- lcd_dat(0x30+e);
- }
- if(s1num==7)
- {
- f--;
- if(f==-1)
- f=9;
- lcd_cmd(0x88+1);
- lcd_dat(0x30+f);
- }
- if(s1num==8)
- {
- h--;
- if(h==-1)
- h=9;
- lcd_cmd(0x88+0);
- lcd_dat(0x30+h);
- }
- }
-
- }
-
- }
- }
- void main()
- {
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;
- //delay(10000);
-
- lcd_init();
- display();
- FSYNC=1;
- SCLK=0;
- delay(5);
- Wave_Generate(1000,0);
- while(1)
- {
- input_freq();
- }
- }
- void AD9833_Send_Word(uint Data_In)
- {
- uchar i;
- SCLK=1;
- FSYNC=0;
- for(i=0;i<16;i++)
- {
- SCLK=1;
- SDATA=(bit)((Data_In & 0x8000)>>15);
- SCLK=0;
- Data_In=Data_In<<1;
- }
- FSYNC=1;
- SCLK=0;
- }
- void Wave_Generate(ulong Freq,uchar shape)
- {
- ulong temp;
- uchar k;
- if(Freq>12000000) Freq=12000000;
- switch(shape)
- {
- case 0:
- Config_Data[0]=0x2108; //按0为正弦波
- Config_Data[7]=0x2008;
- break;
- case 1:
- Config_Data[0]=0x210A; //按1为三角波
- Config_Data[7]=0x200A;
- break;
- case 2:
- Config_Data[0]=0x2128; //按2为方波
- Config_Data[7]=0x2028;
- break;
- default:
- Config_Data[0]=0x2108;
- Config_Data[7]=0x2008;
- }
- temp=Freq*10.73; //temp=Freq*(0x10000000/20000000);
- Config_Data[1]=temp&0x00003fff;
- 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]|0x8000;
- Config_Data[4]=Config_Data[4]|0x8000;
- Config_Data[5]=0xC000;
- Config_Data[6]=0xE000;
- for(k=0;k<8;k++)
- {
- AD9833_Send_Word(Config_Data[k]);
- }
- }
复制代码
全部资料51hei下载地址:
信号发生器仿真图及AD原理图.zip
(14.2 MB, 下载次数: 867)
|