一.项目介绍
1.项目要求介绍以及需求分解:
2.硬件实现过程及相关介绍:
根据自我感觉的难易程度,先从搭建滤波器开始,接下来是设置直流偏置,最后是用单片机进行控制生成信号,下面是最终的Block Diagram
1. 搭建滤波器
a. 首先根据题目要求筛选指标:
首先,需要设置为低通滤波器,接着是在40Khz时,设置为-3db,还有根据实际情况,选用最多2阶滤波器,因为是有源滤波器,再多阶数时,运放就不够了,最后是根据实际情况进行器件选型,注意这时候要看是否要负电压,因为如果需要负电压,需要再额外进行电压转换的,滤波器类型选择sallen-key,如下是我利用Analog Filter Wizard进行的设置。
b. 搭建滤波器的过程需要注意:器件选型时,尽量按使用最少元件,电路结构越简单越好的原则来,不管是面包板还是PCB,在能达到电路要求的前提下,尽量减少各种不必要的辅助功能,最终我选择了OP27,因为是在面包板搭建电路,为了保证输入电源的稳定,根据ADI的建议,也加上了Bypass电容,在这里,需要说明,Bypass电容的位置需要注意,放在电流流经的地方,比如下面我放置的原则,左边黄色椭圆形里面,红黑色是输入的电源,右边蓝色框是输出的电源,中间红色框是Bypass电容,白色箭头指向是电压从输入到输出的方向,在这里就看到Bypass电容是在电路中间,面包板上比较明显,如果是自己画PCB,那更要注意Bypass电容的摆放位置。
另外也试了一下,如果不加100uF+10uF的Bypass电容,+5V到OP27上有4.68~5.3V的波动,加上bypass电容后,+5V缩小波动到4.74~5.2V
c. 选用OP27做有源滤波器后,需要对供电做处理,这里需要将+5V转换为-5V,根据套件中的,选用LT1054,这颗IC搭建转换电路,所需要的外围器件很少,根据SPEC,LT1054的电流输出最大100mA,根据所需要的负载看,OP27最大输入电流是+-25mA,AD8226最大short电流13mA,所以算下来LT1054也是足够驱动这些负载的,参照SPEC中的参考电路,搭建出-5V的转换电压电路。
2. 搭建直流偏置的部分
a. 直流偏置和滤波器不一样,这个选型比较麻烦,我是在套件中挑选了好久,最终选了AD8226,实验看到这颗轨到轨的IC对宽电压适用性好,同时不会因为设置不当导致输出信号有很大差异,我认为容错性最好。结合SPEC看下来,AD8226很适合做这次的直流偏置部分。
最终在面包板上搭建的硬件如下:信号根据红色箭头指示从生成到处理全过程
二.软件实现过程及相关介绍:
软件实现是在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的截止频率功能
四.第二阶段的学习总结
这是模拟电路前工程化课程第二阶段实战作业,这一阶段主要围绕根据需求如何产生信号来讲解,其中对常见DAC和DDS的方法进行了一些讲解,并且还有一些实践操作,让自己对LTSpice,以及ADI的一些常用工具多了了解,同时对PWM也有了更直观的认识,这个阶段的实战项目让我对模拟电路有了更多直观的了解,这些机会非常难得,接下来准备第三阶段的实战项目,再接再励,让这个课程有圆满的结束,也让自己对编程,线路搭建,器件选型有更深刻的了解,非常感谢硬禾学堂。