实验目标
模拟电路前端工程化第二部分的实战项目的目标是使用串行DAC AD5626设计一款任意波形发生器。设计的要求包括以下几项:
- 搭配单片机或FPGA或其它方式的控制逻辑能够产生10Hz到20KHz范围内的正弦波信号
- 输出信号幅度要达到3Vpp,直流偏移可调1.5V到3.5V
- 使用ADALP2000模拟套件中的器件实现
- 使用套件中的Micro USB适配器通过USB给面包板供电,供电电压为5V
- 使用ADALP2000套件中的运算放大器搭建一个Sallen-Key滤波器,滤除40KHz以上的混叠信号,输出运算放大器也选自ADALP2000套件.
- 运算放大器可从套件中提供的几个型号中选用
- DAC采用AD5626 12bit nano DAC芯片
1.项目前准备
由于本次实验的要求是使用ADALP2000模拟套件中的器件来实现,所以对其中器件的使用十分重要,在ADI的ADALM2000的介绍网站上有很多可供参考的电路实例,可以帮助快速搭建实验电路,验证电路的可行性。这样我们就可以先借鉴官网的设计,熟悉我们要用到的器件的使用方式,然后搭建我们自己的电路。
2.DAC芯片电路搭建
首先,对题目的要求进行分析可以知道,AD5626这颗12bit的nanoDAC芯片在电路中用于产生正弦波信号。参考ADALM中AD5626示例搭建图中的电路。
实物连接如图所示
由于DAC为12位DAC,其数字最大值位4095,供电电压为5V,Vout范围为0到4.095V。使用ADALM2000的模式发生器产生SPI控制信号,输入合适的数据既可以产生相应的电压,在芯片的控制端使用示波器可以的测量到输出电压与控制信号匹配。
以下为测试结果,数据为BFF(3071)时为3V
数据为7FF(2047)时为2V
数据为3FF(1023)时为1V
3.Sallen-Key低通滤波电路搭建
对输出的信号进行滤波,去除其中的高频成分,提高信号的质量,题目中要求设计Sallen-Key低通滤波器,在ADI的官网上可以找到相应的Sallen-Key低通滤波器设计示例,使用OP37搭建滤波器电路。
我们可以对其中的电阻或者电容进行修改,从而在已有的电路基础上,结合套件中电阻和电容的规格来获得满足设计要求的Sallen-Key低通滤波器。这里对使用到的电阻进行修改,R1选为3.7K(2.2K和1.5K串联),R2选为4.7K。在LTSpice中搭建仿真电路,电路的截止频率为38KHz,接近设计要求。
电路的频域仿真结果如图所示
在实际电路中使用不同的信号对电路进行测试。下图为5KHz,5Vpp的正弦信号经过滤波器的波形。
下图为40KHz,5Vpp的正弦信号经过滤波器的波形。
在截止频率处,可以看到信号衰减了50%,与仿真的效果是一致的。
4.直流偏置电路搭建
在得到正弦波信号后,由于AD5626的输出电压可以满足输出信号幅度的要求,只需要对输出信号进行直流偏移即可。直流偏置电压要求为1.5V到3.5V,可以使用单片的DAC或者PWM(FPGA也可以实现)搭配外部电路就可以实现。这里使用PWM配合低通滤波器实现可调的直流电压,文中使用器件的的IO端口输出能力为(0~2.5V),需要搭配运算放大器对电压进行适当的放大,这里选择放大增益为2倍。
搭建完电路后,在LTSpice中对其进行时域仿真,PWM信号为占空比为25%的方波信号,放大器增益系数为2,仿真效果如图所示,2.5V的信号乘以0.25为0.625,放大1倍为1.25V,符合预期。
5.信号合成电路和整体电路仿真
最后,通过运算放大器的正向端将偏置电压和滤波后的信号合成为目标信号输出。在LTSpice中搭建的仿真电路如图所示。
电路的整体时域仿真效果如下所示:
输入的信号叠加直流偏置后,在时域仿真中得到对应的目标信号。
6.驱动程序设计
本次设计使用的控制器件是FPGA,型号为安路的SF1S60CG121I。FPGA的控制程序的构成主要包括以下几个部分,按键处理部分、逻辑控制部分、DDS信号产生部分、PWM波生成部分以及信号幅度控制部分。整体的框图如下图所示:
按键部分对输入按键信号进行滤波后输入到逻辑控制部分。
逻辑控制部分通过对滤波后的按键信号进行上升沿捕获,来切换不同的DDS频率控制字、PWM占空比控制字。
DDS信号产生部分根据不同的频率控制字来产生频率不同的正弦波信号。
DDS幅度控制部分的根据幅度控制字,对DDS信号的幅度进行调节。
具体的模块设计见附件的FPGA工程。
在得到目标的DAC数字信号后,通过SPI总线向DAC发送控制数据,根据AD5626手册中的对芯片的时序介绍,SPI总线的时钟极性CPOL为1,相位CPHA为1,模块设计如下。
module spi_ad5626(
input sysclk,
input reset,
input[11:0] data_dac,
output reg dac_sclk,
output dac_din,
output reg dac_cs,
output reg dac_ld
);
//create 10MHz clock form sysclk
wire clk10mhz;
clk_divide #(.WIDTH(4),.N(10)) divide_10m (.clk(sysclk),
.rst_n(reset),
.clkout(clk10mhz));
//detect changing of control byte and data byte
reg[11:0] comp_reg;
reg data_chg;
//at clk edge to check dac control data changing, assert the data_chg
always @(negedge clk10mhz or negedge reset)
begin
if(!reset) {comp_reg,data_chg}<=0;
else begin
comp_reg<=data_dac;
if(comp_reg!=data_dac) data_chg<=1;
else data_chg<=0;
end
end
//Shift data_reg
reg [11:0] data_reg;
reg [4:0] cnt12;
//When data_reg changing,according to the spec to control the register and IO
always @(posedge clk10mhz or negedge reset)
begin
if(!reset) begin
dac_cs<=1;
cnt12<=0;
data_reg<={12'h0};
end
else if (data_chg) begin
dac_ld<=1;
cnt12<=0;
end
else begin
if(cnt12==0) begin
dac_cs<=0;
cnt12<=cnt12+1;
end
else if(cnt12<13)begin
data_reg<=data_reg<<1;
cnt12<=cnt12+1;
end
else if(cnt12==13) begin
dac_cs<=1;
cnt12<=cnt12+1;
end
else if(cnt12==14) begin
dac_ld<=0;
cnt12<=cnt12+1;
end
else if(cnt12==15)begin
dac_ld<=0;
dac_cs<=1;
end
end
end
wire clk20mhz;
clk_divide #(.WIDTH(4),.N(5)) divide_20m (.clk(sysclk),
.rst_n(reset),
.clkout(clk20mhz));
assign dac_din = data_reg[11];
always @(posedge clk20mhz or negedge reset)
begin
if(!reset) dac_sclk<=1;
else if(!dac_cs) dac_sclk<=!dac_sclk;
end
endmodule
PWM波生成部分根据控制字的不同,产生占空比不同的PWM波,控制字的值越大,占空比越大,对应的偏置电压也就越大,反之亦然。PWM引脚的输出效果如图所示。
1.5V对应占空比为30%,控制字为77
2.5V对应占空比为50%,控制字为128
3.5V对应占空比为70%,控制字为179
7.项目总结
本次项目设计完成了DAC芯片、Sallen-Key低通滤波电路、PWM控制的直流偏置电路、信号合成电路等子电路的设计,并在LTSpice中搭建了仿真电路对其进行整体的仿真,整个电路的供电电路没有设计,FPGA部分的控制程序由于时间的关系没有完成硬件的调试,确实有些遗憾,但是通过这次活动对DAC电路的构成、不同器件的使用、实际电路的搭建,将书本上的知识通过仿真和真实电路的运行,建立起了直观的认知,同时也认识到使用面包板搭建电路可以快速进行验证,而且器件也可以回收,十分适合初学者学习使用,但是由于线材、器件接触等问题,导致运行结果与理论结果偏差大,这种偏差随着电路规模的扩大而增大,而且接线一多,便不好排查问题。
8.参考资料链接
1、AD5626实验Activity:Digital to analog conversion [Analog Devices Wiki]
2、Sallen-Key参考Activity: Active Filtering [Analog Devices Wiki]
3、DC 偏置参考Adding DC Offsets to AWG Outputs: [Analog Devices Wiki]
4、FPGA PWM 程序pwm_verilog [电子森林] (eetree.cn)
5、AD5626 参考程序任意波形产生 [小脚丫STEP开源社区] (stepfpga.com)