ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ADS1220高精度ADC实战:硬件搭建与驱动调试要点解析

2026/10/3 7:47:50 拓冰建站 浏览量
ADS1220高精度ADC实战:硬件搭建与驱动调试要点解析 1. 项目概况为什么放着片内 ADC 不用偏要外挂 ADS1220做嵌入式这么多年我接手过不少“明明 MCU 里就有 ADC却偏要用一颗独立 ADC 芯片”的项目。ADS1220 这颗芯片是我在做一批高精度测温、微弱信号采集的设备时反复用到的。先说清楚它是什么ADS1220 是 TI 出品的一颗 24 位 ΔΣDelta-SigmaADCSPI 接口内置可编程增益放大器PGA、内部基准电压源和温度传感器。它最吸引人的地方不是标称 24 位分辨率而是那一套完整的信号调理链——从传感器出来的毫伏级信号可以直接进去不需要在外面堆一堆仪表放大器。片内 ADC 和高精度外置 ADC 的差距光看位数还不直观。STM32 的 12 位 ADC 在 3.3V 参考下一个 LSB 大约 0.8mV。而 ADS1220 在 2.048V 参考、PGA 增益 128 倍的情况下噪声典型值能做到 0.14μVrms 左右有效分辨率接近 20 位。0.8mV 和 0.14μV 之间差了四五个数量级。做称重传感器、PT100 铂电阻测温、应变片或者电池内阻测量的人看到这个数字就明白为什么一定得上外部 ADC 了。这篇内容适合这几类人看第一手头项目需要测微弱直流信号正在纠结选型和方案第二已经拿到 ADS1220 或者兼容芯片比如 ADS1232 的替代场景准备开始写驱动第三做嵌入式 Linux 驱动或者裸机 BSP想了解这类 ADC 驱动的通用套路。我会从硬件连接、软件分层、寄存器配置、数据滤波到问题排查完整过一遍其中有不少是官方数据手册里不会写、只有实际调板时才能踩到的细节。2. 硬件连接与设计踩坑2.1 SPI 接口的最小接线ADS1220 的通信接口就是标准 SPI但有一点需要注意它的数据输出引脚叫 DOUT/DRDY这根线是数据和转换完成指示复用的。在默认情况下DRDY 变为低电平代表一组转换数据准备好了主机看到这个下降沿后拉低 CS然后在 SCLK 的驱动下把这 24 位数据一位一位读出来。所以接线层面最少需要五根线SCLK、DIN、DOUT/DRDY、CS再加上片选和复位引脚。这块芯片支持 SPI 模式 1也就是 CPOL0、CPHA1。换句话说时钟空闲时是低电平数据在 SCLK 的下降沿被主机采样。很多人第一次调不出数据十有八九是 SPI 模式配置成了模式 0。如果用的是 STM32 HAL 库初始化代码需要注意相位参数要选 SPI_PHASE_2EDGEstatic void ADS_SPI_Init(void) { hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_LOW; /* CPOL 0 */ hspi1.Init.CLKPhase SPI_PHASE_2EDGE; /* CPHA 1 */ hspi1.Init.NSS SPI_NSS_SOFT; /* CS 用 GPIO 控制 */ hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_8; hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; HAL_SPI_Init(hspi1); }时钟频率不建议上来就拉到极限。这颗芯片的数据手册里对 SCLK 最高频率有限制稳妥起见我一般先在 1MHz 左右把通信调通再逐步往上加。SPI 速率本身不是瓶颈因为 20SPS 到 2000SPS 的数据量最多也就是每秒钟几千字节SPI 跑快慢没有实际意义反而是信号完整性问题更值得重视。2.2 参考电压与模拟电源处理ADS1220 内置了一个 2.048V 的基准源如果对精度要求不是特别苛刻直接用内部基准能省掉不少外围器件。但我建议除非是原型验证正式产品还是老老实实接外部基准。原因很简单内部基准的温度系数和长期稳定性再怎么做也拼不过一颗专用的基准芯片。在用 PT100 做 0.1 摄氏度精度测量的时候参考电压漂移 1mV对应的温度误差就可能超出允许范围。外部基准的连接方式是 REFP0/REFN0 或者 REFP1/REFN1根据配置寄存器里的选择位决定哪一对生效。基准芯片的输出端必须加去耦电容我习惯在 REFP 和 REFN 之间并一个 0.1μF 的陶瓷电容再在 REFP 对地并一个 1μF 的电容。这个电容不能省否则基准源的噪声会直接折合到转换结果里。模拟供电也是一样。ADC 的 AVDD 和 DVDD 虽然都是 3.3V但最好分开供电中间用一个磁珠或者小电阻隔开。如果板子空间有限至少要保证 AVDD 前面有独立的 LDO而不是直接用数字 3.3V 供电。我见过不少项目图省事数字电源和模拟电源直接短接结果采样数据里永远有一堆无法滤除的毛刺。2.3 布局布线经验ADS1220 是 ΔΣ 型 ADC对布局的要求没有高速 ADC 那么变态但也不能随便乱画。我的几条经验模拟输入走线要短并且远离 SCLK、DIN 这些数字信号线。数字信号跳变时产生的耦合噪声会直接叠在模拟输入上尤其是高阻抗信号源的情况下特别明显。模拟地和数字地采用单点连接本质上就是星型接地。ADC 的 AGND 引脚和 DGND 引脚最终汇合到同一个点避免数字回流电流串入模拟地回路。模拟输入前端最好加一级 RC 低通滤波。RC 既能抑制高频噪声也能起到一定的抗静电作用。对直流测量场景RC 时间常数取几十微秒就够比如 1kΩ 电阻配 47nF 电容截止频率大概 3.4kHz不会影响低频信号但能挡掉不少高频干扰。DRDY 这根线如果接到 MCU 的外部中断引脚要注意它平时是推挽输出还是开漏输出。ADS1220 的 DOUT/DRDY 在读取数据时会输出数据位所以要按数据线对待不要在走线上串联太大的电阻否则边沿变缓会影响时序判断。3. 驱动软件架构3.1 裸机驱动与 Linux 驱动的差异ADS1220 的驱动最终跑在哪里决定了代码的组织方式。在 MCU 裸机环境下驱动一般就是一组函数初始化、写寄存器、读数据、换算电压。这种模式简单直接但如果没有合理分层后续换 MCU 的时候就要重写一大批代码。而在嵌入式 Linux 环境下一般通过 spidev 用户空间接口直接操作或者写一个标准的 IIO 驱动挂到内核里。Linux 下如果只是验证芯片功能用 spidev 就够了没必要一上来就写内核驱动如果是要量产、要稳定复用就值得花时间做 IIO 驱动把采样通道、增益、采样率都暴露到 sysfs 里。3.2 分层设计接口层、协议层、业务层不管平台怎么变我建议把驱动代码分成三层。接口层负责跟具体 MCU 的 SPI 外设打交道封装出几个基础函数spi_transfer_byte、gpio_set_cs、等待 DRDY 下降沿。协议层负责 ADS1220 的寄存器读写、命令格式、转换触发逻辑。业务层负责把 24 位原始码转换成实际的物理量比如电压、温度、重量。这样做的好处是后两级完全不依赖具体的 MCU 型号。我上一版代码是给 STM32F103 写的后来换到 GD32、AT32甚至换到 ESP32只需要修改最底层的接口函数协议层和业务层一行没动。如果你写的是 Linux 驱动这三层概念对应得更清楚底层是 SPI 控制器驱动中间是芯片驱动上层是 IIO 设备接口。下面是用 C 语言实现的协议层核心代码风格上刻意保持了通用性方便直接移植/* 读寄存器命令: 0 A2 A1 A0 0 0 0 0 */ static uint8_t ads_read_cmd(uint8_t reg) { return 0x20 | ((reg 0x07) 3); } /* 写寄存器命令: 1 A2 A1 A0 0 0 0 0 */ static uint8_t ads_write_cmd(uint8_t reg) { return 0xA0 | ((reg 0x07) 3); } static uint8_t ads_spi_read_byte(void) { uint8_t rx 0; spi_transfer(rx, 1); /* 接口层 */ return rx; } static void ads_spi_write_byte(uint8_t tx) { spi_transfer(tx, 1); /* 接口层 */ } /* 读寄存器 */ uint8_t ads_reg_read(uint8_t reg) { uint8_t val 0; gpio_cs_low(); ads_spi_write_byte(ads_read_cmd(reg)); val ads_spi_read_byte(); gpio_cs_high(); return val; } /* 写寄存器 */ void ads_reg_write(uint8_t reg, uint8_t value) { gpio_cs_low(); ads_spi_write_byte(ads_write_cmd(reg)); ads_spi_write_byte(value); gpio_cs_high(); }这段代码里最关键的一点是 CS 的控制每次读或写寄存器CS 必须完整地走一个低电平再回高电平的过程。ADS1220 是靠 CS 的下降沿来同步命令帧的如果 CS 在两次访问之间没有拉高芯片内部的命令解析状态机就会错位后面读到的所有数据都会乱七八糟。4. 寄存器配置与 SPI 时序4.1 四个配置寄存器的功能ADS1220 的寄存器只有四个地址从 0x00 到 0x03理解起来并不复杂。配置寄存器 0 管输入多路复用器也就是选哪两个引脚作为差分输入或者选哪个引脚做单端输入配置寄存器 1 管转换模式和数据速率配置寄存器 2 管 PGA 增益、滤波模式、PGA 旁路和参考电压来源配置寄存器 3 管内置电流源 IDAC 和温度传感器。我常用的寄存器配置可以归纳为下面这个表寄存器主要字段典型值说明REG0MUX[3:0]0x00选择 AIN0/AIN1 差分输入REG1DR[3:0] 模式0x00连续转换模式20SPS 数据速率REG2GAIN[2:0]、滤波模式、VREF0x00PGA 增益 1内部 2.048V 基准正常滤波REG3IDAC、温度传感器0x00关闭 IDAC关闭温度传感器把 REG1 的转换模式位改成 1芯片就会进入单次转换模式完成一次转换后自动进入低功耗状态。这种模式在电池供电的设备里非常有用。需要连续监测时就把模式位改成 0或者重新写一次 REG1 触发转换。滤波模式这个字段容易被忽略。ADS1220 提供了正常滤波、低延迟滤波、同步 50Hz 抑制和同步 60Hz 抑制几种模式。如果设备要过 EMC 或者现场有工频干扰选择同步 50Hz 或者同步 60Hz 模式配合对应的数据速率能显著抑制电源带来的噪声。后面在调试部分我再展开讲。4.2 读写规则与命令格式ADS1220 的命令格式相当简单但有个容易搞混的点读寄存器和写寄存器的命令字节最高位不同低四位固定是 0中间的三位放寄存器地址。所以写 REG0 的命令是 0xA0读 REG0 的命令是 0x20写 REG2 的命令是 0xA2读 REG2 的命令是 0x22。如果地址位不左移三位命令发出去会操作到错误的寄存器这个问题我在代码评审里见过不止一次。读取转换数据不需要额外的命令字节。操作流程是先观察 DRDY 引脚等它从高电平变成低电平然后把 CS 拉低在 SCLK 的驱动下连续读 24 位数据读完把 CS 拉高。这 24 位数据是高字节在前也就是先读到的那 8 位是数据最高的 8 位。如果配置了状态字节输出那么还能继续读第 25 到 32 位其中包含温度报警和 PGA 报警信息。默认情况下状态字节是关闭的我们只读 24 位就够。有一个非常关键的时序点CS 拉低之后DRDY 引脚会马上变回高电平。这是芯片的一种握手机制相当于告诉你“我已经把数据锁存到移位寄存器里了你开始读吧”。正因为这样读数据的操作必须在看到 DRDY 低电平之后立刻进行而且整个读取过程要一气呵成中间不要用软件延时拖太久。4.3 初始化流程代码一颗 ADC 芯片的初始化流程是有标准套路的上电等电源稳定复位芯片写配置寄存器等第一个转换完成然后开始读数据。ADS1220 的复位方式是 RESET 引脚给一个低脉冲复位之后芯片的所有寄存器恢复默认值。如果为了省 IO 口可以把 RESET 引脚直接接到 DVDD靠上电时序完成复位但不建议这么做后期调试的时候没有复位手段会很痛苦。下面是一个典型裸机初始化代码uint8_t ads_init(void) { uint8_t reg[4]; /* 1. 复位 */ gpio_reset_low(); delay_ms(10); gpio_reset_high(); delay_ms(10); /* 2. 读取默认配置确认 SPI 已通 */ reg[0] ads_reg_read(0); reg[1] ads_reg_read(1); reg[2] ads_reg_read(2); reg[3] ads_reg_read(3); if (reg[0] 0xFF || reg[1] 0xFF) return 1; /* SPI 读回全是 1基本可以判断接线或模式有问题 */ /* 3. 配置寄存器 */ reg[0] 0x00; /* AIN0/AIN1 差分 */ reg[1] 0x00; /* 连续转换, 20SPS */ reg[2] 0x00; /* PGA1, 内部基准 2.048V, 正常滤波 */ reg[3] 0x00; /* 关闭 IDAC 与温度传感器 */ for (i 0; i 4; i) ads_reg_write(i, reg[i]); /* 4. 等待第一个转换完成 */ while (gpio_drdy_read() ! 0); ads_read_raw(); /* 丢弃第一组数据 */ return 0; }初始化之后记得把第一组数据丢掉。所有 ΔΣ ADC 都有这个问题滤波器在启动阶段需要若干个转换周期才能稳定第一组甚至前几组数据都可能偏大或者偏离真实值。实际项目中我一般丢前面 5 组数据再进入正常测量循环尤其是用了 20SPS 低速的时候初始化后至少要等 0.5 秒才开始记录数据。5. 采样数据处理与滤波5.1 24 位代码转电压公式ADS1220 输出的 24 位原始数据是二进制补码形式范围从 -8388608 到 8388607。最高位是符号位如果最高位为 1说明当前的差分输入是负数。绝对值最大的正码对应满量程正电压也就是 VREF 除以增益绝对值最大的负码对应负的满量程电压。转换成电压值的公式是这样double ads_code_to_voltage(int32_t code, double vref, double gain) { /* code 已经做过符号扩展 */ return (double)code * vref / (gain * 8388608.0); }拿内部 2.048V 基准、增益 1 来说满量程就是 ±2.048V一个 LSB 对应 2.048V 除以 2 的 23 次方大约是 244nV。不过实际有效分辨率到不了这个数因为芯片自身有噪声。在 20SPS、增益 128 的配置下ADS1220 的输出噪声典型值约 0.14μVrms实际有效位数不到 24 位。这一点要心里有数别看到 24 位就觉得什么信号都能测准真正决定精度的是噪声和基准稳定性。如果是单端输入方式输入范围从 0 到正满量程但转换公式还是同一个只是输入端点接地的那一侧要接一个公共参考点。很多人在单端模式里少接了一根地线导致读出来的数据一直在满量程附近徘徊这属于低级错误排查的时候先检查接线。5.2 滤波方法移动平均与一阶 IIR即使 ADS1220 本身是 ΔΣ ADC 且内置了数字滤波器实际应用中还是经常会在 MCU 里再做一级软件滤波。原因有两个一是传感器信号本身可能混入工频干扰二是 ADC 的每个转换结果之间是存在独立噪声的多几次平均能有效压低随机噪声。最常用的是滑动平均滤波器。窗口长度取 8 到 16 点比较合适。窗口太小滤波效果不明显窗口太大响应变慢信号变化的实时性变差。对 20SPS 的采样率来说16 点窗口相当于 0.8 秒的响应时间是可以接受的。滑动平均的代码很简单#define FLT_LEN 16 static int32_t flt_buf[FLT_LEN]; static uint8_t flt_idx; int32_t ads_filter_mean(int32_t sample) { int64_t sum 0; uint8_t i; flt_buf[flt_idx] sample; flt_idx (flt_idx 1) % FLT_LEN; for (i 0; i FLT_LEN; i) sum flt_buf[i]; return (int32_t)(sum / FLT_LEN); }如果嫌滑动平均的内存开销大可以用一阶 IIR 滤波也就是指数加权平均。它的好处是只需要保存一个历史值适合内存紧张的 MCU。系数 alpha 取 32/256 左右的时候滤波效果和响应速度比较均衡。用整数运算避免浮点int32_t ads_filter_iir(int32_t raw, int32_t *prev, uint8_t alpha) { int64_t y; y (int64_t)(*prev) * (256 - alpha) (int64_t)raw * alpha; y 8; *prev (int32_t)y; return (int32_t)y; }这两种滤波器在工业仪表里非常常见。滑动平均对周期性干扰的抑制效果更好而 IIR 的实时性更好适合需要快速追踪信号变化的场景。如果你要同时滤除尖峰脉冲干扰可以先用一个中值滤波把异常点剔除再做滑动平均。中值滤波的窗口通常取 5 或者 7不要取太大否则信号跳变的时候会有明显的延迟。5.3 建立时间与采样率权衡ADS1220 的数据速率从 20SPS 一直到 2000SPS总共 8 档。数据速率越低建立时间越长噪声越小。数据速率越高能跟踪的变化越快但 ENOB 会掉。实测下来20SPS 档位的峰峰值噪声可以做到不到 1μV到了 1000SPS噪声可能翻几十倍。这不是芯片不行而是 ΔΣ 调制器内部数字滤波器的带宽变宽了带进来的噪声自然就多了。所以选采样率的思路应该是先问系统需要多快的响应。如果测的是温度这种变化缓慢的物理量20SPS 甚至更低都行优先保证分辨率。如果测的是电机电流这种快速瞬变信号200SPS 到 1000SPS 比较合适但要做好噪声偏大的心理准备。再往上走2000SPS 一般只用来做标定或者检测异常状态不用于常规测量。值得留意的是ADS1220 的数字滤波器有几种模式可以选正常模式下的建立时间大约是 4 个转换周期低延迟模式的建立时间是 1 个转换周期。对于多通道切换的应用切换输入后如果不想等太久可以考虑低延迟模式代价是噪声稍微大一点。同步 50Hz 和同步 60Hz 模式则是在固定数据速率下专门优化工频抑制跟采样率和电网频率有关别选错了。6. 常见问题排查实录6.1 DRDY 信号不正常的排查DRDY 引脚是整个驱动调试里最关键的信号。它不正常数据读取流程就跑不起来。我遇到的 DRDY 问题大概分三类第一类DRDY 一直保持高电平。这种现象说白了就是芯片没完成转换或者芯片根本没工作。先查电源AVDD 和 DVDD 是不是都有正常的 3.3V再查 RESET 引脚是不是被错误地拉低了最后查输入信号是不是超出了允许范围导致芯片一直在调节 PGA 没能输出有效结果。第二类DRDY 有变化但周期不对。比如配置的是 20SPS实际却看到 DRDY 大概是 50ms 一次也就是 20SPS 没错但偶尔会漏掉一次。这种情况多半是上一次转换结果还没读完下一次转换就已经完成。解决办法是确保读数据操作足够快或者在读数据之前先屏蔽外部中断读完了再打开。第三类DRDY 电平根本没变化但 SPI 读回来的数据确实在变。这种情况其实说明读取操作本身是通的DRDY 没有接对引脚或者 MCU 配置成了输入模式但内部上下拉电阻影响了电平。用示波器直接量 DOUT/DRDY 引脚能看到转换完成时有一个低脉冲把连线或者引脚配置改对就行。6.2 数据出现异常值和零值有一个典型现象是读回来的数据始终在满量程附近有时候是正满量程有时候是负满量程。出现这个问题的基本原因只有一个输入端差分电压超出了 PGA 允许的范围。要么是传感器输出超过了参考电压除以增益要么是输入引脚接反了要么是 PGA 增益设置得太高。如果读回来的是 0那就要考虑是不是 SPI 读时序出了问题。ADS1220 在 CS 拉低之后如果 SCLK 不是从 MSB 开始采样读回来的字节顺序会完全错乱。举个实际例子我曾经在一个项目里把 SPI 配置成了 LSBFIRST读回来的 24 位数据正好是位序反的换算出来的电压值完全是乱码看起来就像随机数。排查方法很简单读一下寄存器如果读回来的所有寄存器都是 0x00 或者都是 0xFF基本就是 CPOL/CPHA 或者位序有问题。还有一个被我忽略过的细节SPI 接收时必须先发一个伪字节作为时钟驱动否则从设备不会送出数据。很多 HAL 库的 SPI_Receive 会自动处理但如果自己写的 GPIO 模拟 SPI就经常漏掉这一步。6.3 SPI 通信故障SPI 通信故障的排查要按顺序来。先确认 SCLK 上有没有时钟信号用逻辑分析仪抓一次完整的写寄存器过程。如果 SCLK 有波形但 DIN 上没有数据那就是 MCU 的 SPI 发送配置问题。如果 SCLK 和 DIN 都有波形但读回来的数据是 0xFF说明 DOUT/DRDY 线没有信号或者 CS 时序不对。CS 的问题是重灾区。ADS1220 要求 CS 在两次命令之间必须拉高如果一直保持低电平芯片会把连续收到的字节当成一条长命令寄存器地址错乱数据也就不可能是对的。这个问题在做裸机驱动时很容易发生尤其是用了 SPI 硬件自动管理 NSS 的功能。我的建议是 CS 控制始终手动用 GPIO别依赖硬件 NSS。再有一个容易翻车的点SPI 的速度。SCLK 过快特别是在长走线、没接终端电阻的情况下信号振铃会导致采样错误。我自己调试时出现过一种很隐蔽的现象寄存器能写进去、也能读出来但数据读到的总是同一个值。后来用示波器一量发现 SCLK 高电平已经振铃到快接近逻辑电平阈值了。把 SPI 预分频从 4 改成 8问题立刻消失。遇到诡异的 SPI 问题先把时钟降下来试这是成本最低的排查手段。6.4 噪声和漂移类问题ADC 本身没问题但测量值一直在几百个 LSB 的范围内跳这种问题通常不是芯片的锅。第一步先看电源模拟电源上用示波器量一下有没有开关噪声或者 LDO 的波纹。第二看参考电压REFP 引脚有没有按数据手册配去耦电容。第三看输入信号源阻抗如果信号源阻抗太高PGA 的输入偏置电流会在源阻抗上产生电压降导致读数偏移和跳动。有一种情况特别容易被忽略传感器没有屏蔽或者屏蔽层只接了一端。现场的变频器、继电器打火都会通过空间耦合进模拟输入端。处理方法是在靠近 ADC 引脚的地方加 RC 低通把截止频率压在几十赫兹高阻输入的信号线用屏蔽双绞线屏蔽层在 ADC 端单点接地。还有漂移问题。如果读数在长时间内缓慢变化首先要区分是传感器本身的漂移还是 ADC 的漂移。简单做法是把 ADC 输入端直接短接如果短接之后读数的漂移只有噪声级别那问题大概率在传感器或者信号链路。如果短接之后读数依然明显漂移就要查基准电压和温度影响。ADS1220 内部基准温度系数不算特别优秀对温漂敏感的应用必须换外部基准芯片。7. 实操经验总结最后分享两个我在多次调试中沉淀下来的习惯。第一个习惯是第一版驱动一定要把“读寄存器”功能做出来并且每次初始化之后都读一遍四个寄存器确认写进去的值和读出来的一模一样。这件事看起来多此一举但能帮你把“SPI 不通”和“芯片没工作”这两个问题快速区分开。如果寄存器都写不进去那后面调试数据读取纯属浪费时间。我后来几乎所有 ADC 驱动里都保留了这么一个自检函数产线测试的时候也靠它快速判断芯片有没有虚焊。第二个习惯是示波器或者逻辑分析仪要一直挂在 DOUT/DRDY 和 CS 这两根线上。ADS1220 的握手逻辑就是靠这两个信号配合完成的DRDY 拉低之后 CS 才开始读数据CS 拉高之后 DRDY 会复位。你只要盯着这两个信号整个转换和读取过程是不是正常一眼就能看出来。很多时候我甚至不需要看代码光看波形就能判断是接错线、配错模式还是时序没对齐。如果后续要把这个驱动做成产品级还可以考虑加一个连续自校准流程。ADS1220 虽然没有片内自校准寄存器但可以通过在初始化时多次采集零输入把偏移值存起来之后每次转换结果减去这个偏移。增益误差可以通过标准电压源标定标定系数存到 Flash 或者外部 EEPROM 里。这样整套测量链路的长稳精度会明显好于裸用默认配置。ADS1220 这颗芯片本身不算难用真正考验人的是外围电路和全链路的信号调理。把前面这些坑都趟平了它就是一杆非常可靠的高精度“尺子”。