一、项目需求
使用串行DAC AD5626设计一款任意波形发生器
- 搭配单片机或FPGA或其它方式的控制逻辑能够产生10Hz到20KHz范围内的正弦波信号
- 输出信号幅度要达到3Vpp,直流偏移可调1.5V到3.5V
- 使用ADALP2000模拟套件中的器件实现
- 使用套件中的Micro USB适配器通过USB给面包板供电,供电电压为5V
- 使用ADALP2000套件中的运算放大器搭建一个Sallen-Key滤波器,滤除40KHz以上的混叠信号,输出运算放大器也选自ADALP2000套件
- 运算放大器可从套件中提供的几个型号中选用
- DAC采用AD5626
二、整体设计思路
- 在本电路中,使用FPGA来产生10Hz到20KHz的正弦信号数据,并将其送入AD5626中产生对应模拟信号。
- 使用OP484搭建一个低通滤波器,滤除40KHz以上的混叠信号。
- 通过AD8226来实现输出信号的幅度的放大以及直流偏移的可调。
- 通过LT1054将从USB口输入的5V电源转换成±8V左右的电源,用以给运放供电,同时使用AD584给AD5626一个基准电压。
三、整体电路框图
四、FPGA系统框图
五、软件部分
5.1时钟模块
在该项目中,为了产生比较高频率的8位可调占空比的PWM波,从而方便后续滤波。因此,在本项目中,使用IP核设置输出时钟信号为120MHz。
5.2 DDS模块
在DDS模块中,需要根据输入的频率控制字计算出相位累加器每个时钟周期需要累加的值,并将累加器的输出作为相位调制器的输入。相位调制器可以根据输入的相位控制字对相位进行调节,从而实现相位的调制。最后,根据相位调制器的输出从波形存储器中读取对应的正弦波数据,并通过幅度控制模块进行幅度控制,生成最终的正弦波信号
5.3 SPI模块
由于FPGA的SPI的IP核为8或16位的SPI,无法实现12位的SPI通信,因此需要自己写一个12 SPI通信的模块。根据AD5626模块的数据手册可以看出,该模块串行通信利用的是12位的SPI通信,同时根据其时间可以计算出其SCK最大的速率为16MHz左右,但是实际测试时发现,12MHz的时钟速率偶尔会出现问题,将时钟降为6MHz,该问题消失,因此在该项目中通信使用的时钟为6MHz。
always@(posedge clk)
begin
if(spi_en==0)
begin
bit_cnt<=20;
end
else
begin
case(bit_cnt)
0:begin cs<=0;ldac<=1;bit_cnt<=1; end //使能主机发送
1:begin mosi<=data[11];bit_cnt<=2; end
2:begin mosi<=data[10];bit_cnt<=3; end
3:begin mosi<=data[9];bit_cnt<=4; end
4:begin mosi<=data[8];bit_cnt<=5; end
5:begin mosi<=data[7];bit_cnt<=6; end
6:begin mosi<=data[6];bit_cnt<=7; end
7:begin mosi<=data[5];bit_cnt<=8; end
8:begin mosi<=data[4];bit_cnt<=9; end
9:begin mosi<=data[3];bit_cnt<=10; end
10:begin mosi<=data[2];bit_cnt<=11; end
11:begin mosi<=data[1];bit_cnt<=12; end
12:begin mosi<=data[0];bit_cnt<=13; end
13:begin cs<=1;ldac<=0;bit_cnt<=14; end
default:begin cs<=1;ldac<=0;bit_cnt<=0; end //关闭发送
endcase
end
end
六、电路设计
6.1 滤波电路
为了保证输出信号不发生衰减同时滤除40KHz以上的混叠信号,因此我们选用了通带最平坦的巴特沃斯型滤波电路。由于20KHz和40KHz过于接近,为了在20KHz时几乎不衰减,而40KHz有足够的衰减,至少需要7、8阶的滤波器,需要的滤波器阶数过高。因此我们可以设置滤波器参数为在20kHz时衰减为-0.1dB,在40KHz时衰减为-10dB。
之后,可以使用ADI官网上的滤波器设计软件Analog Filter Wizard,填入所需参数,可以得到相应的滤波器电路。
6.2 PWM滤波电路
为了使用FPGA直接控制最后输出的正弦信号的直流偏置,因此可以使用FPGA产生PWM波,然后再通过无源低通滤波器,将其滤为直流信号,然后通过调整PWM波的占空比就可以调节直流信号的的大小,之后就可以通过该直流信号控制最后输出的直流偏置。
由于一阶无源低通滤波器所需要的RC过大,因此使用2阶的无源低通滤波器。
设计二阶无源低通滤波器,截频我们可以直接根据以下公式,计算得到
f=0.37/2πRC
因为FPGA的输出高电平为3.3V,同时在FPGA内部设置的PWM占空比寄存器为8位寄存器,这说明其占空比的调节精度为1/255,所以直流信号调节的精度为3.3/255,约为12mV。
同时由于在本项目中FPGA通过PLL核产生的时钟频率为120MHz,因此FPGA产生额最大的PWM的频率为120M/255,大约为400kHz。根据该PWM频率和二阶无源低通滤波器,我们可以设计得到以下的滤波电路
6.3 放大电路
考虑到直流偏置的要求,因此,选用了AD8226差分运放,将信号从IN+输入,就可以通过IN-与REF两个引脚共同调节直流偏置的值。由于最后输出的电压幅度至少为3V,而AD5626输出的电压幅度最大也只能到2V左右,因此需要经过一个放大电路,通过AD8226的手册我们可以知道,该放大电路的放大倍数为
G=(1+47.9KΩ/Rg)
因此在该电路中Rg=51KΩ,以保证能够输出足够大的电压,如果需要调小电压可以在FPGA中调小幅度控制寄存器的值,从而输出需要的电压幅度。
此处在IN-引脚处接了一个电位器以便于来调节直流偏置的大概范围,然后在REF处与FPGA产生的PWM波得到的直流信号相连接,可以直接通过调节PWM的占空比从而调节直流偏置的具体值。
6.4 5V电源转±8V电源电路
由于AD8226最后输出的最大电压为6.5V,5V电压无法满足要求,因此使用LT1054将5V电压转换成±8V左右的电压。具体电路参考ADI提供的器件手册上的电路,由手册上的公式可知,该电路在输入为5V时输出电压
Vo=2*5-2*0.7-VL
经过实际测试可以知道,该公式中的VL大约为0.2-0.3V,因此该电路输出为略大于8V的正负电压。
6.5 5V基准源电路
在该电路中,需要给DAC一个参考电压,由于使用micro USB输入的5V电源噪声过大,因此使用AD584产生的5V基准源给DAC一个参考电压。根据AD584手册在CAP和VBG两个引脚之间连接了一个0.01uF的电容,该电容可以降低该基准源的带宽,从而减少输出电压中的高频纹波。
七、仿真及测试截图
7.1 2V直流偏置
7.2 3.5V直流偏置
7.3 1V直流偏置
7.4 40KHz频率
八、主要难题
在本次项目中,难点主要在于LT1054的电源电路,该电源电路在LTSPICE仿真时,输出负电平电压与实际测试不符,而面包板上搭建测试时,输出存在极大的噪声,难以去除。因此最后决定画PCB板,以获得更好的噪声性能。
其次是本次使用的AD5626芯片,该芯片通信是一个12位的SPI通信,但是由于FPGA内部的SPI核不支持12位的SPI通信,因此必须自己写一个SPI通信相关的Verilog代码,同时由于AD5626支持的最高时钟速度较慢,因此必须使用分频模块,以降低SPI时SCK的速率,从而来实现该通信。
九、改进方向
在本次项目中,由于在画PCB板的时候,没有估计好FPGA与其余电路的连接,因此在需要复位的时候需要将FPGA取下,使用杜邦线与其连接,在之后可以对其进行改进,在两侧分别多加一排引脚,将其所有能够使用的引脚都向外引出。这样也可以通过外接更多的按键或者通过上位机来对FPGA输出的正弦波信号作出需要的调节。
其次,在该电路中由于时间以及设计时考虑不够周到的缘故,使用的滤波器阶数比较低,难以完全将40KHz以上的混叠信号滤除,应该使用更高阶滤波器,以便更好的滤除40KHz以上混叠的信号。