您现在正在浏览:首页 > 职教文章 > 职教论文 > 用AVR单片机制作DDS信号源

用AVR单片机制作DDS信号源

日期: 2011/8/20 浏览: 89 来源: 学海网收集整理 作者: 佚名

用AVR单片机制作DDS信号源

近年来,DDS(Direct Digital Frequency Synthesis直接数字频率合成器)技术日趋成熟,DDS芯片以其较高的性价比而被广泛采用:DDS相对带宽较宽、频率转换时间短、频率分辨率高、输出相位连续,可产生宽带正交信号及其它多种调制信号,有全数字化、控制灵活方便的优点,已广泛应用于通讯、导航、雷达、遥控遥测、电子对抗以及现代化的仪器仪表工业等领域。本文以AD9851为例介绍了一种常用DDS芯片(AD985X系列)的控制方法,并配合AVR单片机ADC和PWM接口完成一定频率范围内的AGC(自动增益控制)功能,还可模拟FM调制,采用LCM1602作为显示器件,操作直观简便,性能稳定。

DDS简介:

DDS的基本原理是利用采样定理,通过查表法产生波形。DDS的结构有很多种,其基本的电路原理可用图1来表示。

图1

相位累加器由N位加法器与N位累加寄存器级联构成。每来一个时钟脉冲fs,加法器将频率控制字K与累加寄存器输出的累加相位数据相加,把相加后的结果送至累加寄存器的数据输入端。累加寄存器将加法器在上一个时钟脉冲作用后所产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位,相位累加器的溢出频率就是DDS输出的信号频率。 用相位累加器输出的数据作为波形存储器(ROM)的相位取样地址,这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出,完成相位到幅值转换。波形存储器的输出送到D/A转换器,D/A转换器将数字量形式的波形幅值转换成所要求合成频率的模拟量形式信号。最后用低通滤波器滤除不需要的取样分量,以便输出频谱纯净的正弦波信号。

工作原理:

电路原理如图2所示,可分为四个部分:以IC1为核心的DDS;以IC2为核心的键盘、显示及控制电路;以IC3为核心的AGC电路;以IC4为核心的检波电路。上电后,ATmega16复位,之后对AD9851初始化并使其输出最后一次设置的频率,AD9851输出的信号经C6~C10及L1、L2组成的滤波网络送入AD603。这里采用了AD603的典型接法,1脚和2脚的电压差决定了AD603的增益,如果1脚的电压大于2脚的电压,则AD603处于放大状态,差值越大增益越高;反之1脚的电压小于2脚的电压AD603将会衰减输入信号,增益控制灵敏度为25mV/dB。AD603的输出信号的一路由D1、R12、R13、C17组成的电路检波后经LM358直流放大送入ATmega16的模/数转换通道0,即ADC0,其中R10、R11、D2组成钳位电路使D1刚好导通,稳压二极管DW用于保护ADC0,防止对其输入过高电压。ATmega16将从ADC0采样到LM358的输出电压与内部预先设置好的数值进行比较,如果比设置值大,说明AD603增益过高,则ATmega16的PD5脚输出的PWM脉宽变宽,经三极管V构成的滤波电路后输出的直流电压降低,即AD603的1脚与2脚电压差减小,AD603的增益下降,输出信号的幅度减小,然后ATmega16再对其采样,直到与设置值相等PWM脉宽就不再变化。

图2

软件设计:

编译环境选用CodeVesionAVR,它有丰富的库函数可以调用,使源代码简化。

控制AD9851

AD9851的控制字共40位W0-W4,其中低32位Freq-b0~Freq-b31为频率控制字,用于控制DDS的输出频率。AD9851的串行模式下,第一个写入的位是Freq-b0,最后一个写入的位是Phase-b4。

下面程序中,“dds”和“freq”都是长整形变量,“freq” 是想要设置的

dds=23.860929422*freq;

频率值,“dds”是将要写入AD9851的值。这是因为DataSheet指出(=十进制32位频率控制字,表示系统时钟,这里是30MHz6=180MHz),因此。如果您对计算结果不放心,可登陆AD公司官方网http://designtools.analog.co m/dtDDSWeb/dtDDSMain.aspx?part=AD9851模拟验证,验证前务必正确设置参数。

以下是将预置频率写入AD9851的参考程序:

void write_dds(unsigned long dds)

{

unsigned char i;

load=0; //准备输入数据

clk=0;

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

{

clk=0; //模拟同步时钟

delay_us(2); //延时,这个时间还可以更小

if((dds&0x00000001)||(i==32)) //取数据,6倍频使能

{dat=1; //数据输出

}

else dat=0; //数据输出

clk=1; //模拟同步时钟

delay_us(2);

dds=dds>>1; //准备输出下一位

}

load=1;

clk=0;

delay_us(2);

load=0;

}

在高8位W0中,第0位用于设置是否打开芯片内部6倍频功能,为了降低PCB设计难度,本系统使用了该功能,故写入控制字时将该位置1;第1位总是置0;第2位置1可以使AD9851进入低功耗模式,此时AD9851不工作;第3位到第7位Phase-b0~Phase-b4是5位相位控制字,相位步进是。

AD9851工作前必须对其进行初始化,本系统中ATmega16与AD9851采用串行通信方式,故要将AD9851设置成串行通信方式。AD9851上电后默认为并行通信方式,如果此时将AD9851的D7~D0置为二进制数XXXXX011,就相当于将此数据作为W0写入AD9851,从图2可以看出D7~D0被设置成00000011;紧接着依次往W_CLK和FQ_UD

端输入宽度约1S的高电平脉冲就可以使AD9851工作在串行模式下。

AGC控制

这里实际上就是采用环路反馈方式根据ADC0的输入电压控制10位PWM的输出,与数控电源的控制原理完全相同(参见第5期“用ATmega8做的稳压电源”),因此不再赘述。值得注意的是,检波电路对不同频率的检波效率不一样,即频率较低时检波效率低,频率较高时检波效率高。简单的说,假定检波器的输入信号幅度不变,1MHz时的输出电压小于20MHz时的输出电压。因此,简单地比较ADC0的电压与ATmega16内部设置好的数值并控制AD603将不能得到恒定幅度的输出,必须对已设置的数值进行矫正再与ADC0电压比较。可以先在程序上使ADC0的电压与内部设置好的数值比较,测量输出信号在1MHz~20MHz(频率范围可以更宽)等间隔的数十个频点的幅度,一种做法是根据这些数据拟合出一条矫正曲线并用近似的方程表示,这样就可以得出矫正后的数值;另一种简单的做法就是分段矫正,将输出频率划分为数十个等间隔的频率段,对不同频率段乘以事先算好的矫正系数即可,这种办法简单易行,故为本机所用,缺点是控制精度稍差。

键盘与LCD控制

键盘采用动态扫描方式工作,由外中断0激活。PD0~PD3输出扫描信号,PD4~PD7处于高电平守侯状态并读入键值。PD4~PD7分别接由D3~D6构成的四输入与门,一旦有按键按下与门输出低电平使ATmega16产生中断,从而激活键盘并返回键值。LCM1602采用四线驱动方式工作,ATmega16读入的键值以对应的字符存放在数组中,每按一次按键将数组内容显示一次,按S16(输入完毕)就调用atol函数将数组转换为长整型再写入AD9851并写入EEPROM就可完成一次输出频率的变更。

4、模拟FM调制

模拟FM调制利用了AD9851频率转换速度快的特点。出于实验的目的,本程序只能输出中心频率为10MHz的FM信号。计算出调制正弦波等间隔20个点(即采样20个点)对应的FM频点频率,然后依次向AD9851写入这20个点的频率,写入的时间间隔不同,则调制信号的频率不同。

安装与调试

AD9851的布线非常重要,应采用星形接地方式供电,右图是一个参考PCB,采用贴片元件,由于电路比较简单,图中没有标注元器件名,读者可根据图2焊接,其他部分电路的布线没有特殊要求。图2中没有给出ATmega16的程序下载线,电路焊接完毕后,将ATmega16的ISP插座搭焊在电路上,程序烧录完毕后将其移除即可。开机后LCD应显示“DDS”字样,然后输入频率并按S16结束,当键入的频率在1MHz--20MHz范围内,输出信号的峰峰值为1V左右。最低键入的频率为1Hz,最高为70MHz,最小分辨率为1Hz,由于AD603随输入频率的升高放大能力会变差,所以50MHz以上的输出幅度非常小。按S15可输出中心频率为10MHz,频偏为10KHz,调制信号约6KHz的FM信号。


用AVR单片机制作DDS信号源.doc

返回顶部