HX711称重传感器方案详解:原理、接线、标定与常见问题
简介:本资源是一套面向嵌入式开发者与电子爱好者的基础称重系统开发代码包,聚焦HX711高精度24位ADC芯片在称重传感器中的典型应用,解决模拟信号采集、数字转换与重量标定等核心问题。压缩包为4KB的RAR格式,共含3个源码文件:2个C文件(实现HX711底层驱动与主控逻辑)和1个头文件(定义寄存器操作、增益配置及去皮功能接口),结构简洁,便于移植至STM32、Arduino等主流平台。已有3570人学习下载,适用于厨房秤、小型工业秤等10kg量程场景的快速原型验证。读者可直接获取经过初步测试的HX711通信时序实现、AD值读取与校准逻辑、以及支持去皮运算的软件框架,显著降低从传感器接线到重量显示的开发门槛,尤其适合初学者理解称重模块软硬件协同设计的关键路径。 做电子秤、配料机、拉力计、液位检测,十有八九都会遇到HX711这颗芯片。我第一次接触它,是给实验室做一台微量粉末灌装机,当时对ADC选型没什么经验,只知道要测悬臂梁式称重传感器输出的微小电压变化。后来被反复推荐HX711,才意识到这东西在开源硬件圈里属于“标配级”方案。HX711是一颗24位高精度ADC,专门为电阻应变式称重传感器设计,内部集成稳压电源、可编程放大器、两线数字接口,配合Arduino、STM32或者树莓派都能快速做出一个实时称重系统。这篇文章既适合刚入门想复刻一台电子秤的爱好者,也适合做产品原型需要快速验证方案的工程师,我会把原理、接线、代码、标定和踩坑过程全部捋一遍。
HX711之所以能成为主流,核心原因是它把“模拟前端”最难搞的部分全包了。称重传感器的输出信号通常只有毫伏级,普通单片机的ADC根本测不到有效变化,需要高精度仪表放大器加外部基准源,这一套自己做起来非常麻烦。HX711把稳压、放大、采样、串行输出集成在一颗芯片里,外围只需要几个电容电阻,成本还压得很低,所以不管是学生项目、创客作品,还是工业仪表初版原型,大家都习惯先拿它跑通逻辑。
1. 为什么DIY称重项目几乎都绕不开HX711
1.1 它能做什么,适合什么人
HX711最大的价值,是把“传感器模拟小信号”和“MCU数字逻辑”之间那条鸿沟填平了。称重传感器内部是电阻应变片组成的惠斯通电桥,受力后桥臂电阻失衡,输出一个几毫伏的差分电压。这个电压直接用万用表都很难稳定读数,更别说让单片机去判断重量变化了。HX711做的就是把这一路差分信号放大、滤波,再用24位ADC转换成数字量,通过两根线送给MCU。
适合用HX711的场景包括:小量程电子秤、厨房秤、颗粒物料秤、拉力测试工装、压力计、液位高度换算,甚至是一些简易的物料缺失检测。只要你的传感器是电阻应变式电桥结构,量程从几十克到几十吨,HX711都有对应方案。需要注意它只负责“采集”,不负责“控制”,电机启停、电磁阀开关这些动作还是由MCU来完成。
如果你是做产品开发,HX711也很适合用来验证核心算法和样机功能。我见过不少商用仪表,第一批原型就是用HX711做数据采集,确认方案后再换更高端的专用ADC芯片。原因是HX711的资料极其丰富,驱动库和示例工程随手就能找到,系统的软硬件联调时间可以大幅压缩。
1.2 一套称重系统大概要花多少钱
很多新手一开始最关心的就是成本。以2024到2025年的行情看,一块常见的HX711模块(红底或蓝底小板)零售价在2到5元人民币,一颗裸芯片批量采购大概1到2元。常见的铝制悬臂梁称重传感器,量程1kg到20kg的,单价也就5到15元。也就是说,一套能用Arduino读数的称重系统,物料成本控制在20元以内完全没问题。
这也解释了为什么HX711在开源社区这么火:学习门槛极低,试错成本几乎可以忽略。不过要注意,低成本也意味着性能天花板,它内部ADC的线性度、温漂和噪声指标,和工业级24位ADC芯片相比还有差距。如果你要做贸易结算秤或者高精度配料秤,后期还是要重新做信号链设计。我的经验是,先把HX711跑通整个逻辑框架,等系统验证完毕再整体升级,性价比最高。
2. 原理拆解:从应变电桥到24位ADC
2.1 电阻应变片与惠斯通电桥
要理解HX711,先得明白称重传感器的输出信号到底长什么样。大多数称重传感器的核心是电阻应变片,它贴在弹性体表面,弹性体受力变形时,应变片跟着拉伸或压缩,电阻值发生微小变化。一片应变片单独用没有意义,因为电阻变化率只有千分之几甚至更低,所以通常把四片应变片接成惠斯通电桥结构。
惠斯通电桥的妙处在于,它能把“电阻变化”转换成“电压变化”,而且天然抵消温度带来的共模干扰。电桥的供电端接激励电压,另外两端输出差分信号,当电桥平衡时输出为零,受力后输出一个正比于外力的微小电压。例如一个额定供电5V、灵敏度2mV/V的传感器,满量程时输出大约是10mV。10mV在放大器眼里就是一个非常微弱的信号,必须经过高增益放大才能被ADC有效量化。
我第一次接传感器时犯过一个错,以为直接把输出端接到HX711的A+和A-就行,结果读数跳得没法看。后来查手册才意识到,传感器的激励端和HX711内置稳压输出之间要按规格接好,而且电桥的公共端、供电地、信号地必须共地处理,否则共模电压会直接把放大器的有效动态范围吃掉。这些小细节在原理图上不明显,实际接线时影响非常大。
2.2 HX711内部到底做了什么
HX711内部可以粗略分成三个功能块:稳压电源、可编程增益放大器、24位Sigma-Delta ADC及数字接口。稳压电源负责给外部称重传感器提供稳定的激励电压,通常可以输出2.7V到5.5V之间,用VAVDD引脚引出。因为电桥的输出和激励电压成正比,激励电压稳定了,测量结果才稳定。
可编程增益放大器提供三档增益:32、64和128。对应内部通道分别是:通道B固定增益32,通道A可编程增益64或128。称重场景最常见的是通道A配128倍增益,因为传感器输出信号只有几毫伏,放大到ADC可分辨的范围才能把重量变化看清。选择增益时要估算一下满量程信号放大后的电压,如果超出ADC参考范围就会饱合,读数在接近满量程时变得不平缓。
24位Sigma-Delta ADC则是把放大后的模拟信号持续采样、积分、数字滤波,最终输出24位二进制补码。输出数据率通常可选10Hz或80Hz,10Hz时噪声更低,适合静态称重;80Hz时响应更快,适合快速测量但噪声稍大。我在做动态拉力监控时用80Hz,做静态重量复核时用10Hz,这个要根据实际需求切换。
2.3 两线接口的时序真相
HX711对外只有两根通信线:PD_SCK(时钟)和DOUT(数据)。说它像SPI并不准确,因为没有一个独立的片选信号,数据读出的时序由PD_SCK脉冲个数控制。当DOUT变为低电平时,表示一次转换完成,MCU开始发送24个时钟脉冲,每个脉冲的下降沿读取一位数据,从最高位到最低位依次读入。
读取完24位之后,可以接着发送额外脉冲来切换通道和增益:再发1个脉冲并保持一段时间,选择通道A、增益128;发2个脉冲选择通道B、增益32;发3个脉冲选择通道A、增益64。这个配置在下一次转换时生效。如果一直用同一通道,很多现成库只在初始化时设置一次,之后每次读取只发24个脉冲就够了。
我见过有人在时序上栽跟头,原因是单片机的IO时序没对准,导致读出来的24位数据整体错位,重量变化完全不对。排查方法是先用逻辑分析仪抓PD_SCK和DOUT,确认DOUT拉低后,MCU是否在125毫秒内开始发送脉冲。HX711要求DOUT变低后要尽快读取,如果间隔太长,芯片可能会自动进入下一次转换,数据就丢了。
3. 硬件接线与选型注意点
3.1 传感器四根线怎么接
经典的称重传感器引出4根线:激励正(E+)、激励负(E-)、信号正(S+)、信号负(S-)。不同厂家的线颜色定义不完全一样,但最常见的约定是:红色接E+,黑色接E-,绿色接S+,白色接S-。也有个别品牌用蓝色当S+、黄色当S-,接线前一定先看传感器附带的数据手册,不能凭颜色硬套。
对应到HX711模块上,通常有VCC、GND、SCK、DOUT,以及传感器侧的A+、A-、B+、B-。四线传感器接到A通道时,S+接A+,S-接A-,E+和E-则接到模块的VCC和GND附近。具体怎么接要看你买的是全接口模块还是精简模块,有些模块把E+/E-固定接到了内部稳压输出,你只需要接S+和S-。
我第一次买的模块引脚标记是“红黑绿白”一一对应,结果接反了S+和S-,读数变成负数。其实接反不会烧芯片,只是输出数值完全反向,后续软件里把A+和A-对调,或者把符号取反就能解决。但如果你用的是大激励电压的传感器,接线前还是要仔细核对,避免反接造成器件损坏。
3.2 供电、滤波与接地经验
HX711的供电范围一般是2.6V到5.5V,多数模块带稳压电路。直接给模块供电时,优先用稳定的LDO或者模块自带的稳压输出,尽量别用波动大的开关电源,因为ADC的参考电压受供电影响,供电纹波会直接体现在读数上。Arduino的5V引脚供电一般够用,但如果传感器是大功率型号,要考虑电流余量。
接地是另一件容易被忽略的事。称重传感器属于微弱信号测量,模拟地和数字地处理不好,读数会周期性抖动。我通常的做法是:传感器激励地和HX711模块的地,以及MCU的地,全部用粗短线连接成星型接地,避免形成地环路。如果系统里有电机、继电器这类感性负载,一定要和称重电路物理隔离,或者用光耦隔离驱动信号。
滤波电容也不可少。初次做项目时我用了一个没有滤波电容的模块,读数一直有0.5克左右的波动,后来在传感器激励端并联一个100微法电解电容,再在信号输入端并联一个0.1微法陶瓷电容,波动明显下降。具体容值不必太死板,但至少保证激励源干净,对最终效果的影响很直接。
4. 程序实现:Arduino读取HX711的完整流程
4.1 最小可用代码
程序方面,最省力的办法是直接用成熟的HX711库,例如bogde/HX711。它把驱动封装得很干净,读取、去皮、设置增益都很直观。下面这个例子是Arduino平台最简代码,读10次取平均后通过串口打印重量:
#include "HX711.h"
const int DOUT_PIN = 3;
const int SCK_PIN = 2;
HX711 scale;
void setup() {
Serial.begin(9600);
scale.begin(DOUT_PIN, SCK_PIN);
scale.set_scale();
scale.tare();
}
void loop() {
if (scale.wait_ready_timeout(1000)) {
float weight = scale.get_units(10);
Serial.print("weight: ");
Serial.println(weight, 2);
}
delay(500);
}
注意这段代码里的 set_scale() 不带参数,表示先不设置比例系数。在完成标定之前, get_units() 返回的是未经换算的原始重量,不代表克数。很多新手在这里会疑惑:“为什么我放100克砝码上去,输出的数字不是100?”原因就是scale系数还没标定。
4.2 24位补码和符号位处理
如果你不用库,想自己写驱动,就必须理解HX711的24位数据格式。DOUT输出的24位数据是二进制补码,最高位是符号位。正数直接按无符号数理解就行,负数则需要先取反加一才能得到绝对值。读取的时候,一般是这样一段逻辑:DOUT拉低后,循环24次,每次给PD_SCK一个高电平脉冲,在脉冲下降沿把DOUT的电平按位移进一个32位变量。
下面是一个标准的自写读取函数示例:
uint32_t readHX711() {
uint32_t value = 0;
while (digitalRead(DOUT_PIN) != LOW) {} // 等待数据就绪
for (int i = 0; i < 24; i++) {
digitalWrite(SCK_PIN, HIGH);
value <<= 1;
if (digitalRead(DOUT_PIN)) {
value |= 0x01;
}
digitalWrite(SCK_PIN, LOW);
}
// 补码转有符号数
value ^= 0x800000;
return (int32_t)(value - 0x800000);
}
上面代码把24位数据先读成无符号值,再通过异或和减法转成有符号数。这样处理以后,正数和负数都能正确表达。实际项目中也可以用更简洁的方式,比如先判断第23位是否为1,如果是负数就做符号扩展。
4.3 如果不用库,怎么写驱动
自己写驱动的核心流程就三步:等待DOUT拉低、读24位数据、按需发送通道切换脉冲。在Arduino里直接用digitalRead和digitalWrite就可以,但在性能紧张的系统里,建议改用寄存器级IO操作,避免脉冲间隔抖动影响时序。
我测试过,用Arduino自带的digitalWrite,读一次大约要几百微秒,对10Hz输出率的HX711来说绰绰有余。但如果你用80Hz输出率,并且还要同时驱动屏幕、步进电机,那最好把读数据放到定时器中断里,或者用快速IO库。驱动代码本身不复杂,难点在于和系统其他任务的时序协调。
4.4 换到STM32怎么办
如果用的不是Arduino而是STM32,读取逻辑完全一样,只是IO操作方式不同。可以用HAL库的 HAL_GPIO_ReadPin 和 HAL_GPIO_WritePin ,也可以用寄存器直接操作。需要注意STM32的GPIO翻转速度很快,反而要防止SCK频率过高,HX711虽然支持较高的时钟频率,但建议控制在100kHz以下,避免信号完整性出问题。
在STM32工程里我习惯用定时器做10ms周期采样,每次采样读一次HX711,再用滑动平均滤波。这样能保证称重数据的更新频率稳定,不会因为主循环里其他任务阻塞导致读数卡顿。如果你有RTOS,把HX711读取放到独立任务里,优先级给中等,效果更理想。
5. 标定实操:把原始读数变成“克”
5.1 两点标定的原理
HX711输出的原始值和实际重量之间是线性关系。理论上只要知道两个点的坐标,就能算出比例系数和偏移量。最常见的是两点标定:第一个点是零点的ADC读数,第二个点是用一个已知标准砝码测出的ADC读数。因为称重传感器的线性度通常很好,两点连线在整个量程内有足够精度。
有些新手为了“更准确”,会用三个甚至五个点做分段标定。实际做下来,如果不是传感器本身非线性严重,两点标定已经能满足绝大多数电子秤需求。分段标定更适合传感器线性度差或者需要高精度贸易计量的场合。考虑到HX711本身的线性度,做太多点反而会引入人为误差。
5.2 标定步骤与代码
标定的操作流程可以这样走:先空秤状态下读取几十次原始数据求平均,记录为offset;再把一个已知重量的砝码放上去,读取平均值减去offset,得到差值;用砝码重量除以这个差值,得到scale系数。有了scale和offset,实时重量就等于(当前读数 - offset)/ scale。
我常用的标定代码片段如下:
void calibrate() {
float reading_0 = scale.get_units(20);
delay(500);
// 此时放上标准砝码,比如100g
Serial.println("Place 100g weight, then press any key");
while (Serial.available() == 0) {}
while (Serial.available() > 0) Serial.read();
float reading_100 = scale.get_units(20);
float scale_factor = (reading_100 - reading_0) / 100.0;
scale.set_scale(scale_factor);
scale.tare();
}
这里 reading_0 和 reading_100 都是原始读数, scale_factor 表示每个ADC计数对应的克数。实际执行时,我会多测几次,取平均值,并且确保砝码放的位置和后续正常使用时一致。因为悬臂梁传感器对受力点位置敏感,放偏了标定出来的系数会整体偏移。
5.3 去皮和滤波
去皮是称重系统的基本功能。操作上很简单,在传感器稳定且没有负载时,把当前读到的原始值记作tare值,后续所有读数都减去这个值。HX711库自带的 tare() 函数就是这么实现的。但在实际产品中,我建议把tare值保存到EEPROM,断电后再上电还能保持零点,不然每次开机都重新去皮会造成体验问题。
滤波同样重要。HX711在10Hz输出率下本身噪声较小,但机械振动、气流扰动依然会让最后一两位数据波动。我在采集称重数据时,通常会做3到10次滑动平均,或者使用一阶低通滤波。滤波系数不宜过大,否则称重响应会变慢,放上砝码后要很久数字才稳定。
6. 常见问题与排查技巧实录
6.1 数据狂跳、数值漂移
数据狂跳是最常见的故障现象。排查顺序建议是先检查硬件再检查软件:先看传感器激励电压是否稳定,接着摸一下芯片温度是否异常发热,然后看接线是否松动,尤其是DOUT和SCK这两根信号线,线一长就容易受干扰。把传感器和模块之间的连线缩短,或者换屏蔽线,往往能解决大部分问题。
数值漂移则通常和温度、时间有关。开机前几分钟漂移大多是因为芯片和传感器还没达到热平衡,属于正常现象;开机很长时间还持续漂移,就要怀疑传感器本身老化或者受潮了。我遇到过一颗传感器在潮湿环境下零点漂移非常大,放干燥箱一段时间后恢复正常,这种情况下换密封等级更高的传感器更靠谱。
6.2 满量程不准、非线性明显
如果小重量标定很准,但接近满量程时读数偏差变大,说明传感器受力结构有问题。常见原因包括:砝码放置位置偏离受力中心、传感器安装底座不水平、机械结构存在应力释放时间。检查一下安装面是否平整,传感器固定螺钉是否均匀拧紧,很多时候能解决非线性问题。
还有一种情况是传感器量程选得不对。比如用1kg传感器去测800g以上的物品,接近满量程时非线性自然明显。选用量程时最好留出30%到50%的余量,让传感器工作在特性最好的区间。测力方向也要严格和传感器标定方向一致,侧向力会直接影响测量精度。
6.3 常见问题速查表
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 读数一直为0或无变化 | DOUT线接错或者模块供电异常 | 检查5V/GND,确认DOUT引脚有电平变化 |
| 读数跳变剧烈 | 供电纹波大或接线过长 | 加强滤波电容,缩短信号线,使用屏蔽线 |
| 读数全是负数 | 信号线接反或受力方向反了 | 交换S+和S-,或者软件取反 |
| 放上重物读数不变 | SCK/DOUT接反 | 调换两根信号线,再用逻辑分析仪查看 |
| 标定后换量程不准 | 传感器选型不合适 | 选择合适量程并重新标定 |
| 长时间漂移 | 传感器受潮或老化 | 更换传感器,做好密封保护 |
| 读数有周期性波动 | 地线环路或者附近有开关电源 | 星型接地,隔离干扰源 |
这个表基本覆盖了我遇到过的90%问题。遇到新问题时,不要急着改代码,先用万用表量供应电压、用示波器看DOUT波形,往往比瞎调试更快。
7. HX711与HX710:名字像,用途差很多
7.1 参数差异速览
标题里同时提到HX711和HX710,这两个名字相近的芯片在实际用途上差别很大。很多新手选型时会把它们混在一起,其实搞清楚之后很容易记住:HX711偏向称重传感器信号采集,HX710偏向气压、压力传感器等需要内置基准源的场景。HX710也是一颗24位ADC,但它内部集成了基准电压源,搭配MEMS气压传感器可以直接输出气压对应的数字量,而HX711的参考电压和稳压输出是为电桥传感器准备的。
从增益配置看,HX711有通道A和通道B,增益可编程为32、64、128,灵活度更高;HX710通常只有固定增益,通道数量也以测量气压的差分输入为主。输出速率方面,HX710可以做到更高一些,适合需要快速响应的压力测量。简单说,两者都是高精度ADC,但一个是为“称重”优化,一个是为“气压/差压”优化,不能盲目替换。
7.2 按场景选型
如果你要做电子秤、厨房秤、拉力计、配料系统,直接选HX711。它对外部电桥传感器的适配性最好,资料也最多,开源社区搜“HX711”,很容易找到完整方案。如果你要做的是高度计、气压计、呼吸机压力检测这类应用,那么HX710更合适,因为它内置基准源,配合特定压力传感器可以减少外围器件。
这里特别提醒一点:HX710的模块整体设计和HX711不同,常见的是直接把MEMS压力传感器和ADC做在一起,输出端仍然是两线接口,但数据含义需要按具体传感器手册换算成气压值。不要看到“24位ADC”就觉得可以代替HX711,传感器接口和基准设计不同,硬换会出很多兼容性问题。
7.3 最后分享一点我的选型心得
我个人的经验是:在做称重项目前,先把传感器量程、激励电压、灵敏度这三项写清楚,再回到HX711的数据手册里核对增益和输入范围。HX711虽然好用,但也不是万能的,它的输入范围有限,大信号传感器需要提前分压或降低增益。HX710的例子也说明,芯片选型要看整体信号链,而不是只看“是不是24位ADC”这一个指标。
如果你是在做教学演示或者原型验证,我建议先用现成模块加Arduino把整套流程跑通,标定、滤波、去皮这些逻辑确认无误后,再考虑换成更精密的方案。HX711足够让你理解称重的核心原理,也足够帮你避开“模拟前端调试”这个最大的坑。等你真正踩过一遍硬件问题之后,再看其他ADC芯片的数据手册,思路会清晰很多。
更多推荐
所有评论(0)