基于ADALP2000的实现AD5626DAC模拟设计
此项目主要基于ADALP2000 器件搭建 AD5626 实现DAC 及直流偏置控制
标签
DAC
模拟
模拟电路前端
AD5626
直流偏置
xinshuwei
更新2023-05-09
997

• 项目描述

此次项目主要是基于AD5626实现一款任意波形发生器

1.使用ICE40UP5K及stm32g01 核心板实现逻辑控制,从而产生10Hz到20KHz范围内的正弦信号

2.使用ADALP2000套件中的AD8542实现四阶Sallen-Key滤波器,滤除40KHz以上的混叠信号。

3.输出运算放大器进行直流偏置调整

整体设计框架如下:Fjd1qxQsV0kS_-6PuS-28pRPNiEE

MCU功能实现

mcu主要通过gpio中断实现EC11按键、左旋转、右旋转、按钮的消抖输入控制,然后同时通过SPI进行OLED的显示控制,中文显示通过取模软件进行显示,其他使用英文进行直接显示。所有设置完成后,通过EC11 中间的btn 进行参数设置发射,mcu通过spi发送给FPGA,FPGA通过SPI的解析实现频率、直流偏置的调整。

DSP功能实现

dsp主要由DDS模块、SPI接收模块、PWM模式发生器、AD5626驱动模块构成

DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域。DDS主要由相位累加器、相位调制器、波形数据表组成。

DDS的工作过程:

其中相位累加器由 N 位加法器与 N 位寄存器构成。每个时钟周期的时钟上升沿,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果又反馈至累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。即在每一个时钟脉冲输入时,相位累加器便把频率控制字累加一次。
相位累加器输出的数据就是合成信号的相位。相位累加器的溢出频率,就是DDS输出的信号频率。相位累加器输出的数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器里的波形采样值经查表找出,完成相位到幅度的转换。波形存储器的输出数据送到D/A转换器,由D/A转换器将数字信号转换成模拟信号输出。

此次项目中使用了32位相位累加器,在DAC 更新参数时,触发波表数据的读取。波表的读取通过ROM模块实现,mem文件通过下面的python脚本产生。

import matplotlib.pyplot as plt
import numpy as np
ADDR_Bit = 10
Data_Bit = 12
P  = 0
Fs = 2**ADDR_Bit ## sample cnt
t= np.linspace(0,(Fs-1)/Fs,Fs)
#DC = 2**(Data_Bit-1)


DC = 1500
Gain = 1500 
#Gain = 2**(Data_Bit-1)
sin_singal = Gain*np.sin(2*np.pi*t+np.pi*P/180)+DC
plt.figure(1)
plt.plot(sin_singal)
out_signal = []
outfile = open("sin_wav_4096.mem",'wt')
for i in range(Fs):
    outdata = int(np.ceil(sin_singal[i]))
    out_signal.append(outdata)
    outfile.write("%X\n"%outdata)
outfile.close()
plt.figure(2)
plt.plot(out_signal)

相位累加器代码如下:

reg [31:0] phase_acc; //phase cnt

wire[11:0] squre_da;
assign  squre_da = phase_acc[31]?8'hff:0;
//rom addr
assign rd_addr_o = phase_acc[31:22];

//phase addr
always @(posedge da_dac_o or negedge rst_n_i) begin
	if(rst_n_i == 1'b0)
		phase_acc <= 31'b0;
	else begin
			phase_acc <= phase_acc + freq_set;
	end
end

 

PWM模块代码如下: duty 范围0-100 这里通过电路计算主要使用25-35.

module PWM(
clk,
rst_n,
duty,
pwm_out
);
input clk;
input [6:0]duty;
input rst_n;
output reg pwm_out;
reg[7:0] count;

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin pwm_out<=0;count<=8'd0;end
	else begin 
		if(count>=8'd100) count<=8'd0;
		if(count<8'd100) count<=count+8'd1;
		if(count<duty) pwm_out<=1'b1;
		if(count>=duty)pwm_out<=1'b0;
	end
end
endmodule

PWM产生1MHz的正弦波,占空比可调,通过两阶RC滤波后滤除高频分量产生直流信号,下图是通过ltspice进行仿真的波形,其中绿色代表PWM产生直流的波形。

FhdzMQX44qwNBtetAjUiD_GO4JnS

FPGA整体框图如下:

FsVKx3q_SwMk9oRIg6w3JlX4jpgK

模拟电路部分实现

模拟部分主要由 电源模块、滤波模块、DAC模块、直流偏置调节模块组成。

电源模块主要由5V 3.3V  1.65V 三种电源组成 ,5V 通过usb 进行输入,3.3V通过ams1117 3.3 三端稳压长生,1.65V通过电阻分压产生,然后通过电压跟随器提高输出能力。

FlfZ986evH40kCV0y05gtlEvXyGy

pwm模块主要是通过FPGA产生的pwm波经过两阶RC滤波后产生-40db的低通滤波滤除高频成分,产生直流信号,然后通过运放电压跟随器输出直流电压

Fgg7OvFDXFAxbjz7ToT_9-gKP7RZ

AD5626 DAC模块依据官网datasheet 绘制原理图,其中CLR 没必要引出,这里实际中未使用,直接接到了5V电压上。

FhgC2dx__SiDymjJwbqx60HTOUNQ

DAC输出抗混叠滤波器依据ADI filter design tool 实现四阶Sallen-Key滤波器,滤除40KHz以上的混叠信号,这里未做增益调整,使用偏向低噪声设计的方案。滤波器输出后通过运放的反向加法器实现直流偏置的调整。

Fj9b1FWIMIHy6s1Bycsm4xjm7G86

直流偏置的计算参考microchip的设计进行实现。

FqnbVOxZPBo88TsMTjoP2BQ4vMNP

这里参考公式 Vbias =3.3V  Vref=1.65V  Vpwm通过FPGA进行占空比调整。  

• 各功能对应的演示图和说明

Fs4G-kfBiv8o20GzSJo5qupjDf5s

oled 上显示当前波形类型 频率、偏置电压

通过左侧的按键实现频率、步进、偏置调整类型切换

通过EC11 左旋转、右旋转实现对于功能的调整

通过ec11中间的按钮实现当前参数设置,发送给FPGA进行功能实现

• 心得体会(包括意见或建议)

1.此次项目中收获颇丰,解决了上次FPGA通过损失精度调整直流偏置的问题,通过运算放大器的反向加法实现直流偏置的调整,这个设计真的很精妙呀

2.此次项目中直流偏置的运算放大器未能使用轨道轨的运算放大器,是的直流偏置在调整到3.5v 或者1.5v时 波形产生一定的截幅失真,后续进行运算放大器的选型时一定要注意这个问题

3.用于调整直流偏置的运算放大器增益带宽积不是很高,压摆率也相对比较低,所有会发现一种现象,随着频率提升,信号输出幅度VPP会减小,后续选型运放也许考虑这个性能参数的影响。

4.此次项目理论加实战,对于理论的理解、运用还是蛮深刻的,建议后续多举办这样的活动。

 

代码地址  

分支 ad5626 dds

软硬件
电路图
附件下载
DAC输出调理电路.asc
仿真文件
团队介绍
苏州工程师一枚
团队成员
xinshuwei
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号