开篇:润墨网以专业的文秘视角,为您筛选了一篇基于DDS的可程控信号源的设计和实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘 要: 基于AD7008和AD7520芯片设计了一个可程控信号源,只需通过电脑设置发送控制命令参数,就能够产生频率和幅度符合要求的数字检测信号。详细介绍了该方案的软件和硬件的设计要点以及在调试中应注意的问题。调试结果及实际应用表明该信号源工作稳定,精度较高,频率、幅度控制都非常便利,在电子设备的电路板故障检测中起到了很好的作用。
主题词: 程控信号源; AD7008; 频率控制; AD7520; 幅度控制
中图分类号: TN710?34 文献标识码: A 文章编号: 1004?373X(2014)15?0079?04
Design and implementation of programmable signal source based on dds
ZHANG Feng, LIU Qing?feng
(Unit 91413 of PLA, Qinhuangdao 066000, China)
Abstract: A programmable signal source with AD7008 chip and AD7520 chip was designed. By sending the control command parameters through PC settings, the digital detection signal meeting the requirements of frequency and amplitude can be generated. The key points of the software and hardware design on the program and their debugging cautions are introduced in this paper. The debugging results and actual application prove that the signal source works stable, and has high accuracy, convenient frequency and amplitude control. It has played a important role in fault detection of circuit boards.
Keyword: programmable signal source; AD7008; frequency control; AD7520; amplitude control
很多电子设备在检查电路板故障时,都希望使用由电脑自动控制频率、幅度变化的信号源。虽然利用信号发生器芯片(MAX038),再加上切换开关、电阻等元器件,也能够控制幅度和频率的变化,但通过这样的控制结果是离散的,电路连接复杂,操纵使用也十分麻烦,而如果通过数字直接合成芯片(AD7008)和D/A转换芯片(AD7520),组合成可控制信号源,可很方便产生调频波、调幅波、方波及正弦波等,并且产生的信号非常准确,由电脑控制其幅度和频率,调节起来十分便利。
1 电路总体设计
PC机一般为插卡结构,为了在设备电路板检测故障中好用、易用,在设计信号源时要考虑适应PC机,尽量设计成插卡式的。PC机通过接口连接,发送控制命令,使电路发出幅度和频率符合要求的信号信息,即通过数字直接合成芯片AD7008,产生频率符合要求的正弦信号,然后再将信号传输到AD7520构成的数控衰减电路,通过此电路就可以控制输出信号的幅度大小,就能够得到频率和幅度可调节的信号。电路框图如图1所示。
图1 信号源硬件框图
2 器件简介
ADI公司的AD7008器件由可编程DDS系统、高性能10位DAC及与计算机串行、并行接口和控制电路组成,利用了先进的直接数字合成(DDS)技术,能实现全数字编程控制的频率合成器。接上控制时序的晶振,产生精确的时钟信号,AD7008可发出一个模拟正弦波输出信号,该信号的频率和相位都可编程控制调节[1]。如果要更进一步控制,还可以对此信号进行调频、调相或幅度控制。该输出信号可直接作为频率可变化的信号源或转换成方波信号。AD7008的主要性能指标如下:
可以用并行口或串行口直接输入频率、相位、调幅幅度等控制参数;内含32位可编程频率寄存器;集成有10位D/A转换器;采用CMOS低功耗工艺;可通过人机设定或为硬件降功耗方式;最大输出电流20 mA、最大输出电压为1 V;单一电源(+5 V)供电;设计有44脚的PLCC封装。
AD7008芯片的引脚,主要有地址线、数据线、DAC输出、参考时钟输入引脚、寄存器组选择、频率更新引脚、复位信号及系统同步时钟引脚等。
AD7008芯片的结构见如图2所示。它主要由三个部分组成:一是包括一个32位的相加累加器、一个余弦/正弦表、一个10位的D/A转换器和两个频率、一个相位及两个幅度调节单元等组成的可编程DDS数字合成系统;二是一个命令寄存器和两个幅度寄存器用于控制AD7008芯片的工作模式(用于调节I及Q幅度)等;三是控制电路和并、串行接口等,与计算机接口实现对相位、幅度和频率调节寄存器等的修改、写入。
图2 AD7008芯片的系统结构图
3 具体电路设计和频率、幅度的控制
3.1 基于AD7008的可程控信号源的SCH图
图3是由AD7008和计算机接口组成的实际电路。AD7008与计算机之间采用并行8位的接口。锁存器74LS273与AD7008连接,通过锁存器输出信号到TC0~ TC3,RESET,LOAD,SLEEP和FSELECT等对AD7008进行控制。当SLESECT=0或SLESECT=1,就能通过输出频率决定FREQ0寄存器的值或FREQ1寄存器的值;TC0~TC3是传输地址控制总线,它的作用是数据传输过程中使用目的、源寄存器[1]。LOAD引脚作用是数据装载允许,当高电平时,TC3~TC0总线选中的寄存器,允许写数据。SLEEP引脚作用是低功耗休眠控制,高电平时,AD7008进入低功耗休眠。内部时钟停止,同时DAC电流源关闭。RESET的作用就是寄存器复位,高电平时,所有寄存器复位为零,同时不能输出信号。经过DAC转换,电流信号成为电压信号,通过低通滤波器和射随器,输出为正弦或调频调幅信号。FREQ0或FREQ1的值为频率指数,决定信号的频率,FREQ0,FREQ1的字长是32位,通过8位并行口4次输入,按高位到低位的顺序传送[2?4]。
3.2 频率控制
本设计采用时钟为20 MHz,字长为32位。因此最小频率为:
[FL=20×106232]
最大频率为:
[FM=1(4T)=FCLK4=5 MHz]
由:
[F=KFL=K×20×106232]
得到:
[K=F×232(20×106)]
[K]值取整,通过8位并行口送入FREQ0或FREQ1中,就可以对信号的频率进行控制。幅度和相位调节与上述类似,都是通过将调节值送入对应的寄存器控制。
3.3 幅度控制
幅度控制基于ADI公司的AD7520来进行设计,该器件是单片10位16引脚双列直插式封装的乘法型模/数转换器。采用先进的CMOS及薄膜工艺,能够提供10位精度,并与TTL/DTL/CMOS兼容。AD7520工作电源为[+5~+15 V,]包括梯形网络在内的功耗20 mW。由AD7520构成的数字控制的衰减器电路如图3所示。根据图3中AD7520的部分所示电路,LF353的2脚输入电流的表达式如下:
[I01=IREF(D12-1+D22-2+…+D102-10)]
将[IREF=VREFR,][VREF=VIN]代入上式得:
[I01=VIN(R(D12-1+D22-2+…+D102-10))]
采用运算放大器将输入的电流转换成电压,再输出,得到LF353的输出电压[VOUT]为:
[VOUT=-I01R]
将表达式[I01]代入,得:
[VOUT=-VIN(D12-1+D22-2+…+D102-10)]
可见输入电压经过该电路后受到衰减后输出,随着[D1~D10]的值的不断改变,输出电压也随之进行变化。输出电压和输入电压最大值相当,输出电压最小值与输入电压的[11 024](衰减可达60 dB)相当。本设计是通过74LS273锁存器输出信号,来控制AD7520的衰减量。因此由电脑向74LS273内写入不同参数的方式就能够对衰减量进行控制[5]。
4 程序设计
通过C语言编程设计,总体设计策略是[6]:首先输入频率、幅度,计算幅度控制字和频率指数;把频率指数[K]值传输到AD7008的32位并行口寄存器;然后设置频率寄存器的地址;传输幅度控制字到幅度控制字寄存器中;最后把[K]值装载入频率寄存器,产生信号[7]。该编程设计已在BC5.0环境下成功编译,程序源码如下:
/*------system("send1.exe PORT BYTE.BY");------*/
#include
#include
#include
#include
#include
void signal(int fr1b4,int fr1b3,int fr1b2,int fr1b1,int am1-2,int am1-8)
void sglres()
void main()
{
sglres()
signal(30000,0x3ff);
adjust(0x10);
}
void sglres() /*AD7008芯片复位控制*/
{
outport(0x212,0xff);
outport(0x212,0xff);
outport(0x212,0xff);
outport(0x212,0x00);
outport(0x212,0x00);
outport(0x212,0x00);
}
void signal(unsigned long f?value,unsignal int am?value)
/*设置AD7008输出信号频率及AD7520对信号的衰减量*/
{
unsigned int fr1b4,fr1b3,fr1b2,fr1b1,am1?2,am1?8;
unsigned long k1,k2,k3;
k1=(f?value*0x800000)/10000000;
fr1b4=int(k1/(0x10000000));
k2=k1?fr1b4*(0x10000000);
fr1b3=int(k2/(0x10000));
k3=k2?fr1b3*(0x10000);
fr1b2=int(k3/(0x100));
fr1b1=k3?fr1b2*(0x100);
if am?value>0x3ff am?value=0x3ff;
if am?value
am1?2=int(am?value/(0x100));
am1?8=am?value?am1?2*(0x100);
sglres();
outport(0x212,0xff);
outport(0x212,0x00);
outport(0x216,0x00);
outport(0x212,0x04);
outport(0x212,0x00);