模拟电路工程化第2部分实战:使用AD5626设计任意波形发生器
1.设计思路和相关知识点介绍 2.需要用到的硬件和软件实现过程介绍
标签
嵌入式系统
测试
数字逻辑
DDS
USB
电源变换及管理
Titan
更新2023-06-05
470

.项目介绍  

1.项目要求介绍以及需求分解

1. 搭配单片机或FPGA或其它方式的控制逻辑能够产生10Hz到20KHz范围内的正弦波信号
输出信号幅度要达到3Vpp,直流偏移可调1.5V到3.5V,DAC采用ADALP2000套件中的AD5626
需求分解:
a. 手上单片机可选FPGA,STM32,树莓派pi pico,其中FPGA和STM32尝试了一下,完全搞不懂,放弃,用树莓派Pico试试看。
b. 产生正弦波信号,结合下面要求采用套件中的AD5626,简单先扫一下AD5626规格书,使用总线连接主控。
c. 输出Vpp =3V,这个单靠AD5626也可以,也可以在后面直流偏置进行设置,结合后面设置直流偏移可调功能一起实现。
 
2. 使用套件中的Micro USB适配器通过USB给面包板供电,供电电压为5V
需求分解:
a. 这个要求较简单,可用套件中USB接口。
 
3. 使用ADALP2000套件中的运算放大器搭建一个Sallen-Key滤波器,滤除40KHz以上的混叠信号,输出运算放大器也选自ADALP2000套件
需求分解:
a. 结合第二部分和第一部分的课程,结合ADI的工具进行器件选型和电路搭建。其中要有一些注意点关于器件的供电
 
4. 运算放大器可从套件中提供的几个型号中选用
需求分解:
同上item3的解析,进行操作。
 

2.硬件实现过程及相关介绍: 

根据自我感觉的难易程度,先从搭建滤波器开始,接下来是设置直流偏置,最后是用单片机进行控制生成信号,下面是最终的Block Diagram

Fq8m-FT81NjOHioz6Ch8gFhPsG0z

1. 搭建滤波器

a. 首先根据题目要求筛选指标:

首先,需要设置为低通滤波器,接着是在40Khz时,设置为-3db,还有根据实际情况,选用最多2阶滤波器,因为是有源滤波器,再多阶数时,运放就不够了,最后是根据实际情况进行器件选型,注意这时候要看是否要负电压,因为如果需要负电压,需要再额外进行电压转换的,滤波器类型选择sallen-key,如下是我利用Analog Filter Wizard进行的设置。

Fvdo1E7j9BPiuswDlPP8W3a8yaO9FvmgQtKmibqboUkRQYCkfG11nVgrFl71RfUyMLgPcJf5ZTHcJJG0rFgA

FhVlMKLNQG7NtnbM5WsP_aIGZ36zFgqWfDPiTGZgYjRQjrRPL1z2gPVr

b. 搭建滤波器的过程需要注意:器件选型时,尽量按使用最少元件,电路结构越简单越好的原则来,不管是面包板还是PCB,在能达到电路要求的前提下,尽量减少各种不必要的辅助功能,最终我选择了OP27,因为是在面包板搭建电路,为了保证输入电源的稳定,根据ADI的建议,也加上了Bypass电容,在这里,需要说明,Bypass电容的位置需要注意,放在电流流经的地方,比如下面我放置的原则,左边黄色椭圆形里面,红黑色是输入的电源,右边蓝色框是输出的电源,中间红色框是Bypass电容,白色箭头指向是电压从输入到输出的方向,在这里就看到Bypass电容是在电路中间,面包板上比较明显,如果是自己画PCB,那更要注意Bypass电容的摆放位置。

FghShAkxtXOQKxFzC3K-9KGOHmRZ

另外也试了一下,如果不加100uF+10uF的Bypass电容,+5V到OP27上有4.68~5.3V的波动,加上bypass电容后,+5V缩小波动到4.74~5.2V

FiAcOLz8zRWIP-kT5ecPmifvXFXcFoKuLb3OyVhuttgo-WzZCdH58meC

c. 选用OP27做有源滤波器后,需要对供电做处理,这里需要将+5V转换为-5V,根据套件中的,选用LT1054,这颗IC搭建转换电路,所需要的外围器件很少,根据SPEC,LT1054的电流输出最大100mA,根据所需要的负载看,OP27最大输入电流是+-25mA,AD8226最大short电流13mA,所以算下来LT1054也是足够驱动这些负载的,参照SPEC中的参考电路,搭建出-5V的转换电压电路。

Fv9tMLyGynn9bJzpWhALD5R4Bzi1FjDDPAcOboFPmhGTOaDDvaXuYbup

2. 搭建直流偏置的部分 

a. 直流偏置和滤波器不一样,这个选型比较麻烦,我是在套件中挑选了好久,最终选了AD8226,实验看到这颗轨到轨的IC对宽电压适用性好,同时不会因为设置不当导致输出信号有很大差异,我认为容错性最好。结合SPEC看下来,AD8226很适合做这次的直流偏置部分。

下面是结合了低通滤波器和直流偏置的LTSpice截图,其中R9这部分是用套件中的可变电阻来做
Fq4Te5cP78xUIkTt444DBtBp4P9PFv-RnSoPiBkN0d58Pzg0w4_rZ3FXFq6VuQ5CQqGWU46bPbkXo9PayXQO
 
3. 搭建单片机结合AD5626生成信号
a. 首先需要先把AD5626的电性能弄清楚:AD5626是一颗12bit的数模转换芯片,+5V供电,内含一颗轨到轨的运放,可根据3线总线控制来输出0~4.09V的数字信号,下面是AD5626的Pin脚示意图以及参考连接图:
FikqO6sFWWFsOxqNYQtErJL40cPlFj0U9aAzOSUMSNURMkwpSe86fmGb
 
b. 接下来关注AD5626和控制器的连接:这里树莓派Pi Pico的GPIO选用GPIO10做CLK,GPIO11做MOSI,GPIO9做CS,因为是单向控制AD5626,接下来CLR和LDAC根据下面SPEC的说明需要设置常态高电平来锁住数据,所以再设置GPIO8为LDAC,GPIO14为CLR,这两个信号我试过直接挂+5V PWR,貌似并不能开功能,还是需要用GPIO来控制,后续再确认看看区别在哪。
FmnDoCgUzmdKSjAGUP3Uah27MjvX

最终在面包板上搭建的硬件如下:信号根据红色箭头指示从生成到处理全过程

FiygSKjAvHe1vL_tRSDLaBFcf15Z

.软件实现过程及相关介绍:  

软件实现是在Pi Pico控制AD5626生成信号这部分,Pi Pico目前了解两种方式:

一. 使用Arduino进行,但是很奇怪,现在Pi Pico使用Arduino编译时,一直会提示一个文件夹载入失败,导致编译不成功,最后这个方法就放弃了。

二. 使用Micropython,采用的是未升级前的Thonny编译器,之前的挺好用,也没有其他杂货。

接下来介绍使用Micropython的方法,这个方法有局限性,就是只能每次生成一种波形,如果需要自动调整,就只能手动修改,不过对于我这个程序一窍不通的来说,解决有没有的情况就好了。

首先,载入对应的库:

import machine
import utime
import math

接下来分配对应的GPIO管脚并设置对应的初始状态:

spi = machine.SPI(1, baudrate=6000000, sck=machine.Pin(10), mosi=machine.Pin(11))
cs = machine.Pin(9, machine.Pin.OUT)
ldac = machine.Pin(8, machine.Pin.OUT)
clr = machine.Pin(14, machine.Pin.OUT)
cs.on()
ldac.on()
clr.on()

对AD5626的寄存器位址定义:

# AD5626 command bits
WRITE_DAC = 0b0011
WRITE_INPUT_REG = 0b0111
UPDATE_DAC = 0b1001

接下来初始化AD5626的输出电压还有波形的定义:

# Initialize DAC to output single-ended voltage between 0V and Vref
cs.off()
spi.write(bytearray([WRITE_INPUT_REG, 0x00, 0x00]))  # Set input register to 0V
spi.write(bytearray([UPDATE_DAC, 0x00, 0x00]))  # Update DAC with input register value
cs.on()

def generate_sin_wave(length, amplitude, frequency, sampling_rate):
    data = []
    for i in range(length):
        x = i / sampling_rate
        sample = int(amplitude * math.sin(2 * math.pi * frequency * x))
        sample += 2048  # Offset to center waveform around 0
        data.append(sample >> 2)  # 12-bit DAC, shift right by 4 bits
    return data

最后对需要的波形进行设定,并且将这些需求发给AD5626

# Generate 5 kHz sin wave
wave_data = generate_sin_wave(length=5000, amplitude=2048, frequency=5000, sampling_rate=200000)

# Send wave data to DAC using SPI
while True:
    ldac.off()
    cs.off()
    spi.write(bytearray([WRITE_DAC, 0x00, 0x00]))  # Select DAC A
    for sample in wave_data:
        spi.write(bytearray([(sample >> 8) & 0x0F, sample & 0xFF]))  # 12-bit DAC, MSB first
    ldac.on()
    cs.on()
    utime.sleep_us(0)

 

.效果演示

看如下演示,在调节可变电阻时,看到正弦波的直流偏置在变化,在B站视频中能看到可根据需求调节信号频率,并且根据LTSpice和实际模拟,可看到超出40Khz时,输出信号会有明显的缩小,说明此时低通滤波器可实现40Khz的截止频率功能

lkDwqmgzOCH6mItm0nwVo0n3M0fq

.第二阶段的学习总结

这是模拟电路前工程化课程第二阶段实战作业,这一阶段主要围绕根据需求如何产生信号来讲解,其中对常见DAC和DDS的方法进行了一些讲解,并且还有一些实践操作,让自己对LTSpice,以及ADI的一些常用工具多了了解,同时对PWM也有了更直观的认识,这个阶段的实战项目让我对模拟电路有了更多直观的了解,这些机会非常难得,接下来准备第三阶段的实战项目,再接再励,让这个课程有圆满的结束,也让自己对编程,线路搭建,器件选型有更深刻的了解,非常感谢硬禾学堂。

 

 

附件下载
滤波和直流偏置设置.asc
Design.pdf
DDS release v1.py
团队介绍
个人
团队成员
Titan
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号