一.项目介绍
1.项目要求介绍:
音频信号采集前端电路的目的是:在如下特征的音频信号输入时,采用带通滤波器,以保证后端ADC:AD7920能进行正确的信号采集。
2.项目要求分解以及硬件实现过程:
1. 音频信号源的硬件设置
a. 根据AD7920的SPEC,AD7920的供电电压是 2.35 V to 5.25 V,模拟输入为-0.3V~Vdd+0.3V,由此需要提前准备前端输出电压不能超AD7920的SPEC要求。
b. 根据ADALP2000套件中驻极体麦克风的SPEC,了解到音频信号频率大概为100HZ~16000HZ,在此处说明:选取输入的音频信号源有多种选择,比如直接用电脑的耳机接口,在电脑中用软件模拟音频信号输出,也可以根据题目要求,采用套件中的麦克风,但是如果采用驻极体麦克风,需要根据SPEC要求,在麦克风输出端加2V的偏置电压,并且需要加电容隔离直流电压。在此处,我选用了10uF的隔离电容,这样会有大约1V的电压输出(根据后面带通滤波器的设置来进行匹配)
2. 带通滤波器的硬件设置
a. 首先了解带通滤波器的设置工具,根据课程中的讲解,目前有LC Filter Design Tool和Analog Filter Wizard等,因为这次选用的是ADI的套件,个人认为原厂的配套性最好,因为选用Analog Filter Wizard。
这个网页工具的使用比较简单,硬禾课堂有非常详细的讲解:
首先,根据需求,选择滤波器的类型(高通,低通,带通),此处选择带通后,进行指标设置,在此处有个-3dB的最低截止频率需要设置,有个计算公式:10^[(log 20k + log 20)/2],另外根据自己的实际需求,设置频率范围,这个频率范围只要是根据后续在LTSpice模拟中的结果进行调整。在指标这栏其他设置保持默认。(请教了解到:此处音频频率范围是用20HZ~20KHZ,另外stopband的依据是:你最不想要的频率在哪个频点,以及需要衰减多少倍这两个参数决定),另外需要注意在Filter Response中,可设置滤波器类型,根据实际情况看需要分为几部分,这里我选用的是2 stages.
接下来进行器件选择:设置供电电压,根据实际情况,此处使用USB供电,所以会有+5V供电,但是因为器件和时间的限制,-5V暂时没有研究,不过按SPEC说明,可以尝试使用套件中的LT1054来输出-5V,在这边我选用的电压是+5V和0V,此时右边已经出现了参考的线路,这时候,根据实际情况,自己选择器件类型,这里我选择的是AD8542,再设置stages,其中A和B都需要调整,已满足已有的器件型号。
第三步的Tolerance不作过多介绍,一般按默认设置即可。
最有一步的选择,一般按自己需求导出文件,如果线路中用的某个元件没有LTSpice symbol,那就不会导出LTSpice文件,同时会提示,比如如果选用OP97,那就没有LTSpice文件
最终在面包板上搭建的硬件如下:
二.项目要求分解以及软件需求:
按照题目要求搭建硬件完成后,已经可以在滤波器输出端能用万用表交流档测量到信号变化,但是如果可以的话,还是想能通过连接ADC,抓到ADC的数据。
在这边,先去AD7920的页面确认:可以看参考线路和驱动代码,这里的驱动是C的,尝试了STM32和RP2040(Arduino和Thonny Micropython),发现使用硬禾学堂的RP2040游戏机平台,使用Arduino时,会偶尔有数据输出,但是因为一次频率设置错误,RP2040游戏机平台连接电脑端口丢失,后面一直无法找到端口,最后重新直接用RP2040 Pi Pico,使用Thonny编译,使用micro python,会有数据输出,但是一直没有有效数据,都是X00,还需要进一步确认问题,这里先把已经做的这部分程序附在文章后面供参考。
ADC和单片机的连接:
因为ADC采用了SPI总线,但是只有3个端口:CS,SCLK,SDATA,所以对于主机RP2040来说,也只需要连接MISO/SCK/CS即可。
当使用MIcroPython时,需要先载入对应的库文件:
from machine import Pin, SPI
import utime
再进行Pin定义和总线的初始化:这里总线初始化的信息需要从SPEC和AD7920 driver中来确认
# 定义SPI相关引脚
spi_clk = Pin(2) # CLK引脚
spi_miso = Pin(4) # MISO引脚
spi_cs = Pin(1) # CS引脚
# 初始化SPI0
spi = SPI(0, baudrate=1536000, polarity=0, phase=0, sck=spi_clk, miso=spi_miso)
# 设置AD7920 CS引脚为输出模式
spi_cs.init(Pin.OUT)
另外也需要定义寄存器位置,AD7920 Driver中对寄存器的定义如下:
# 辅助函数:向AD7920发送命令并读取数据
def AD7920_GetRegisterValue():
data = bytearray([0x03, 0x00, 0x00]) # 定义存储数据的字节数组
receivedData = 0x00 # 初始化接收数据的变量
# 将spi_cs引脚置为低电平
spi_cs.value(0)
# 通过SPI总线读取AD7920返回的数据
spi.write_readinto(data, data)
# 将spi_cs引脚置为高电平
spi_cs.value(1)
# 将data[0]左移8位后的值加到receivedData上
receivedData += (data[0] << 8)
# 将data[1]加到receivedData上
receivedData += data[1]
return receivedData
三.效果演示
硬件上,可直接测量到ADC的前端输出如下,使用万用表的交流档,当对着麦克风吹气时,交流档上能显示会有最大约0.9V的交流输出,如下:
程序输出目前是这样的,现在调试后已经可以看到数据输出了,在Thonny中也可以看到声音变化时图形的变化,源码更新在附件中
四.第一阶段的学习总结
这是模拟电子前端工程化这个课程的第一阶段作业,主要以ADALM2000的线路为示例,系统学习示波器的线路原理和信号处理方法,在第一阶段,围绕ADC学习了相关概念,包括ADC的关键技术指标,示波器前端的信号处理方法,探头原理,频带处理,基准源等概念,其中介绍到的LTSpice是一个关键的工具,对信号模拟有很重要的作用。
经过第一阶段的学习和实际使用,对ADC,运放,滤波器,信号源,电压源等有了更深的认识,也是一次根据需求到实现电路的完整过程,当然也借助了ADI的工具(Analog Filter Wizard和LTSpice),这和我们实际工作的过程很类似:根据客户需求,做到对应功能的线路,并根据实际情况进行元器件的调整,个人感觉,这个经验对于从学校出来刚进入工作的同学会非常有帮助。因为个人原因,做的线路很仓促,里面有很多值得改进的地方:比如可以设置-5V,哪怕多一些器件,这样有+5V/-5V,尝试用LTSpice模拟了一下,发现前端滤波器输出信号更完美,实际工作中,这种情况就需要做权衡,因为BOM成本会增加,如果客户不同意,那就只能妥协输出信号的质量。另外还可以选择读取ADC的单片机,如果正常低端的51单片机可实现,就不需要用泛用性差点的RP2040,更不需要昂贵的STM32了。