☰
AD7124 24位ADC硬件参考设计:原理图、PCB与驱动源码全解析
2026/10/27 9:07:29 网站建设 项目流程

简介:这份资源围绕24位Σ-Δ型模数转换器AD7124展开,面向从事高精度数据采集、工业测量与嵌入式硬件开发的工程师及电子类专业学生,提供从硬件到软件的完整参考设计。包内包含基于Altium设计的4层评估板PCB文件,板卡尺寸约60×40mm,配套PDF格式原理图,便于对照理解模拟前端、基准源与SPI接口的电路布局;同时提供SPI接口驱动源代码以及中英文技术手册,方便快速完成寄存器配置与采样调试。压缩包整体约5.41MB,文件以原理图、PCB工程、驱动源码和技术文档为主,覆盖硬件设计、底层驱动与芯片手册三类用途。目前已有154人学习下载,适合作为AD7124选型验证、课程设计或项目移植时的设计参考,帮助读者缩短从原理理解到实际布板与驱动联调的周期。

1. AD7124 硬件参考设计包:从原理图到驱动源码,一套能跑通的 24 位 ADC 方案

如果你正在做高精度数据采集,比如称重传感器、热电偶测温、压力变送器或者工业过程控制,大概率绕不开 24 位 Σ-Δ 型 ADC。AD7124 是 ADI 在这个精度段里被大量使用的型号,集成 PGA、激励电流源、参考电压缓冲,通道还多。但真正动手时,麻烦往往不在芯片本身,而在外围:基准怎么接、模拟地和数字地怎么分、SPI 隔离要不要做、驱动里寄存器怎么配。这套资源把原理图、PCB 图和驱动源码打包在一起,等于把从硬件到软件的一条链路都摊开了。它适合已经选型 AD7124、需要一份可对照的参考设计来缩短调试周期的硬件工程师和嵌入式软件工程师,也适合想搞清楚 24 位 ADC 板级设计到底要注意什么的人。

2. 拆开压缩包先看什么:原理图、PCB 与驱动的对应关系

2.1 原理图里真正决定精度的几个网络

拿到一份 AD7124 原理图,不要从头到尾平均用力看。先锁定几个决定性能的网络,其余都是辅助。

第一是模拟输入通道。AD7124 支持差分输入,原理图上一般会标出 AIN0/AIN1 这样的差分对。你要确认输入端的 RC 滤波参数:常见做法是每路串一个几十到几百欧的电阻,再对地并一个差分电容加两个共模电容。这个 RC 既做抗混叠,也做输入保护。电阻太大会引入热噪声,太小起不到限流作用,我一般会从 100Ω 配 0.1μF 差分电容起步,再根据信号带宽调。

第二是基准电压。AD7124 可以外接基准,也可以用内部基准。外接基准的噪声直接决定转换结果的噪声底,所以原理图上基准芯片的退耦电容、基准走线的包地处理都要看。如果原理图用的是 REFIN+ 和 REFIN- 差分基准,注意基准输入端的滤波电容位置要尽量靠近芯片引脚。

第三是模拟电源和数字电源的分离。AD7124 有 AVDD 和 DVDD,原理图上通常会各自配磁珠或电感加电容。你要看的是 AVDD 的退耦电容是不是紧贴引脚,DVDD 和 AVDD 之间有没有做单点连接或者磁珠隔离。很多精度上不去的板子,问题就出在这两个电源域被走线搅在一起。

第四是 SPI 接口。AD7124 的 SPI 支持 CRC 校验和 SCLK 空闲电平配置,原理图上 CS、SCLK、DIN、DOUT、RDY 这几根线的上拉和串联电阻要看清楚。RDY 是中断输出,一般要上拉,接到 MCU 的外部中断引脚。

2.2 PCB 图里模拟地和数字地的处理方式

打开 PCB 图,先看叠层。AD7124 这种高精度 ADC,常见做法是四层板:顶层信号、第二层地、第三层电源、底层信号。如果资源里是两层板,那就要重点看地平面的完整性。

模拟地和数字地的处理是这份 PCB 图最值得看的地方。常见方案有两种:一种是整板统一地平面,靠布局把模拟部分和数字部分物理分开;另一种是模拟地和数字地在芯片下方用零欧电阻或磁珠单点连接。AD7124 的 datasheet 推荐的是前者,也就是不要分割地平面,而是把模拟信号走线和数字信号走线分区,地平面保持完整。你在 PCB 图里可以验证这一点:看 AD7124 下方的地是不是完整的铜皮,模拟输入走线有没有被数字线穿越。

另一个要看的是基准和模拟输入的走线。这些线要尽量短、尽量粗,并且包地。如果 PCB 图里模拟输入走线又细又长,还和 SCLK 平行走了一段,那这块板子的有效精度大概率要打折。

2.3 驱动源码的目录结构和移植入口

驱动源码一般分几个部分:寄存器定义头文件、SPI 读写底层、AD7124 初始化配置、数据读取和转换函数。移植的时候,你只需要改 SPI 底层和 GPIO 控制 RDY 引脚的部分,其余都是芯片相关的,不用动。

先看寄存器定义。AD7124 的寄存器是 8 位地址加 24 位数据的结构,通信寄存器决定下一步操作哪个寄存器。驱动里通常会有一个ad7124_write_register和ad7124_read_register,这两个函数是核心。你要确认它们有没有处理连续读写模式,以及有没有做 CRC 校验。

再看初始化流程。AD7124 上电后需要复位、配置通道、配置增益和基准、设置滤波器的输出数据速率。驱动里一般会有一个ad7124_init或者类似的函数,把这些步骤串起来。你移植的时候,重点看它配置了哪些寄存器,尤其是滤波器和增益的设置,这直接决定你的采样率和噪声表现。

3. 把驱动跑起来:SPI 时序、寄存器配置与采样流程

3.1 SPI 底层对接与 RDY 引脚处理

AD7124 的 SPI 模式支持 CPOL=0/CPHA=0 或者 CPOL=1/CPHA=1,具体看你的 MCU。驱动源码里一般会给出一个 SPI 读写函数的原型,你需要在你的平台上实现它。

/* AD7124 SPI 读写底层示例,基于 STM32 HAL 库 */ /* 注意:AD7124 是 24 位数据,SPI 按 8 位传输,需要拼三字节 */ uint8_t ad7124_spi_transfer(uint8_t tx_data) { uint8_t rx_data; HAL_SPI_TransmitReceive(&hspi1, &tx_data, &rx_data, 1, 100); return rx_data; } /* 写寄存器:先写通信寄存器,再写数据 */ void ad7124_write_register(uint8_t reg_addr, uint32_t reg_data, uint8_t data_len) { uint8_t comm_reg = 0x00; /* 通信寄存器格式:bit7=写(0),bit6=使能(1),bit5-0=寄存器地址 */ comm_reg = (0 << 7) | (1 << 6) | (reg_addr & 0x3F); AD7124_CS_LOW(); ad7124_spi_transfer(comm_reg); /* 根据数据长度发送,AD7124 寄存器有 8 位、16 位、24 位 */ for (int i = data_len - 1; i >= 0; i--) { ad7124_spi_transfer((reg_data >> (8 * i)) & 0xFF); } AD7124_CS_HIGH(); } /* 读寄存器:先写通信寄存器,再读数据 */ uint32_t ad7124_read_register(uint8_t reg_addr, uint8_t data_len) { uint8_t comm_reg = 0x00; uint32_t reg_data = 0; /* 通信寄存器格式:bit7=读(1),bit6=使能(1),bit5-0=寄存器地址 */ comm_reg = (1 << 7) | (1 << 6) | (reg_addr & 0x3F); AD7124_CS_LOW(); ad7124_spi_transfer(comm_reg); for (int i = 0; i < data_len; i++) { reg_data = (reg_data << 8) | ad7124_spi_transfer(0xFF); } AD7124_CS_HIGH(); return reg_data; }

这段代码的关键在通信寄存器的构造。bit7 决定读还是写,bit6 必须置 1 表示使能,低 6 位是寄存器地址。AD7124 的寄存器地址不是连续的,具体地址要对照数据手册的寄存器映射表。数据长度也要注意,状态寄存器和控制寄存器是 8 位,配置寄存器是 16 位,数据寄存器是 24 位。如果你把 24 位数据当 16 位读,读出来的值会错位。

RDY 引脚的处理有两种方式:轮询和中断。轮询就是在启动转换后不断读状态寄存器的 RDY 位,中断就是把 RDY 接到 MCU 的外部中断,下降沿触发。我一般用中断,因为轮询会占用 SPI 总线,而且容易错过转换完成时刻。中断服务函数里置一个标志位,主循环检测到标志位再去读数据寄存器。

3.2 通道、增益和滤波器的寄存器配置

AD7124 的配置寄存器决定每个通道用哪个基准、多大的增益、多快的输出速率。配置寄存器是 16 位,不同位的含义要对照手册。

/* AD7124 配置寄存器位定义(部分) */ /* bit15-12: 保留 */ /* bit11: 基准选择,0=REFIN1,1=内部基准 */ /* bit10-8: 增益选择,000=1倍,001=2倍,010=4倍...111=128倍 */ /* bit7: 双极性/单极性,0=单极性,1=双极性 */ /* bit6-4: 输出数据速率相关,配合滤波器寄存器 */ /* bit3-0: 通道使能等 */ /* 配置通道0:使用外部基准,增益128,双极性,用于称重传感器 */ void ad7124_config_channel0(void) { uint16_t config_val = 0; config_val |= (0 << 11); /* 基准选择:REFIN1 */ config_val |= (7 << 8); /* 增益:128倍 */ config_val |= (1 << 7); /* 双极性 */ /* 其余位根据滤波器设置填充 */ ad7124_write_register(AD7124_CONFIG_0, config_val, 2); /* 设置滤波器:输出数据速率和滤波类型 */ uint16_t filter_val = 0; /* 滤波器寄存器 bit10-0 是 FS 值,决定输出速率 */ /* 输出速率 = fclk / (32 * FS),fclk 通常为 614.4kHz */ /* 设置 FS=96,输出速率约 200SPS */ filter_val = 96; ad7124_write_register(AD7124_FILTER_0, filter_val, 2); }

增益的选择要和你的信号幅度匹配。AD7124 的 PGA 增益从 1 到 128,增益越大,输入范围越小,但分辨率越高。称重传感器的满量程输出通常是 1mV/V 到 3mV/V,激励电压 5V 的话,满量程信号只有 5mV 到 15mV。这时候用 128 倍增益,把信号放大到接近基准电压,才能充分利用 24 位分辨率。

滤波器的 FS 值决定输出数据速率。FS 越大,输出速率越低,但噪声也越低。这是一个典型的精度和速度的权衡。如果你的应用是静态称重,可以设 FS=960,输出速率约 20SPS,噪声最低。如果是动态信号,FS 要小一些,但噪声会上升。

3.3 单次转换与连续转换的代码流程

AD7124 支持单次转换和连续转换两种模式。单次转换适合低功耗场景,转换完就进待机。连续转换适合需要连续采样的场景。

/* 单次转换流程 */ float ad7124_single_convert(void) { uint32_t raw_data; int32_t signed_data; float voltage; /* 1. 设置模式寄存器为单次转换 */ ad7124_write_register(AD7124_MODE, 0x0001, 2); /* 2. 等待 RDY 引脚变低,或者轮询状态寄存器 */ while (AD7124_RDY_PIN() == 1); /* 等待转换完成 */ /* 3. 读数据寄存器 */ raw_data = ad7124_read_register(AD7124_DATA, 3); /* 4. 转换为有符号数,24 位数据在 32 位变量中要对齐 */ if (raw_data & 0x800000) { signed_data = (int32_t)(raw_data | 0xFF000000); } else { signed_data = (int32_t)raw_data; } /* 5. 转换为电压值:V = (code / 2^23) * (Vref / Gain) */ voltage = ((float)signed_data / 8388608.0f) * (2.5f / 128.0f); return voltage; }

这段代码里有几个容易翻车的点。第一,24 位数据读进来是放在 32 位变量的低 24 位,符号位在第 23 位,所以判断符号要看 0x800000,扩展符号位要或上 0xFF000000。第二,电压换算公式里的 2^23 是 8388608,不是 2^24。因为双极性模式下,满量程正输入对应 0x7FFFFF,满量程负输入对应 0x800000。第三,基准电压和增益要和你配置寄存器里设的一致,否则算出来的电压是错的。

连续转换模式下,你只需要在初始化时把模式寄存器设为连续转换,之后每次 RDY 触发就去读数据寄存器。注意数据寄存器读完会自动更新,不需要手动清除。

4. 避坑与排查:AD7124 调试中最容易翻车的五个地方

4.1 现象:读出来的数据一直是 0 或者满量程

原因:SPI 通信根本没通,或者通信寄存器构造错了。AD7124 的通信寄存器 bit6 必须置 1,很多人只写了读写位和地址,忘了使能位,结果芯片根本不响应。

解决:先用示波器或者逻辑分析仪抓 SPI 波形,确认 CS 拉低后第一个字节是不是符合通信寄存器格式。如果手头没有逻辑分析仪,可以读 ID 寄存器,AD7124 的 ID 寄存器地址是 0x05,读出来应该是 0x14 或 0x16 之类的固定值。读不到正确 ID,通信一定有问题。

4.2 现象:数据跳动很大,有效位数远低于 24 位

原因:基准噪声大,或者模拟输入走线被干扰,或者增益设置和信号幅度不匹配。24 位 ADC 的有效位数从来不是 24 位,实际能做到 20 位到 22 位就不错了。如果跳动超过几十个码,说明模拟前端有问题。

解决:先短接模拟输入到地,看数据跳动。如果短接后跳动仍然很大,问题在基准或者电源。检查基准芯片的退耦电容是不是靠近引脚,AVDD 的纹波是不是太大。如果短接后跳动很小,接上信号跳动变大,问题在信号链,检查传感器激励、走线屏蔽和 RC 滤波。

4.3 现象:RDY 引脚一直不翻转

原因:模式寄存器没配置对,或者通道没使能。AD7124 上电后默认是待机模式,必须写模式寄存器启动转换。另外,通道寄存器里要确保对应的通道使能位被置 1。

解决:读回模式寄存器和通道寄存器,确认写入的值和读回的值一致。如果不一致,说明 SPI 写操作有问题。另外注意 AD7124 的 RDY 引脚是开漏输出,必须上拉,不上拉的话永远读不到低电平。

4.4 现象:采样率上不去,实际输出速率远低于设定值

原因:SPI 时钟太慢,或者 RDY 处理用了轮询而且轮询间隔太长。AD7124 在高速输出速率下,RDY 脉冲很窄,轮询很容易错过。

解决:改用中断方式处理 RDY,把中断优先级设高。同时提高 SPI 时钟,AD7124 支持最高 5MHz 的 SCLK,只要你的 MCU 和走线能跟上,尽量往高了设。另外注意,连续转换模式下读数据寄存器的时机要在 RDY 变低之后尽快读,否则下一次转换完成会覆盖数据。

4.5 现象:多通道切换时数据串扰

原因:AD7124 内部是多路复用加单个 ADC,切换通道后需要等滤波器稳定。如果切换通道后立刻读数据,读到的还是上一个通道的残留值。

解决:切换通道后,丢弃前几次转换结果。具体丢几次取决于滤波器的建立时间,通常 Sinc4 滤波器需要 4 个转换周期稳定。你可以在代码里做一个计数器,切换通道后连续读 4 次,从第 5 次开始取有效数据。

5. 进阶用法:用内部基准和斩波模式把噪声再压一压

5.1 内部基准的取舍与校准

AD7124 有内部基准,典型值是 2.5V,初始精度在 0.1% 左右,温漂在 10ppm/°C 量级。如果你的应用对绝对精度要求不高,比如只关心相对变化,内部基准够用,还能省掉外部基准芯片和一路基准走线。但如果你要做绝对精度测量,比如电子秤要过计量,那还是外接一个低漂移基准,比如 ADR4525 或者 REF5025。

用内部基准的时候,有一个细节:内部基准需要使能,并且要等它稳定。驱动里一般会有一个基准使能的寄存器位,使能后延时几十毫秒再启动转换。另外,内部基准的输出电压可以通过读内部基准电压寄存器来校准,但那个寄存器的精度有限,我一般不用,直接按 datasheet 的典型值算,误差在可接受范围内。

5.2 斩波模式对失调和低频噪声的抑制

AD7124 支持斩波模式,通过交换内部 PGA 的输入极性来抵消失调电压和 1/f 噪声。开启斩波后,输出速率会减半,因为一次转换需要两个相位。但换来的是失调电压从几十微伏降到几微伏,低频噪声也明显改善。

开启斩波的寄存器配置一般在配置寄存器里,有一个 chop 使能位。开启后,你读到的数据已经是斩波后的结果,不需要自己做平均。但要注意,斩波模式下滤波器的建立时间会变长,多通道切换时丢弃的转换次数要相应增加。

/* 开启斩波和内部基准的配置示例 */ void ad7124_config_advanced(void) { uint16_t config_val = 0; config_val |= (1 << 11); /* 使用内部基准 */ config_val |= (7 << 8); /* 增益 128 */ config_val |= (1 << 7); /* 双极性 */ config_val |= (1 << 6); /* 开启斩波 */ ad7124_write_register(AD7124_CONFIG_0, config_val, 2); /* 使能内部基准 */ uint16_t ref_ctrl = 0; ref_ctrl |= (1 << 0); /* 内部基准使能位 */ ad7124_write_register(AD7124_REF_CTRL, ref_ctrl, 2); /* 延时等待基准稳定 */ HAL_Delay(50); }

5.3 用状态寄存器的错误位做自检

AD7124 的状态寄存器里有几个错误标志位,比如 SPI CRC 错误、基准检测错误、转换错误。这些位在调试阶段非常有用。我一般会在读数据的时候顺便读状态寄存器,如果错误位置位,就通过串口打印出来。

常见的一个错误是基准检测错误,说明基准电压超出了设定范围。如果你用的是外部基准,检查基准芯片有没有正常工作。如果用的是内部基准,检查使能位有没有写对。另一个是 SPI CRC 错误,说明通信过程中数据被干扰了,这时候要检查 SCLK 走线和 CS 走线是不是太长,或者 SPI 时钟是不是太快了。

从那以后我每次调试新的 AD7124 板子,都强制走一遍流程:先读 ID 确认通信,再短接输入看噪声底,然后接传感器看信号,最后开斩波和内部基准对比效果。这套流程走下来,基本能定位九成以上的问题。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询