本设计的主要目的是利用低功耗AD5626来实现一款任意波形发生器,其性能指标定义如下。考虑元件种类与板卡限制,在此处对部分指标进行了调整,比如LPF截止频率变为50KHz,直流偏置1.5V~3.3V。
-
信号为正弦波,频率10Hz~20KHz,幅度3Vpp
-
单电源5V供电
-
直流偏置可调,范围1.5V~3.5V
-
模拟滤波器截止频率为40KHz
故整体的设计框架展示如下图,主要使用到的器件包括XO2-4000HC核心板、AD5626、OP484以及阻容若干。
实物图展示如下,从上到下依次为核心板、DAC与运放,信号通过杜邦线进行连接。
波形产生
本设计要求的信号波形为正弦波,频率为10Hz~20KHz。在本设计中利用FPGA使用直接数字频率合成的方式通过查找表来实现信号的产生,其中AD5626的通信频率为12MHz,DDS的相位累加字长度为20Bit,采样率为500KHz,具体分析如下。
查阅AD5626的数据手册,发现该芯片的SPI最高通信速率为20MHz,又因FPGA核心板的晶振为12MHz。故在此选用12MHz作为SPI通信的时钟,通过计数器将其进行24等分,其中计数值为0~11时通过SDAT进行DAC数据的写入,计数值为12时拉低LDAC将数据传输到DAC的模拟端。
指标中规定信号的最低频率为10Hz,即表明信号的最小分辨率需要小于等于10Hz,该分辨率由DDS模块的工作频率与相位累加字长度共同决定。本设计中相位控制字宽度为20Bit,对应的频率精度为0.47Hz,满足指标要求。指标规定信号的最高频率为20KHz,由奈奎斯特采样定理可知DAC的采样率需要大于等于40KHz才不会造成混叠。在本设计中DDS的工作频率与DAC更新数值的频率相等,即为500KHz,满足指标要求。
整个工程主要分为三个部分,即DDS波形发生、AD5626控制与PWM直流偏置产生,下文予以分别介绍。
DDS波形发生
DDS是一种纯数字的波形合成技术,通过控制相位累加字来实现查找表中波形的读出,其主要包含查找表与相位控制器两部分。
查找表的数据内容记录着需生成的信号波形数据,在本文中通过MATLAB进行生成,并剔除掉波形重复的部分以节约空间。具体实现的代码记录如下,读者也可生成coe文件直接写入ROM来实现波形的存储。
close all; clear; clc;
N=12;
t=0:1/256:1-1/256;
y=sin(2*pi*t);
y_dec=2^(N-1)*(y/max(y));
for index = 1:64
dec2hex(round(y_dec(index)),3)
end
plot(t,y_dec)
相位累加器的作用主要是实现对查找表中数据输出的控制,通过控制相位来间接控制频率。如前文所述信号的分辨率与系统频率、相位控制字宽度相关,在指定系统频率500KHz,相位控制字宽度20Bit时得到频率精度为0.4768Hz。因此相位累加字的数值与频率的关系可以转换为与精度倒数的关系,即约为频率的2.097倍,在本设计中通过数据移位相加来实现近似的计算。
module dds(
input sys_clk,
input sys_rst_n,
input [15:0] dac_freq,
output [11:0] dac_out
);
reg [19:0] dds_phase;
wire [19:0] dds_phase_add;
assign dds_phase_add = (dac_freq << 1) + (dac_freq >> 4) + (dac_freq >> 5);
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
dds_phase <= 20'd0;
end else begin
dds_phase <= dds_phase + dds_phase_add;
end
end
lut inst_lut(
.address(dds_phase[19:12]),
.cos(dac_out)
);
endmodule
AD5626控制
AD5626的数字逻辑控制主要通过单线SPI协议实现,其用于控制的脚主要包括SCLK、SDIN、CLR#、LDAC#与CS#。其中CS#用于芯片的片选,低电平有效,本设计中仅在传输数据时拉低;CLR#用于DAC输出的清零,低电平有效,在本设计中常拉高;LDAC#用于数据移位寄存器到DAC模拟输出的信号,在本设计中数据数据传输完成后拉低一个时钟周期。其详细的时序图如下所示,摘录自AD5626数据手册。
该芯片的控制逻辑较为简单,其Verilog代码实现如下,即在数据有效时拉低CS并传输数据,数据传输完成后拉低LDAC进行模拟量输出。
assign dac_sclk = sys_clk;
assign dac_ldac_n = (cnt == 12) ? 1'b0 : 1'b1;
assign dac_sdat = (cnt <= 11) ? dds_out[11-cnt] : 1'b0;
assign dac_cs_n = (cnt <= 11) ? 1'b0 : 1'b1;
直流偏置产生
本部分的功能通过PWM DAC实现,通过控制PWM占空比来实现直流量的控制,再通过RC低通滤波器最终得出直流分量。具体实现代码如下所示,本设计的PWM周期为120KHz,可控占空比为0~100%。
module pwm_dac(
input sys_clk,
input sys_rst_n,
input [7:0] duty,
output pwm_out
);
reg [7:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
cnt <= 8'd0;
end else if(cnt < 99)begin
cnt <= cnt + 1'd1;
end else begin
cnt <= 8'd0;
end
end
assign pwm_out = (cnt < duty) ? 1'b1 : 1'b0;
endmodule
波形调理
如前文所述,我们已经通过FPGA配合AD5626产生了一个合适正弦波信号与直流偏置。在本小节中,我们主要进行波形直流偏置的添加与低通滤波两部分操作。
直流偏置
我们通过PWM DAC输出了一个可控的直流分量,其中PWM的周期为120KHz,在此我们使用一个低频的RC滤波器来滤除交流信号。在本设计中该RC滤波器的电阻阻值为10KΩ,电容容值为1uF,计算而得的截止频率为15Hz,可有效滤除交流信号保留直流分量。在得到直流分量后由于阻抗的问题无法方便地连接后级电路,故在此我们添加了一级电压跟随器使得其可以将较大输入阻抗转换为较小的输出阻抗。
添加直流偏置的电路原理图如下图所示,其中输入添加了一个隔直电容使得后级可以方便地调节偏置,由于R2与R3相等,故本电路的增益恒为1;直流偏置通过运放的同相输入端输出,并通过R6接地,故输入交流信号的偏置可以较为方便地调整。注意在本电路中R6=R2//R3,这样做的目的是保持同向反向对称,进而将运放输入失调电流带来的误差尽可能地缩小。
该电路的瞬态仿真波形图如下所示,其中红色波形为输入的信号源波形,绿色波形为U1输出端的信号波形,可以很明显地观察到信号被叠加了一个3.5V的直流偏置。通过改变Voffset的大小,信号的直流偏置也相应地改变。
低通滤波
DAC直接输出的波形由于存在量化台阶,这就使得输出信号的频率中包含大量的高次谐波。同样地,我们也可以在频谱中观察到信号以采样频率为周期的镜像,这些杂散频率都对最终输出的信号波形造成性能影响。在实际设计时,我们可以借助ADI的DDS仿真工具来观察信号的杂散频谱并通过添加滤波器来提高信号质量。
在本设计中,我们通过一个40KHz的低通滤波器来实现杂散频率的滤除。其中该滤波器的拓扑结构指定为Sallen-Key结构,该结构中的运算放大器被连接为电压跟随器,故对运放的GBW要求较低,可以实现较高频率的滤波器设计。该滤波器的设计使用TI FilterPro辅助进行,其中滤波器类型选定为巴特沃斯型,阶数为2阶,最终设计出的有源滤波器原理图与幅频响应如下图所示:
由于该理想值在套件中并不存在,因此需要我们通过LTspice进行仿真微调,微调后的电路原理图与交流特性如下图所示,该电路的截止频率为50KHz。
波形测试
波形测试通过ADALM2000进行,主要测试PWM占空比、PWM DAC输出直流量、AD5626输出正弦波波形、被叠加直流分量的正弦波波形与频谱、滤波后输出的正弦波波形与频谱。
PWM波形测试,占空比设定为67%:
PWM DAC输出直流量测试,占空比为67%时对应的直流量为2.2V:
AD5626输出正弦波波形,包含2V的原始直流偏置:
被叠加直流分量的正弦波波形与频谱,67%占空比时的直流偏置为2.2V:
滤波后输出的正弦波波形与频谱,滤波器截止频率为50KHz: