做工业采集这行久了,手里总会留下几颗绕不开的芯片,AD7606就是其中之一。你在电量表、故障录波器、振动分析仪、电网保护装置里大概率都见过它,它是一颗8通道、16位、同步采样的ADC,最大吞吐率做到200kSPS,内部还集成了输入钳位保护、基准源、数字滤波器和灵活的并行/串行接口。对硬件工程师来说,这意味着不需要再去搭复杂的模拟前端,直接按手册接上电阻电容,就能把工业现场的±5V、±10V信号干净地送进MCU或FPGA。
如果你正在做多路模拟量同步采集、电力质量分析或者需要多个通道相位对齐的项目,AD7606基本是绕不开的参考方案。这篇文章从芯片选型、外围电路、STM32连接、固件调试一路讲到现场踩坑,尽量把关键细节一次讲透,给准备上手的朋友一份可以照着抄的实操笔记。
1. 认识AD7606:同步采样ADC中的高集成度选手
很多人第一次看到AD7606,第一反应是“这芯片怎么这么多引脚”。确实,LQFP-64的封装在ADC里不算小,但换来的是完整的前端信号链。ADC只是它的一部分,准确说这是一颗“模拟前端+ADC+数字接口”的完整采集方案。
1.1 它到底是什么,能解决什么痛点
AD7606本质上是一颗8通道单电源供电的双极性输入ADC,每个通道都有独立的16位SAR ADC核心,做到真同步采样,而不是像普通多通道ADC那样用模拟开关轮流切换、轮询采集。
同步采样这件事很关键。比如你要测三相电压和三相电流,工频50Hz下,用轮询方式采集,每个通道之间哪怕只差几十微秒,换算成相位角也可能差好几度,功率因数就算不准了。AD7606用一个CONVST信号同时锁存所有通道的采样保持器,8个通道在同一时刻冻结信号,再把结果慢慢读出来,相位差只取决于内部通道间匹配误差,温漂也做得比较小,实测下来满足一般工频同步采集绰绰有余。
另一个痛点是前端设计。工业信号很多是±5V、±10V,普通ADC输入范围往往只有0~3.3V或0~5V,你要先做电平转换、加法电路、运放驱动,还要考虑抗混叠滤波。AD7606把输入阻抗做成1MΩ,直接接受双极性输入,内部还自带过压保护钳位,省掉了外置运放和一堆电阻分压网络。对工程师来说,BOM成本低,调试时间也短。
1.2 关键电气参数清单
我习惯把这种芯片的关键参数列成一张速查表,方便硬件预研时快速判断:
| 参数 | 数值 | 说明 |
|---|---|---|
| 通道数 | 8路同步采样 | 每通道独立16位SAR ADC |
| 分辨率 | 16位 | 无失码保证 |
| 输入范围 | ±5V / ±10V | 通过RANGE引脚选择 |
| 输入阻抗 | 1MΩ | 直连传感器/互感器输出 |
| 最大吞吐率 | 200kSPS | 所有通道同时转换 |
| 电源 | AVCC 5V, VDRIVE 2.3V~5V | 数字接口电平可调 |
| 内置基准 | 2.5V,带缓冲输出 | 也可以外部注入 |
| 数字滤波 | 可选过采样倍率 | OS引脚选择 |
| 接口 | 并行/SPI/字节模式 | 兼容多种MCU/FPGA |
| 封装 | LQFP-64 | 工业级温度范围 |
注意,这里的200kSPS是最大值,决定因素不是转换本身,而是CONVST引脚的最高触发频率。实际项目中,如果SPI时钟不够快,数字读取时间也会拖慢有效采样率,后面我会讲到这条链路怎么算。
1.3 与普通ADC的关键差异
用惯了逐次逼近型ADC的人,第一次用AD7606会很不习惯,因为它不是“发起转换-等待-读数据”这种单通道流水线模型,而是“先同步锁存-后批量读取”的帧模型。
普通ADC芯片需要前端运放驱动,输入电流在采样瞬间会有电荷注入,若源阻抗太高,采样值就可能不准。AD7606的1MΩ输入阻抗极大减轻了源端驱动压力,但也不是说随便拉根线就能接,长线上耦合的噪声仍然会影响小信号精度。另一个不同是数据输出,普通SPI ADC一般一次只出一个通道的数据,AD7606则会把8个通道的结果依次输出,通道顺序固定,你得在驱动里维护好通道索引。很多新手第一次调SPI时发现读到的数据是“乱的”,往往就是没搞懂这个顺序链路。
2. 硬件设计:外围电路比想象中省事
AD7606的外围电路确实省,但省不等于可以随便画。电源、基准、去耦和地平面处理这几项处理不好,数据照样跳。
2.1 引脚功能分组与上电时序
先说引脚分组。LQFP-64的引脚大致分为四组:模拟输入、电源与地、基准引脚、数字接口和配置引脚。模拟输入是V1~V8,对应8个通道,每个输入旁边有对应的滤波器引脚,比如V1后面会有个FILT引脚,需要在外面接电容到地,这个电容和内部电阻构成抗混叠低通滤波器。
数字接口那组里,最核心的是CONVST_A、CONVST_B、BUSY、CS、RD,以及并行数据总线DB0~DB15或者SPI用的SCLK、DOUTA、DOUTB。还有个RANGE引脚,单端输入电平选择±5V还是±10V,一般直接接逻辑高或低电平就行,如果应用里两种量程都要,可以用GPIO切换。
上电时序官方手册里有说明,实际做产品时我的经验是:先把AVCC和VDRIVE供上,然后至少等100ms再开始给CONVST信号。因为内部基准需要建立时间,如果上电后立即转换,前几十个样本可能偏差很大。如果你用外部基准,同样要保证基准稳定后再启动采样。
2.2 模拟输入电路与量程选择
RANGE引脚设成高电平,输入范围是±10V,设成低电平,输入范围是±5V。这个引脚最好接一个干净的GPIO,不要直接悬空,因为内部默认状态在某些版本上可能不对,并且手动切换量程也是调试时的常用操作。
外部模拟前端不要做太复杂。源信号本身是低阻抗的,比如电流互感器输出经运放转成的电压,直接连过来就行。源阻抗很高的情况,像某些压电传感器,最好加一级运放缓冲,把输出阻抗降下来再进AD7606。官方建议每个FILT引脚接一个10nF~100nF的电容,具体值根据信号带宽确定。比如只需要采集50Hz工频信号,电容取大一点,把高频噪声滤掉,读数会稳定很多;如果要做谐波分析到几十次谐波,滤波电容就得往小里取,避免把高次谐波也滤掉了。
输入保护方面,AD7606内部有钳位二极管,信号超过电源轨一定范围会被钳到内部电源轨,很多资料里说过压耐量能到±16.5V左右。这个保护不是万能的,如果长时间接220V交流电,该炸还是会炸,所以工业现场建议在输入端串电阻或者加TVS管做第二道防护。
2.3 电源、基准与去耦布局
AVCC直接用干净的5V供电,VDRIVE根据MCU的IO电平选3.3V或5V。很多开发板为了省事把AVCC和VDRIVE都接5V,然后直接连STM32的5V容忍引脚,这种接法在不追求稳定性的测试环境能用,但为了可靠,我建议VDRIVE接3.3V,让芯片的数字输出电平和MCU一致,少一层电平转换风险。
基准电压方面,AD7606内部有2.5V基准,可在REFOUT引脚输出,也可以把REFIN引脚接到外部高精度基准。要求不高的场合用内部基准完全够;要做高精度测量,我会从外置基准芯片(比如REF5025)取电压送到REFIN,这样温漂和初始精度都有保证。
去耦电容别省。每个电源引脚旁边放一个0.1uF高频电容,再加一个10uF钽电容做低频储能。地平面不要分割,模拟地和数字地统一在一个底层上,芯片下方的散热焊盘要良好接地,这两个动作能明显降低串扰。
2.4 复位、BUSY与过采样引脚
RESET引脚要接一个RC复位电路,或者由MCU GPIO控制。芯片上电时会自动复位一次,但为了保险我会在初始化时先拉低再拉高。BUSY引脚在转换期间输出高电平,转换完成后变低,这是判断数据是否准备好的关键信号,后面接中断或查询都靠它。
OS0~OS2三个脚决定过采样倍率。它们的组合能打开片内数字滤波,倍率从2倍到64倍不等。开过采样可以提高有效分辨率、抑制带外噪声,但代价是输出速率下降。比如200kSPS基础速率下,开4倍过采样,有效速率就只有50kSPS了。具体取舍要结合你的带宽需求,不要无脑开满载,否则实时性会很难看。
3. 接单片机:SPI和并口两种主流玩法
AD7606接单片机,最常见的是SPI和并口两条路。SPI省引脚,并口速度快,适合接在FSMC总线上批量读数据。这里分别拆开讲。
3.1 最省引脚方案:SPI四线连接
SPI模式下,AD7606不是标准的单主机多从机拓扑,它更像一个“主推模式”的外设。你不需要主动发时钟去撬数据,而是用CONVST触发转换后,等BUSY变低,再送SCLK把结果移位读出来。
典型接法是:CONVST接一个普通GPIO,BUSY接MCU的外部中断输入,CS片选接GPIO或SPI片选,SCLK接SPI时钟,DOUTA接MISO,DOUTB看情况使用。AD7606在SPI模式下如果只用一条DOUT线,8个通道的数据会从DOUTA依次输出,16位一次,共16位×8个通道=128位。这样SCLK至少需要128个脉冲才能读完一轮。如果用DOUTA+DOUTB双线输出,每通道16位分成两个8位字节?不对,双线模式可以并行输出两个通道的数据,提高吞吐率。更准确地说,双线模式是奇数通道从DOUTA出,偶数通道从DOUTB出,相当于一次时钟沿同时移出两个通道,SCLK脉冲数减少一半。
我用SPI模式接STM32F103时,引脚分配是这样:
- CONVST -> PB0
- BUSY -> PB1(外部中断)
- CS -> PB12
- SCLK -> PB13
- DOUTA -> PB14 (MISO)
- DOUTB -> 不接(单线模式)
初始化SPI时,注意把SPI设为从模式?实际上AD7606的SPI接口是主机还是从机取决于你怎么理解。芯片会输出数据,MCU负责产生时钟,所以MCU是SPI主机,AD7606是SPI从机。但特别之处在于,AD7606并不需要主机发送命令来触发数据,只要CS拉低,SCLK打脉冲,它就把转换结果推出来。因此SPI的数据方向是单向读取,不用发TX数据。
3.2 追求速度:STM32 FSMC 并口方案
把AD7606接在STM32F407的FSMC总线上,是很多高速采集项目里的做法。FSMC用外部存储器接口的地址线和数据线时序来访问AD7606,因为AD7606的并行接口看起来很像一片异步SRAM。CS接FSMC的片选信号,RD连FSMC的OE,地址线A0或A1用来区分两个通道组,数据线DB0~DB15直接接FSMC的低16位数据线。
这种接法最大的优势是:读取一个通道的数据只需要一条读指令,硬件自动产生片选和读时序,CPU负载很低。比如配置FSMC的Bank1、SRAM模式,地址不需要精确对应,只需让片选区域覆盖AD7606占用的地址段,然后把读取地址映射到一个指针,直接连续读8次,就能把8个通道的数据全部拿回来。
F407的FSMC总线频率很高,AD7606的数据输出建立时间相对慢一些,所以FSMC的时序参数要按AD7606手册里的最小时间要求配置。我把FSMC设置为:
- 地址建立时间:1个HCLK周期
- 数据建立时间:6个HCLK周期
- 总线恢复时间:2个HCLK周期
实测在168MHz主频下读得很稳,数据不会出现总线冲突。如果你的板子在FSMC读取时经常读到FF或者0,多半是时序太紧,把数据建立时间加大几个周期再试。
3.3 CONVST、BUSY、READ时序拆解
很多人看数据手册里的时序图觉得头大,我按实际波形逻辑拆一遍。
整个采集周期分三个阶段:
第一,触发转换。给CONVST一个脉冲,低电平至少保持25ns,然后拉高,芯片内部开始采样并转换。BUSY会迅速拉高,表示芯片忙。
第二,等待转换完成。所有通道同时转换,转换完成后BUSY自动拉低。从CONVST上升沿到BUSY下降沿的时间,手册上写的是最大值约3.4us左右,实际测量大约在2~3us之间。这个时间决定了你的最低转换周期,理论上最快就是差不多每5us触发一次,也就是200kSPS。
第三,读取结果。CONVST可以不打第二次,在BUSY变低后,CS拉低,SCLK打脉冲,数据按通道顺序输出。读完8个通道共128位数据,CS拉高,再等一段时间就可以触发下一次CONVST。
这里有一个新手特别容易踩的坑:BUSY还没变低就去读数据。转换没结束的时候读取,会拿到上一轮的老数据或者中间态,肉眼看起来就像“数据不更新”。务必在驱动里用中断或查询方式等BUSY下降沿,再启动读操作。
3.4 中断+DMA读取的代码实现
以STM32的SPI单线模式为例,我用外部中断检测BUSY下降沿,触发后启动SPI DMA,连续接收128位数据。核心代码思路是这样:
// 假设SPI配置为16位数据帧,接收8通道数据 #define CHANNEL_COUNT 8 uint16_t adc_buffer[CHANNEL_COUNT]; volatile uint8_t data_ready = 0; void EXTI1_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line1) != RESET) { EXTI_ClearITPendingBit(EXTI_Line1); // 启动DMA接收,注意关闭SPI片选并手动拉低CS AD7606_CS_LOW(); SPI_DMACmd(SPI1, SPI_DMAReq_RX, ENABLE); } } void AD7606_START_DMA_Read(void) { DMA_Cmd(DMA2_Stream0, DISABLE); DMA_SetCurrDataCounter(DMA2_Stream0, CHANNEL_COUNT); DMA_Cmd(DMA2_Stream0, ENABLE); AD7606_CS_LOW(); SPI_DMACmd(SPI1, SPI_DMAReq_RX, ENABLE); }DMA传输完成中断里要记得把CS拉高,否则下次触发CONVST可能会和读取时序打架。GPIO操作要快,如果CS拉低动作放在中断里但优先级不够高,偶尔会出现SCLK已经开始打脉冲时CS还没稳定,这时候读回来的第一个字节是坏的。
并口模式下,FSMC读操作本身不需要DMA,因为存储器总线读已经够快。但你依然可以用定时器PWM触发CONVST,让采样率彻底稳定,再用FSMC连续读回来。这样整体CPU占用率极低,适合做连续录波。
4. 固件框架与数据处理
AD7606的驱动并不复杂,真正的坑在数据处理和调度上。如果固件架构没设计好,后面要加功能的时候就会很痛苦。
4.1 底层驱动函数设计
驱动函数我习惯分成三层。最底层是硬件抽象,包括GPIO和SPI/FSMC的初始化,以及最基础的“触发CONVST”和“读取一个通道数据”的函数。中间层是帧同步逻辑,负责一次性读完8个通道,把原始数据放进缓冲。最上层是数据解析和应用层接口,把原始值换算成实际工程量。
原始值到实际电压的换算公式很直接:
实际电压 = ADC原始值 × 满量程电压 / 32768
比如量程设为±5V,那么满量程对应5V,原始值-32768对应-5V,原始值0对应0V,原始值32767对应约4.9998V。用int32_t做运算免得上溢出,尤其是后面要累加多个通道做计算时。
float ad7606_convert_voltage(int16_t raw, float full_scale) { return (float)raw * full_scale / 32768.0f; }注意ADC原码输出格式是二进制补码。直接强制转为int16_t再算,不要拿着uint16_t去减32768,虽然效果一样,但可读性差,也容易踩符号扩展的坑。
4.2 多通道同步采样校准
AD7606出厂前做过校准,增益误差和零点误差指标不错,但还不至于达到不用校准的程度。想要更高精度,可以在生产线上做两点校准。
校准方式是:给每个通道输入一个已知标准电压,比如0V和满量程的80%,采集一段时间求平均,用线性拟合算出每个通道的增益系数k和偏移量b。实际换算时用:
实际值 = k * 原始换算值 + b
不要嫌校准麻烦,尤其是同时使用8个通道时,通道间哪怕只有0.1%的增益差异,在多通道对比测量里也会造成明显误差。工业产品一般都留一个自校准入口,上电时对地采集一次零点,保存到Flash里,效果比不校准好得多。
我遇到过一种情况:PCB布局不对称导致某些通道布线特别长,寄生电容差异让高频信号通道间衰减不一样。这种属于物理层误差,软件校准时用不同频率的信号做校准会更好。如果只做单点直流校准,高频场景下依然会有通道间幅相差异,这点要特别注意。
4.3 用DMA或FIFO保证不丢点
当采样率较高或者系统里还有别的任务时,在中断里读数据会拖垮系统。我见过有人直接在BUSY中断里写SPI查询读取,8个通道读下来要一百多个SCLK周期,按SPI时钟10MHz算,大概要12.8us左右,这个时间足够让主循环卡顿。
更好的方案是两层缓冲。第一层是DMA把每次转换结果搬运到内存环形队列,第二层是主循环或者RTOS任务从队列里取数据做处理。只要DMA搬运速度大于CONVST触发频率,理论上不会丢数据。
触发CONVST最好用定时器产生固定频率PWM。不要在主循环里做delay然后手动触发,那样采样间隔抖动很大,低频信号可能看不出问题,一旦采集高频信号或做FFT,频谱上就会出现杂散。用定时器触发后,BUSY中断只需要做一件最轻量的事,就是把DMA准备好,其他计算全部挪到任务层。
5. 实测调试:常见坑与排查方法
下面这些坑是我在AD7606调试过程中真实遇到过的,有些卡了我比较久,整理成速查表方便大家对照。
5.1 读回来全0或全满量程
全0和全满量程是两个方向上的问题,但原因差不多。
如果是全0,先检查片选和读信号时序,特别是并口模式。FSMC时序配置太紧时,数据总线还没稳定就被采样了,读回来常常是0。把时序放宽再试。如果是SPI模式,检查MISO有没有接对引脚,以及CS是不是在SCLK之前真正拉低了。
如果是全满量程,也就是0xFFFF,大概率是输入短路到负电源或者负压过大,导致ADC输出饱和。再有一种情况是基准电压没起来,内部基准异常时转换结果可能乱跳或饱和。用万用表量一下REFIN电压是不是2.5V。
5.2 通道错位或数据乱跳
通道错位大概率是读取顺序和芯片输出顺序没对齐。SPI单线模式下,通道顺序固定是V1到V8依次输出,但如果你开了双线模式,DOUTA和DOUTB是交替输出奇偶通道,软件拼接时搞错序号就会错位。
还有一种很隐蔽的情况:DMA接收长度不对。AD7606每个通道数据是16位,8个通道共16个16位字,但SPI配置成8位帧模式时,DMA计数要数的是16×8=128个字节。配置成16位帧时,计数才是8。别搞混。
数据乱跳和信号本身有关,有时候不是芯片问题。先用示波器看输入波形,再把输入对地短接测零点。如果短接后数据仍然跳动,说明是基准噪声或电源噪声。检查去耦电容和地平面。
5.3 采样率上不去
很多人想跑到200kSPS,结果发现实际只能跑到100kSPS。原因往往不是芯片,而是SPI时钟太慢或者读取流程太慢。
算一笔账:200kSPS意味着每5us触发一次转换。转换本身占用约3us,剩下的2us要完成8个通道的数据读取,也就是128个SCLK周期。如果使用单线SPI,SCLK必须至少达到64MHz,这超出了多数MCU的SPI极限,所以单线SPI真正能跑到的最大采样率会打折。
想逼近200kSPS有几个办法:
- 使用双线SPI模式,DOUTA+DOUTB同时输出,SCLK数量减半。
- 使用并口模式,一次读一个通道16位数据,8次读操作通常在几十ns内完成,远快于SPI。
- 降低过采样倍率或关闭过采样,因为过采样会降低输出速率。
所以,如果需要跑满200kSPS,我建议放弃SPI单线,直接用并口或双线SPI。如果你的有效信号带宽只有几kHz,跑50kSPS完全够用,不必纠结SPI时钟上限。
5.4 热噪声干扰与PCB布局技巧
AD7606的16位分辨率听起来不算太高,但实际测量小信号时,电路的噪声底很容易盖过有效信号。我遇到过波形上叠了一层50Hz工频干扰,后来发现是板子上的开关电源离模拟输入走线太近。
PCB布局上,这几点做好能省很多调试时间:
- 模拟输入走线尽量短,远离数字信号线和时钟线。
- AVCC和VDRIVE的走线分开,不要共用一根细线。
- 芯片下方的模拟地过孔要足够多,降低回流阻抗。
- 输入滤波器电容靠近芯片放置,不要为了布局好看拉到很远。
- 如果多层板,给模拟输入信号提供完整的地参考平面,别让走线跨分割。
还有一点容易被忽略:如果输入信号来自长线电缆,电缆屏蔽层要单点接地,否则形成地环路又会引入工频干扰。
6. 应用场景与选择建议
AD7606的应用范围很广,不同场景下发挥的价值不一样,我也说说它与其他平台搭配的注意事项。
6.1 电力监控:电压电流同步采集
电力系统里测三相电压和三相电流,同步性是最重要的。AD7606的8通道刚好对应三相电压Ua、Ub、Uc,三相电流Ia、Ib、Ic,剩下两路还能接零序或中线信号。互感器输出一般经过运放调理成±5V或±10V,直接进AD7606即可。
在做电能质量分析时,采样率和过采样设置要仔细权衡。要做50次谐波分析,采样率至少要10kSPS,加上抗混叠滤波,过采样倍数也不能开太高。我通常做法是先固定10kSPS采样率,开4倍过采样,然后做软件数字滤波和FFT,精度和实时性都还不错。
6.2 工业振动与声学定位
振动传感器输出一般很小,需要先经电荷放大或电压放大,再用AD7606采集。这种场景更看重通道间的相位一致性,因为定位算法依赖多路信号的时延差。AD7606的同步采样能力很有优势,但要注意前级放大器的相位一致性也必须匹配,否则芯片同步得再好也没用。
声学阵列里,如果使用多路麦克风阵列,通常需要更高采样率和更多通道。一颗AD7606只有8路,阵列规模大时需要考虑级联多片。AD7606支持多片同步,用同一路CONVST信号触发,BUSY做逻辑与,可以扩展成16路或32路同步采集,这也是它比单芯片高通道ADC方案更灵活的地方。
6.3 其他处理器平台:FPGA、树莓派、RK3588等
除了STM32,AD7606在FPGA平台下也经常见。FPGA驱动它的最大优势是时序完全可控,你可以用状态机准确模拟CONVST、BUSY、RD的时序,读取速度比MCU快得多。用FPGA做多片AD7606级联时,每片的数据总线可以接到同一个FIFO,按固定顺序读取,通道编号非常清楚。
如果你接树莓派或者RK3588这类运行Linux的板子,可以直接用SPI设备树挂一个spidev节点,然后在应用层用spidev读取。只不过Linux的实时性弱于MCU,busy等待用中断或者poll方式做,采样率要求不高时没问题。真要做高速连续采集,要么换实时内核,要么用FPGA或DSP预处理。
高通车载芯片、RK3588这类平台跑AI模型时,AD7606更多是负责把模拟传感器信号变成数字流送进去做推理,这种系统里我建议加一个隔离电源和隔离SPI,防止电机驱动或电源模块干扰采集电路,实测下来对系统稳定性提升非常明显。
写在最后的一点体会
AD7606这颗芯片我前前后后用了好几年,最大的体会是“功能齐全不等于好调,省心只属于懂原理的人”。你把它当普通ADC用,只读数据不注重时序,会遇到各种莫名其妙的问题;你把它的同步采样和数字滤波吃透了,就能在很多项目里把采集部分做得既简洁又可靠。
如果你问我选型时有没有替代方案,我会说单通道高精度ADC有更多选择,但8路同步采样、内置前端、接口灵活这三个特性凑在一起,AD7606在工业领域确实有其不可替代的位置。上手之前把数据手册里那几个时序图好好看两遍,再对照我这篇笔记去搭电路,可以少走很多弯路。