DDS波形发生器文档格式.docx
- 文档编号:4790147
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:29
- 大小:113.54KB
DDS波形发生器文档格式.docx
《DDS波形发生器文档格式.docx》由会员分享,可在线阅读,更多相关《DDS波形发生器文档格式.docx(29页珍藏版)》请在冰点文库上搜索。
采用一级D/A转换实现。
直接将DDFS产生的信号作为参考电压输入到D/A中,这样D/A就成为一个数控可变增益放大器,通过改变D/A的转换数据就可以控制输出幅度。
数模转换和幅度控制部分采用双D/A技术,由单片机控制,第一级D/A的输出波形作为第二级D/A的基准电压源,以此来控制信号发生器的输出电压幅度。
这种方法电路简单,通过软件控制,可控性强,故采用这种方案。
b)后级滤波部分
采用二阶切比雪夫低通滤波器。
切比雪夫低通滤波器的幅度响应在通带内是在两个值之间波动,在通带内的波动次数取决于滤波器的阶数。
理想的切比雪夫低通滤波器近似在靠近截止频率的部分有比巴特沃兹滤波器更接近矩形的频率响应。
采用二阶巴特沃兹滤波器。
巴特沃兹滤波器的幅度函数是单调下降的,但巴特沃兹滤波器能实现最大平坦幅度滤波。
由于信号发生器的输出波形中的主要噪声为D/A转换产生的高频分量,与设计的频率范围相差很远,所以相对来说,滤波器在频带内的平坦程度比其衰减陡度更为重要,而且巴特沃兹滤波器的元件值也较合乎实际情况,不像其他类型滤波器对元件值要求那么苛刻。
基于上述考虑,决定采用二阶巴特沃兹滤波器。
经过讨论最终采用以下方案实现信号发生器的设计:
采用CPLD与单片机结合利用DDFS技术进行频率合成,将波形数据存储在双口RAM中,采用双片D/A实现稳幅输出,并经过二阶巴特沃兹滤波器进行滤波,相关信息通过字符型LCD显示。
二系统设计
1.总体设计框图
单片机构成系统的控制中心,控制功能选择和结果显示,CPLD在单片机的控制下实现直接频率合成,系统初始化后对按键进行判断从而根据设定选择相应的功能执行。
在更改输出波形频率时,根据输入产生相应的频率控制字送到CPLD中,控制输出频率值。
CPLD的输出作为双口RAM的读取地址,选取波形数据经DAC0832输出模拟波形。
同时,单片机控制第一片DAC0832输出直流电压作为输出波形的DAC0832的基准源,控制输出波形的幅值。
系统连接框图如下图所示:
CPLD
IDT7132
滤波模块
DAC
(2)
DAC
(1)
键盘
2.各模块设计
1)单片机的设计
单片机是系统的控制中心,它主要实现以下的功能:
一方面控制LCD显示输入控制信息,控制按键识别和功能选择;
另一方面与CPLD结合,实现直接频率合成。
单片机提供CPLD的控制端口,对CPLD内部实现控制和选择,配合对双口RAM内存储数据的读取;
另外单片机还和两片D/A相连,实现对D/A的控制。
根据DDFS原理,输出频率为:
其中fclk为输入时钟频率,M为相位累加器的位数,N为频率控制字。
考虑要达到的要求,选取晶振频率为8.388MHz,频率控制字为24位,步进为0.5Hz。
单片机在等待按键过程中输出标准的1KHz三角波,用户按下按键后根据不同的按键实现各种功能。
直接按下按键0、1、2,可实现输出波形在正弦波、方波和三角波之间的转换。
软件设计四种状态,其中状态1、3为频率控制,状态2、4为幅度控制,当按下按键7和11时,分别对应的将状态改为3和4,进行频率或电压幅度的修改。
之后再按下按键1~9对应输入相应的数字,输入所需要修改的值后再按回车键将改变输出波形的频率或幅度。
考虑到LCD的显示位数有限,若输入的数值满5位,系统自动默认为输入完毕。
输入错误可按3号键取消本次修改输入。
同时,LCD实时显示输出波形的频率、幅度信息及修改的数值信息。
另外,以手写板作为前向通道,采集用户在手写板上绘制的波形,并将其存储和显示。
手写板和单片机之间通过串口进行数据传输,波特率为9600Hz。
当手写板被触及时,它便将被触及点的坐标值进行适当的编码,并打包传给单片机,单片机接受到数据后计算触及点的坐标并进行相应处理,然后存储起来,并通过CPLD的控频,输出所需频率的波形。
单片机内部的程序流程图如下图所示:
根据流程图编程的KEILCx51源程序见附录程序。
2)CPLD的设计
在CPLD内部形成DDFS所需的相位累加器。
另外,单片机和双口RAM通信时P0口提供低八位地址所需要的锁存器也在CPLD内部实现,减少硬件。
其中DDFS的简单逻辑电路如右图所示:
单片机的P2.7、P2.4、P2.3、P2.2、P2.1提供CPLD的控制信号,提供频率选择字的地址。
由于P2.7、P2.4、P2.3分别作为LCD、DAC0832和RAM的片选信号,并设定由P0口根据P2.2、P2.1口组合的不同,分时提供数据,组成累加器所需的24位输入数据。
为保证时序不发生冲突,在单片机WR端为低电平时写入数据。
VerilogHDL的源程序见附录。
3)后级滤波模块的设计
滤除波形中由D/A产生的高频分量,根据实际情况设计低通滤波器,采用两级高通级联来提高Q值。
根据设计表,综合考虑取
R1=1.5kΩ,R2=3.3kΩ+50kΩ的电位器,C1、C2分别取301和101的电容。
3.系统实现电路
按上述设计思路,采用89S52单片机控制系统,MAX7000S系列的EPM7128SLC84-15器件进行CPLD设计。
。
A/D转换部分采用的ADC0809,D/A转换部分采用DAC0832。
系统电路设计如下图所示:
三系统调试与指标测试
a)测试仪器
TektronixTDS1002双信道数字示波器,SG173SB3直流稳压稳流电源,Agilent33120A信号发生器,FLUKE17B型4位数字万用表。
b)键盘功能定义
c)指标测试
采用分级调试的方法,分别对双口RAM,DA,以及滤波电路进行了测试。
双口RAM能够正确读写,DA工作正常。
输出的波形也比较好,但是在级联调试的时候发现波形不可以控制,输出的波形频率具有很大的随机性,分析可能是累加器或者是CPLD根本没有接收到单片机传过去的频率控制字。
为了找到问题的所在,我们先不用单片机给CPLD赋频率控制字,而是修改了Verilog程序,让CPLD内部产生一个频率控制字,发现系统能根据设定的控制字输出预计的频率,而不再是随机的频率了,这就排除了累加器有问题的可能性了。
剩下的就只有在传送数据的时候出错的可能性了。
经过仔细检查硬件以及Verilog程序,发现程序里面有一句always语句有问题,本来要生成时序逻辑电路的,结果用的是组合逻辑电路的写法,造成的数据不能按照预计的触发条件传送。
修改之后波形就可以在控制下输出了。
测试最终输出波形的相关数据如下:
表1基本波形的频率测量结果(0.5Hz~200KHz,步进0.5Hz)
预置频率
(Hz)
实际输出频率(Hz)
正弦波
方波
三角波
0.5
0.5
0.5
1
1
10
10.0025
10
50
49.9987
49.9988
50
100
99.9980
99.9976
99.9975
500
499.987
499.988
499.998
1000
999.975
999.975
5000
4.99987k
4.99988k
10000
9.99974k
9.99976k
9.99975k
50000
49.9987k
49.9987k
100000
100.154k
99.9974k
99.9975k
150000
149.996k
149.996k
200000
199.995k
199.995
199.995k
正弦波1KHz
预置值(V)
0.7
1
1.5
1.8
2
2.5
3
3.5
4.0
实测值(V)
0.48
0.68
1.01
1.50
1.79
2.02
2.52
3.02
3.52
4.00
4.5
5.0
4.48
5.05
正弦波200KHz
0.52
0.74
1.12
1.60
1.9
2.12
2.62
3.12
3.60
4.08
4.56
5.10
正弦波0.5Hz
0.70
1.00
1.80
2.00
2.50
3.00
3.5
4.40
5.00
测试仪表数字示波器本身存在测量误差,尤其是在幅度测量中,所测得的峰—峰值为所显示波形中的最大值与最小值之差,这样就会受到噪声的干扰,使得实测数据与预置数据产生一定误差。
同时DAC0832为8位D/A转换器,系统中设定的满量程为4V,其量化误差为
,按满度归一化的相对误差为
另外由于电路本身结构的限制,整个电路的布局和走线引入了一定的噪声和干扰。
四实验总结
1.本系统采用了CPLD作为DDFS的地址累加器,故可以产生很高频率的信号,相比用单片机做地址累加有明显的优势。
2.系统的输出在较高频率时由于运放、D/A的带宽限制,输出幅度有所下降。
以后在做功能扩展时应考虑加入数控放大倍率补偿,消除带宽限制的影响。
系统最终可输出正弦波、方波、三角波三种常规波形,并可通过手写板输出所需任意波形。
输出波形不失真频率范围为0.5Hz~200KHz,步进为0.5Hz,幅度可调范围为0~4V,步进为32分之1V,达到设计要求,且人机交互界面增加了系统的实用性与灵活性。
参考文献:
[1]马忠梅.单片机的C语言应用程序设计.北京:
北京航空航天大学出版社
[2]李朝青.单片机原理及接口技术.北京:
附录:
一、C语言程序
#include<
reg51.h>
absacc.h>
math.h>
#include<
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#definekey10xee/*1(sin)2(squr)3(trig)4(扫频)*/
#definekey20xde/*5678*/
#definekey30xbe/*90.enter*/
#definekey40x7e/*f/vKHzinputshift*/
#definekey50xed
#definekey60xdd
#definekey70xbd
#definekey80x7d
#definekey90xeb
#definekey00xdb
#definepiont0xbb
#defineenter0x7b
#defineshift0x77
#definesetfv0xe7
#defineclear0xb7
#defineKHz0xd7
#definelcdwcomXBYTE[0x1f00]//液晶写指令地址
#definelcdwdatXBYTE[0x5f00]//液晶写数据地址
#definelcdrdatXBYTE[0x3f00]//液晶读数据地址
#defineREG0XBYTE[0xf000]//频率控制字寄存器低8位地址
#defineREG1XBYTE[0xf100]//频率控制字寄存器中8位地址
#defineREG2XBYTE[0xf200]//频率控制字寄存器高8位地址
#defineDACXBYTE[0xe800]//0832地址
#defineIDT7132XBYTE[0xe000+p]//双口RAM地址
sbitdir=P3^0;
//245方向控制端
bitKHzflag=0;
//KHZ键按下标志
bitshiftflag=0;
//shift键按下标志位
bitpflag=0;
//点键按下标志位
bitvflag=0;
//f/V键按下标志位
ucharcountf=0;
//频率输入按键记数
ucharcountv=0;
//电压输入按键记数
uintp;
//地址增量
uchardisbuff[23];
//显示缓存
staticintf[4]={0,0,0,0},v[3]={0,0,0};
//频率值缓存,电压值缓存
floatk=0.0;
//输出频率
voiddelay(intt)//延时程序
{uintj,i;
for(i=0;
i<
t;
i++)
for(j=0;
j<
1000;
j++)
;
}
voidsintable()//正弦波波表
{uinti;
p=0x0000;
2048;
{IDT7132=255*(1+sin((float)i/2048*2*3.14159))/2;
p++;
disbuff[0]='
s'
;
disbuff[1]='
i'
disbuff[2]='
n'
disbuff[3]='
a'
voidsquaretable()//方波波表
{inti;
1024;
{IDT7132=0xff;
}
for(i=1024;
{IDT7132=0x00;
q'
u'
voidtritable()//三角波波表
{
inti;
{IDT7132=(int)(i/4);
{IDT7132=(int)((2048-i)/4);
t'
r'
g'
voidwait()//判忙程序
{ucharx;
bitb=1;
while(b)
{dir=0;
x=lcdrdat;
x&
=0x80;
//屏蔽低7位
if(x!
=0x80)//判断P0.7口是否为1
b=0;
dir=1;
voidsetfunction(uchara,bitj)//写指令程序
{if(j==1)
wait();
lcdwcom=a;
voidinitiallcd()//初始化程序
{delay(15);
setfunction(0x38,0);
//8位数据接口,双行显示,字型大小为5x7,不查忙
delay(5);
setfunction(0x38,1);
//8位数据接口,双行显示,字型大小为5x7,查忙
setfunction(0x0e,1);
//开显示及光标,不闪烁,查忙
setfunction(0x01,1);
//清屏并设置AC为0,查忙
setfunction(0x06,1);
//显示不移位,AC为增量方式,查忙
voidwritecode(uchari)
{wait();
lcdwdat=i;
//将数据写入LCD
voiddissf()//显示scanfrequnecy
{ucharsample1[20]={"
scanfrequnecy"
};
uchari;
16;
writecode(sample1[i]);
voiddisfirst()
{ucharstart[20]={"
PressInput"
writecode(start[i]);
voiddisend()
{ucharsample2[16]={"
END"
writecode(sample2[i]);
voiddisplaybuff()//显示显示缓存中的内容
{uchari;
initiallcd();
setfunction(0x80,1);
23;
writecode(disbuff[i]);
if(i==15)
setfunction(0xc0,1);
voiddiss()//显示波的类型(正弦波)
{uchars[4]={"
sina"
4;
writecode(s[i]);
voiddist()//显示波的类型(三角波)
trig"
voiddisq()//显示波的类型(方波)
squa"
voidkeyprocess(inta,ucharb)//处理键盘中关于电压,频率的按键值
{if(vflag==0)//判断此时是否在输入频率
{f[countf]=a;
//存储频率值
if(pflag==1)//判断小数点有无按下
disbuff[countf+9]=b;
elsedisbuff[countf+8]=b;
countf++;
if(vflag==1)//判断此时是否在输入电压
{v[countv]=a;
if(pflag==1)
disbuff[c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DDS 波形 发生器