ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

HX711、CS1237、TM7707三款高精度ADC选型与实战对比

HX711、CS1237、TM7707三款高精度ADC选型与实战对比 做单片机这几年外接ADC这三颗芯片几乎绕不开HX711、CS1237、TM7707。很多人一开始图省事直接用MCU内部ADC结果接上称重传感器或者热电偶发现分辨率不够、噪声大得没法看才转回头找独立的高精度ADC。这三颗芯片价格不高、国产货源稳定、资料也多但要真把它们用好光看数据手册远远不够标称24位到底能兑现多少、通道和基准怎么选、软件和PCB上哪里有坑都需要拿实际项目经验来说话。这篇内容适合正在做电子秤、便携仪表、工业采集板或者想把传感器小信号采集做扎实的朋友我尽量把参数对比、选型逻辑和实操细节一次讲清楚。1. 为什么这三颗国产ADC会被放在一起比1.1 都适合小信号、高精度、低速测量先说共同点。HX711、CS1237、TM7707这三颗芯片虽然来源不同、管脚不同但本质上都是Σ-Δ型ADC也就是用量化噪声整形加过采样来换分辨率。这类ADC和单片机内置的逐次逼近型ADC不一样它天生适合低频、小信号、高精度的场景比如称重传感器输出的毫伏级差分信号、热电偶的微小热电势、铂电阻电桥的微弱变化。实际项目里这几颗芯片还有一个共同点都内置了可编程增益放大器PGA。这一点太关键了传感器输出信号往往只有几个毫伏到几十毫伏如果不放大ADC再高的标称位数都是白搭。HX711把增益固定成32/64/128档CS1237和TM7707则是软件可配的1到128倍灵活性更高。另外它们都是低速器件。HX711的输出速率默认10Hz或者80HzCS1237可以配置到更高的速率但一般典型应用都是几十赫兹以内TM7707虽然可以配置到几百赫兹但更多时候也是用低频档测高精度。如果你需要的是高速采集比如音频、振动分析那根本不该选它们这几颗芯片的定位就是慢慢测、测很准。1.2 有效位数才是真正的精度指标这是我特别想强调的一点。很多新手拿到HX711手册看到24位觉得比16位的TM7707强很多实际用下来却未必。这就是被标称位数忽悠了。标称位数只代表ADC内部数字输出的位数真正决定测量精度的是有效位数也叫ENOB或者无噪声分辨率。由于芯片内部有PGA噪声、基准噪声、量化噪声实际可用的有效位数会明显低于标称位数。我给个直观的计算HX711增益128、速率10Hz时手册给出的输入噪声典型值在0.5μV到1μV级别而满量程差分输入范围大概40mV用40mV除以1μV得到的可靠码值大约只有几万个换算下来无噪声分辨率大概16位出头有效位数能到17到18位就算不错了。CS1237在这方面明显更好它在低速档、PGA较大时有效位数能达到21位以上官方极限条件下能标到23位所以很多从HX711升级的项目实际上提升非常大。TM7707则对标的是ADI的AD770516位无失码虽然标称位数看着低但线性度和长期稳定性都做得不错在双通道采集场景里依然很能打。选型的时候一定不要只看24位三个字要看有效位数、噪声、基准、温漂以及你的实际需求。如果只是做人体秤18位有效位都嫌多如果做精密天平或工业变送器20位以上才有意义。2. 关键参数横评HX711、CS1237与TM7707的核心差异2.1 三颗芯片参数速查表为了方便对照我把这三颗芯片的关键参数整理成一张表。这些数值来自数据手册和实际测试经验具体批次、封装、工作温度不同会有上下浮动但整体趋势不会变。参数HX711CS1237TM7707ADC位数24位24位16位有效位数ENOB17~18位量级21~23位量级16位无失码模拟通道2路差分A路带PGAB路固定增益321路差分 片内温度传感器2路差分PGA增益32 / 64 / 128A路1 / 2 / 4 / 8 / 64 / 1281 ~ 128可编程输出速率10Hz或80Hz10Hz ~ 1.28kHz可配置软件可配置范围较大基准电压内部稳压无外部基准引脚内部2.5V可选外部基准内部2.5V同时支持外部REFIN供电范围2.6V ~ 5.5V2.6V ~ 5.5V2.7V ~ 5.25V接口方式两线DOUT / PD_SCK两线DRDY / SCLKSPIDIN / DOUT / SCLK / DRDY片内温度传感器无有有校准功能无自校准 / 系统校准自校准 / 系统校准典型封装SOP-16MSOP-10 / SOP-8SOP-16 等这张表看完最基本的结论已经有了HX711是一个面向称重场景高度专用的芯片CS1237是通用单通道高精度升级款TM7707则是双通道、寄存器开放、软件可配置的工业向器件。2.2 有效位数、噪声与输出速率的取舍很多人在数据手册里看到一个极高的有效位数兴冲冲把输出速率调到最高结果精度掉得厉害还以为是芯片不行。这其实是Σ-Δ ADC的工作原理决定的。Σ-Δ架构的思路是用极高的采样率对信号过采样然后用数字滤波器把带外噪声滤掉。输出速率越低过采样率越高数字滤波越狠有效位数就越漂亮反过来输出速率越快有效位数肯定下降。这不是芯片偷工减料而是物理规律。以CS1237为例它在10SPS附近有效位数可以做到20位以上估算一下噪声电平大概在几十纳伏到一两百纳伏量级。但如果你把速率调到640SPS甚至1.28kHz有效位数可能掉到16位甚至更低。所以设计时一定要先想清楚你的信号到底需要多快的刷新率能接受多高的噪声底。称重传感器一般10Hz足够热电偶慢变信号5Hz都嫌快没必要追求高速。实践里我习惯反过来考虑在满足系统响应时间的前提下尽量选最低的输出速率档然后用数字滤波再平滑一次。这样牺牲一点点响应换来的精度增益非常可观。2.3 基准与温漂很多人忽略的精度上限ADC的有效位数再高基准电压不稳一切都是白搭。HX711的做法比较特殊它内部集成了稳压输出可以直接给电桥传感器供电这样形成一个比例式测量系统传感器输出信号和参考基准都来自同一个稳压源电源波动的影响会被抵消一部分所以在电子秤里非常好用这也是HX711为什么在称重行业经久不衰的原因。CS1237内部有一个2.5V基准也可以用外部基准实际使用中内部基准的温漂在常规温度下表现还可以但如果你要做高精度仪表建议还是认真考虑外部基准或者把系统设计成比例式测量避免基准绝对精度不足的问题。TM7707支持外部REFIN引脚这在高精度应用里非常重要。比如热电偶测温本身信号只有几十微伏如果基准电压因为温度变化漂移测出来的数据会非常难看。外接一颗低温漂基准芯片比如ADR4525之类的2.5V基准再配合滤波电容就能明显改善温漂。这里也要提醒TM7707就算不用外部基准内部基准也能工作但对温漂比较敏感的项目多留一个基准引脚给了设计自由度是好事。2.4 接口差异直接决定软件工作量三颗芯片的接口虽然都节省引脚但使用体验差别明显。HX711是典型的专用称重接口用两根线DOUT和PD_SCKDOUT拉低表示数据就绪然后给PD_SCK脉冲每24个脉冲读出24位数据再加1到3个脉冲切换通道和增益。协议非常简单甚至不需要SPI外设GPIO模拟就够但正因为协议太简单它把所有功能都塞进脉冲时序里想读B通道或者换增益得严格数脉冲很容易搞混。CS1237是两线DRDY和SCLK看起来和HX711差不多其实要多一层命令交互。它需要在读数据之前或之后通过SCLK发送命令字节来配置寄存器比如选增益、设速率、控制基准源。第一次上手的人如果不仔细看命令时序很容易出现DRDY一直拉不低、读出来的数据是错的这类情况。TM7707则是正经的SPI接口DIN、DOUT、SCLK、DRDY四根线寄存器好多组配置起来最灵活但状态机也最复杂。你得像操作一个完整的ADC外设芯片一样先复位、再配置时钟寄存器、滤波寄存器、设置寄存器最后才能读数据。初中学过来的STM32或者ESP32用户反而会觉得这种寄存器式操作很熟悉。如果说软件工作量排序HX711最简单CS1237居中TM7707最复杂。但换来的是TM7707的双通道和更多自由度这个取舍要清楚。3. 应用场景匹配与选型决策路径3.1 电子秤与力传感器HX711的舒适区如果你做的是电子秤、厨房秤、人体秤、拉力计或者任何以电阻应变式电桥传感器为核心的测力设备HX711几乎是第一选择。原因不只是便宜更核心的是它片内集成了稳压输出可以直接给桥式传感器供电外围器件极少一块小板子就能把信号调理和ADC全搞定。我用HX711做过几款称重方案最大的体会是它的抗噪声表现在这个价位已经足够了。传感器在静态称重时信号本身就比较稳定HX711的17到18位有效位配合合适的滤波算法显示分辨率做到0.1克级别没有问题。而且它通道A的PGA增益固定档位清晰满量程处理简单。当然HX711也有明显的短板没有外部基准没法做真正意义上的高精度绝对电压测量内部没有温度传感器想做温度补偿得靠外部通道B虽然能用但增益固定32实际很少人用。这些限制决定了它就是称重专用不要拿它去测热电偶或者做多通道采集那是自己给自己找麻烦。3.2 便携仪表与高精度单通道CS1237的升级价值如果你发现HX711的精度满足不了需求或者你需要的是一个更通用的小信号采集前端比如便携式PH计、小型拉力测试仪、高精度电流检测模块那CS1237是性价比很高的升级选项。CS1237的有效位数比HX711高出好几个比特这在实际测量中的体现非常直观。同样一只传感器用HX711读数末位跳动可能有几十个码换CS1237之后末位跳动可以控制在几个码以内再配合滤波稳定度提升显著。再加上它的PGA增益范围更广从1倍到128倍都能配意味着你可以直接采集已经放大过的信号也能采集毫伏级的原始传感器信号灵活性比HX711大很多。CS1237的片内温度传感器也很实用。虽然它的精度不能当真正的温度计用但可以用来做零点温漂补偿的辅助参考在变温环境下记录一下内部温度再对ADC读数做线性修正效果很明显。这个功能在HX711上是没有的。还有一个容易被忽略的点CS1237支持自校准和系统校准。系统校准可以在上电后短接输入完成零点和满量程校准进一步抵消PGA失调和基准误差这是HX711不具备的。3.3 双通道工业采集与变送器TM7707的用武之地如果项目里需要同时采集两路模拟信号比如同时测温度和压力、监测两路传感器的输出再或者正在做变送器、PLC模拟量输入模块TM7707这种双通道器件就体现出价值了。TM7707寄存器风格和AD7705兼容很多老工程师一看到它的寄存器列表就很熟悉上手成本低。两个通道可以配置成不同的增益和速率用多路复用开关逐通道采集最常用的场景就是一路接热电偶测温、一路接压力传感器测力再配合片内温度传感器做冷端补偿。TM7707的优势还在于它的SPI接口。在工业环境里使用MCU的硬件SPI加上中断引脚等待DRDY实时性和可靠性都比GPIO模拟两线协议更稳妥。我在做变送器的时候习惯用外部基准、把更新速率配置在20Hz以内这样16位的分辨率可以发挥得很充分非线性误差也在可接受范围内。当然TM7707也有让人头疼的地方寄存器太多配置顺序错了或者漏了一步整条链路就完全不对。后面软件部分我会详细说配置流程。3.4 一张选型路径图文字版如果你看完前面还是纠结我给你一个非常直白的判断路径照着自己的需求过滤就行。第一步看通道数。一路信号进入下一步。两路信号直接看TM7707除非你决定用两个CS1237。两个单通道芯片成本不一定比一个双通道高但PCB和代码复杂度会上去。第二步看是否做称重。电阻应变式电桥、体重秤、拉力计直接用HX711省事便宜如果觉得精度不够再看CS1237。第三步看精度需求。需要一个稳定在20位以上有效位的单通道采集链路选CS123716位够用、数据刷新率要求高一些、又需要双通道选TM7707。第四步看接口。MCU还有空闲SPI外设、习惯寄存器式的操作TM7707是不错的选择想用GPIO硬怼简单协议HX711和CS1237更合适其中CS1237协议比HX711稍复杂但换来更高精度。总结成一句话就是称重计量找HX711单路高精度找CS1237双通道灵活采集找TM7707。4. 实操要点从电路到布局的硬功夫4.1 电源、去耦与基准处理高精度ADC是出了名的吃电数字电源稍微带点纹波模拟部分就会在码值上体现出来。这三颗芯片都支持比较宽的供电范围但实际使用不要直接把开关电源的输出怼到AVDD引脚上尤其是带DCDC的场景纹波噪声会直接耦合到模拟通路。我的做法是给ADC单独加一个低噪声LDO比如常用的AMS1117规格就够了再配合RC滤波在靠近AVDD引脚放置0.1μF陶瓷电容和10μF钽电容。数字电源和模拟电源如果来自同一路中间最好用磁珠或者小电阻隔开形成简单的π型滤波这样高频噪声会被有效衰减。基准部分HX711没有外部基准脚按手册评估板建议接好VFB就行。CS1237如果选外部基准接口就是PGA和基准之间的那根引脚务必用0.1μF加1μF双电容去耦布局时电容要紧贴基准输入引脚。TM7707的REFIN引脚更讲究差分输入的两个基准引脚之间需要加高质量电容否则基准上的共模噪声会直接变成测量误差。4.2 PCB布局时的几个关键原则高精度ADC的PCB布局核心就一句话敏感的模拟信号走线要短、要对称、要远离数字线。先说传感器差分信号线。不管是电桥输出还是热电偶引线进入ADC之前尽量走差分形式两根线紧贴着走间距保持一致不要被其他信号线穿过。如果板子空间紧张至少要做到包地处理给差分线两侧各加一条地线并在末端连通这能让外界干扰成对耦合到两根线上再被ADC的共模抑制能力抵消掉。再说地平面。我见过很多人在ADC下面直接开一条窄走线当地导致模拟地和数字地之间形成大环路噪声指数级上升。正确的做法是整块敷铜地把模拟地和数字地在ADC芯片下方单点汇合或者使用零欧电阻/磁珠连接保证电流回路短。最后PD_SCK、SCLK、DIN这些数字信号虽然只是几根控制线但也不能横穿模拟输入区域。尤其在两层板上数字走线在顶层跑模拟输入很容易在底层被平行走线感应出噪声。我习惯把数字控制和模拟输入分别放在芯片两侧中间用地线隔离。4.3 接口防护与长线传输工业现场用这三类ADC经常会面临传感器线缆很长的情况几米甚至几十米。这时候除了信号完整性还要考虑静电和浪涌防护。最常见的破坏路径是传感器线缆受到静电放电或者感应雷击瞬态高压直接打进ADC引脚轻则数据乱跳重则芯片报废。解决方案是在传感器差分输入端对地各加一颗低漏电流的TVS管可以选择结电容比较小的型号避免影响信号带宽。如果应用环境确实恶劣再串接小阻值电阻限制瞬态电流同时给ADC输入引脚留一点耐压余量。长线传输还要注意屏蔽层接地。屏蔽层最好单端接地接在模拟地一侧避免形成地环路导致工频干扰。曾经有个项目传感器线缆屏蔽层两端都接地结果50Hz干扰巨明显把一端断开后噪声立刻掉下来。这些经验不写在芯片手册里但实际工程中非常重要。5. 软件配置与数据滤波实战5.1 三颗芯片的读取流程差异软件层的第一步是搞清楚每颗芯片的握手方式。HX711最简单DOUT高电平时芯片忙DOUT变成低电平说明一个新转换周期完成。这时读PD_SCK的下降沿数据连续收24个数据位就拿到原始值。之后再给额外脉冲切换通道给25个脉冲表示A通道增益12826个脉冲是B通道27个脉冲是A通道增益64。这个状态是锁存的所以下次读之前想切回A通道增益128必须再发一次25个脉冲。CS1237就多了一层命令交互。DRDY拉低表示数据就绪之后主控通过SCLK向芯片发送命令字节比如读数据命令、写寄存器命令等。配置增益、输出速率、是否开内部基准都得先写入对应寄存器。第一次上电后强烈建议先发一次复位命令否则芯片可能处于不确定状态DRDY行为不正常。TM7707的SPI流程更像操作一块完整的模拟前端。上电后先对片选做一次复位时序然后按顺序写通信寄存器指定操作目标再配置时钟寄存器、滤波寄存器、设置寄存器最后触发校准。每完成一次配置都建议读回校验。DRDY引脚变为低电平代表启动校准或者转换完成这时候才能去读数据寄存器。5.2 配置与读取代码框架这里我放三颗芯片的参考代码框架用C语言写适合STM32或GD32这类MCU。先看HX711uint32_t HX711_Read(uint8_t gain_pulses) { uint32_t raw 0; while (HX711_DOUT); // 等待DOUT拉低转换完成 for (int i 0; i 24; i) { HX711_SCK_GPIO(1); delay_us(1); HX711_SCK_GPIO(0); raw (raw 1) | HX711_DOUT_READ(); delay_us(1); } for (int i 0; i gain_pulses; i) { HX711_SCK_GPIO(1); delay_us(1); HX711_SCK_GPIO(0); } return raw; }注意HX711的24位数据是二进制补码最高位为1表示负值。如果读到的值要参与运算最好转成int32类型int32_t HX711_ToSigned(uint32_t raw) { if (raw 0x800000) raw | 0xFF000000; return (int32_t)raw; }CS1237的读取流程多了命令字操作。这里只给出简化的框架具体命令字务必对照手册来uint32_t CS1237_ReadData(void) { uint32_t raw 0; while (CS1237_DRDY); // 等待DRDY拉低 CS1237_SCLK_GPIO(0); // 发送读数据命令例如 0x00 CS1237_SendCmd(0x00); // 再读24位数据时序细节以手册为准 for (int i 0; i 24; i) { CS1237_SCLK_GPIO(1); delay_us(1); raw (raw 1) | CS1237_DOUT_READ(); CS1237_SCLK_GPIO(0); delay_us(1); } return raw; }TM7707的初始化代码长一些核心思路是先复位再配置void TM7707_Init(void) { // 复位时序连续拉高DIN并给SCLK脉冲 TM7707_Reset(); // 写通信寄存器选择时钟寄存器并写入分频参数 TM7707_WriteReg(REG_COMM_SETUP, REG_CLOCK_CONFIG); // 写滤波器寄存器配置输出速率 TM7707_WriteReg(REG_COMM_FILTER, FILTER_50HZ); // 写设置寄存器配置增益、单/双极性、自校准 TM7707_WriteReg(REG_COMM_SETUP, SETUP_GAIN1 | SETUP_BIPOLAR); // 触发自校准 TM7707_WriteReg(REG_COMM_CAL, CMD_SELF_CAL); }TM7707寄存器操作最需要小心的是通信寄存器的前几位会决定后面字节写入哪个寄存器写错了整个链路的配置就错乱了。建议每写完一个寄存器读回来验证一遍再往下走。5.3 数据滤波从原始码值到稳定读数ADC原始码值直接拿来显示或者做控制通常会很飘尤其是HX711这种有效位数不算高的芯片。数字滤波是绕不过去的一步。最简单的方案是滑动平均。维护一个环形缓冲区新样本进来把最老的样本顶掉对缓冲区里的值求平均。加滤波之后显示值明显稳了很多。#define FILTER_N 16 uint32_t filter_buf[FILTER_N]; uint8_t filter_idx 0; uint32_t filter_sum 0; uint32_t Filter_AddSample(uint32_t sample) { filter_sum - filter_buf[filter_idx]; filter_buf[filter_idx] sample; filter_sum sample; filter_idx (filter_idx 1) % FILTER_N; return filter_sum / FILTER_N; }如果原始值偶尔会有大的毛刺比如工业现场有电机启停干扰滑动平均会把毛刺的影响分散到N个点上还是不够干净这时候可以先用中位值滤波剔除飞点再做滑动平均。比如连续采5次取中间值作为一次有效样本再进滑动平均。代价是响应变慢但抗脉冲干扰能力很强。滤波窗口长度也要注意。HX711在10Hz输出率下16点滑动平均相当于1.6秒显示一次刷新这在静态称重没问题但如果做动态称重反应就太慢了。我一般会根据系统允许的响应时间倒推窗口大小响应时间0.5秒采样率10Hz窗口最多5点。5.4 校准思路零点、满量程和温漂补偿滤波只能解决随机噪声解决不了系统误差。系统误差的出路是校准。基本的校准流程是零点校准和满量程校准两步。零点校准就是让传感器空载记录ADC输出值之后每次读数减去这个零点码值。满量程校准则是放一个已知质量的砝码或者已知数值的标准信号源记录输出值算出每码值对应的物理量也就是标度系数。CS1237和TM7707都支持片内校准命令校准时硬件会自动把输入短路或者接入内部参考做一次转换从结果中提取PGA失调然后自动修正后续输出。这个校准命令在上电后、正式采样前执行一次效果很直观能明显减少零点偏移。温漂补偿更进阶一点。如果你的产品工作温度范围宽零点会随时间漂移。我常用的办法是通过CS1237或者TM7707的片内温度传感器读取芯片温度开机后先在多个温度点做零点采样拟合出一条温度-零点偏移曲线正常工作时按当前温度查表修正。这么做不复杂但对精度改善非常明显仪器仪表类产品基本都会用到。6. 常见问题与排查技巧实录6.1 典型故障速查表实际项目中遇到的问题五花八门但大部分都能归类到下面几个典型情况。我整理了一个速查表方便你排查时直接对照。现象可能原因排查与解决读数乱跳、末位不停滚电源纹波大、基准去耦不足、差分线受干扰先看波形检查AVDD和基准引脚纹波加强RC滤波检查差分线包地情况读数固定为0或满量程增益配置错误、输入短路、基准未使能用万用表测输入差分电压检查寄存器配置HX711检查脉冲数是否选对通道HX711 DOUT一直为高RATE引脚状态不确定、传感器超量程导致输出饱和检查RATE引脚上拉/下拉确认传感器激励电压和输出范围CS1237 DRDY一直不拉低上电后通信状态错误、命令时序不对先发复位命令重新配置寄存器用示波器看DRDY和SCLK波形TM7707读数完全不对通信寄存器选错、时钟寄存器和晶振不匹配读回所有寄存器逐项核对确认主时钟频率和分频系数一致接上传感器数值跳变剧烈传感器线缆过长、屏蔽层未接、TVS结电容过大检查屏蔽层单端接地确认TVS结电容不会明显衰减信号6.2 我实际踩过的几个坑第一个坑是HX711的RATE引脚悬空。早期做样板为了省一个电阻RATE没接上下拉结果同一批板子有的输出10Hz有的输出80Hz显示刷新率不一样排查了老半天。后来老老实实加上拉固定到10Hz一切正常。HX711这种引脚即配置的芯片悬空引脚就是隐患。第二个坑是CS1237上电后没发复位命令就把配置寄存器的值写进去结果DRDY一直拉高读不到数据。后来查资料发现芯片上电状态并不保证寄存器内容有效必须先复位一次再写配置。这个顺序问题在批量生产的板子上特别容易爆发因为有些批次上电运气好就能工作换了批次就罢工。第三个坑是TM7707的晶振频率与滤波寄存器配置不匹配。我一开始图省事晶振选的12.8MHz寄存器却按默认值配置输出速率完全不对读到的数据像是在乱码边缘。后来严格按手册计算分频系数重新配置滤波寄存器数据才正常。这颗芯片的寄存器不是设一次就不管了每次初始化都要认真对一遍时钟参数。还有一个通用教训传感器和ADC之间的地线处理。有一版PCB我为了省事把传感器地直接接到数字地结果有效位数掉了好几个比特。后来改成模拟地单点汇聚噪声立刻降下来。高精度全是细节堆出来的这个行业里没有差不多这三个字。说了这么多最后再分享一个实际体会。很多人以为换一颗更贵的ADC精度就自动上去了其实芯片只是信号链的一环真正决定性能的是传感器、基准、PCB布局、软件滤波一起成的系统。我也曾经满怀期待把HX711换成CS1237发现噪声没降多少后来重新铺了地、加了滤波才把性能提上去。所以做高精度采集先冷静下来把供电、去耦、走线这几个基本功练扎实再谈芯片选型你会少走很多弯路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进