资讯动态

基于单片机多功能电子秤设计:HX711称重传感器与标定算法全解析

发布时间:2026/10/20 15:23:44 来源:尧图企业网站定制
做多功能电子秤这件事我一直觉得比它看起来要有意思得多。这篇文章把我近期从零完成的一套基于单片机多功能称重电子秤设计完整记录了下来从传感器的量程选择、信号链搭建、HX711读取与标定到去皮、计价、超限报警这些交互功能的实现再到实测中出现过的各种奇怪现象。整个过程大概花了一周时间中间翻过车也踩过坑但最后做出来的东西长期上电很稳。如果你正准备做一个类似的小项目或者想搞懂称重设备从模拟信号到数字显示的完整链路这篇应该能帮你省下不少试错时间。1. 多功能称重电子秤的设计定位与功能裁剪1.1 先明确“多功能”到底要哪些功能“多功能”这三个字在项目标题里看着简单真正落地的时候最容易失控。网上能搜到的电子秤方案五花八门有的加了蓝牙有的带语音播报有的能做计数秤全部堆上去的话硬件成本和软件复杂度都会成倍上涨。所以第一步不是画原理图而是先把功能边界划清楚。我这边最终圈定的功能分成三类称重类基础功能去皮、单位切换kg/g/lb/oz、峰值保持交易类实用功能单价输入、金额计算、超限报警系统类易用功能自动关机、参数掉电保存、背光控制这个功能列表看起来不复杂但它覆盖了市面上几百块商用电子秤的日常用法。做项目的时候我建议大家也按“基础功能必须做实用功能选着做炫技功能最后做”的顺序来排优先级。基础功能决定秤能不能用交易功能决定秤好不好用系统功能决定体验完不完整。不要一上来就想做物联网称重云平台能用按键把价计算明白已经算是过了最难的交互关。1.2 量程、分辨率、精度目标怎么定设计目标直接决定后面选什么传感器、用什么ADC、怎么标定。我这里确定的目标是称重范围0~5kg显示分辨率1g静态精度控制在满量程的±0.1%以内也就是±5g1kg以内尽量做到±0.5g。这组参数不是我拍脑袋定的。5kg量程覆盖厨房食材、快递包裹、小型零件这些最常见场景1g分辨率对应的是24位ADC加合适增益后很轻松能达到的显示位数而±0.1%的精度指标则是单点式应变传感器加一次线性标定后比较现实的水平。这里必须提醒一句分辨率不等于精度。很多人看到24位ADC就以为能称出0.000001g这是典型的误区。24位只是说明ADC能把满量程输入分成1600多万份但传感器的线性度、机械结构的稳定性、温度漂移等因素才是精度的天花板。就像量角器能画出0.01度但手一抖照样歪。所以设计目标里要把“显示分辨率”和“系统精度”分开写后续每一环节都往这两个目标上靠。2. 称重传感器的选型逻辑与桥路信号特征2.1 应变式传感器为什么会输出“微伏级小信号”做电子秤绕不开应变式称重传感器它内部的核心是四片金属应变片贴在一个弹性体上组成惠斯通电桥。弹性体受力变形时应变片的电阻值会发生变化电桥失去平衡在输出端产生一个与受力近似成正比的差分电压。问题在于这个差分电压实在太小了。我用的单点式铝制双孔传感器额定激励电压5V灵敏度标称1.0mV/V也就是说满量程5kg时输出信号也只有5mV。和单片机的3.3V或5V参考电压相比这几乎等于给一个能测水深的压力表去量一杯水面的波纹。5kg重物压上去电桥输出只有毫伏级变化如果直接接单片机ADC结果就是“坨坨都一样”别说1g分辨率连10g都分不出来。所以整个称重系统的关键根本不是单片机怎么读而是怎么把这5mV的小信号准确放大、无失真地变成数字量。这个环节做得不好后面写再多滤波算法都白搭。2.2 传感器型号怎么选激励电压、灵敏度、安全过载传感器选型有三组参数需要盯紧额定激励电压、灵敏度、安全过载。市面上常见的单点式传感器有1.0mV/V和2.0mV/V两种灵敏度规格激励电压一般推荐5V或10V。选型的时候要配合后级ADC的量程来看我用的HX711在128倍增益下差分输入满量程大约是±20mV配5V激励、1.0mV/V灵敏度的传感器正好能覆盖5kg满量程的5mV输出还有3倍以上的余量。安全过载是指传感器在承受1.2倍左右额定载荷时精度不受影响极限破坏载荷通常到2倍。我选的5kg传感器意味着日常使用最多放6kg超过10kg就可能永久损坏。家用场景通常不会超但如果用来称快递或大件物品建议按最大实际称量的1.5到2倍冗余去选量程。比如最大要称10kg那就买20kg的传感器虽然小信号分辨率会打折但安全性是第一位的。另外传感器本身也有机械安装要求。单点式传感器通常只有中间和两端有几个安装孔受力时必须保证安装面平整锁紧螺丝的扭矩要一致。很多新手做出来的秤读数漂移、非线性严重不是电子问题而是传感器一头锁死一头悬空形变被憋住了。这个问题后面实测章节还会专门说。3. 信号链路搭建从微弱信号到ADC数值的关键选择3.1 为什么我直接用HX711而不是自搭仪表放大器拿到5mV信号之后摆在面前的路有两条一是自己搭仪表放大器加高精度ADC二是用现成的称重专用ADC芯片。我直接选了后者用了最常见的HX711。说“直接选”不太准确其实我是先试过第一条路的用仪表运放把信号放大到0~3.3V再进单片机自带ADC效果惨不忍睹。问题出在三个地方供电纹波会直接叠加到输出上需要额外的参考电压源放大后的模拟信号在传输过程中容易被数字信号干扰而且普通单片机自带的12位ADC只能做到大约4g分辨率和1g目标差远了。HX711这类称重专用芯片最大的价值是把低噪声放大器、24位Sigma-Delta ADC、稳压参考和传感器激励电源做在一个封装里。它用一个电源给传感器供电同时用同一个电源做ADC基准这样电源电压上下波动时传感器输出和ADC基准同步变化相当于做了共模抵消。这段设计对DIY项目来说太友好了相当于帮我把模拟前端的琐碎脏活全干完了。3.2 HX711外围电路与读取时序的实现细节HX711的外围电路非常简单传感器四根线接好电源去耦电容加上再连两根本该接到单片机的SCK和DOUT就能出数。具体接线是这样的传感器红线接E黑线接E-白线接S信号正绿线接S-信号负。注意S和S-千万不要接反接反了读出来的就是负重量。DOUT是数据输出脚默认是高电平当数据准备好之后会拉低。单片机检测到DOUT拉低就开始发25个SCK脉冲前24个脉冲移出24位数据第25个脉冲控制增益和工作模式。我这里固定用128倍增益和10SPS输出速率读出来的原始码值是一个有符号数范围大概是-8388608到8388607。简单的读取代码可以这样写unsigned long HX711_Read(void) { unsigned long raw 0; unsigned char i; HX711_SCK 0; while(HX711_DOUT); // 等待DOUT拉低表示数据就绪 for(i 0; i 24; i) { HX711_SCK 1; raw raw 1; HX711_SCK 0; if(HX711_DOUT) raw; } HX711_SCK 1; // 第25个脉冲切换回128增益 HX711_SCK 0; return raw ^ 0x800000; // 补码转无符号方便后续做减法 }整套链路不需要额外运放不需要外部基准单片机就负责发脉冲、收数据、做数字处理。这也是我认为本项目最适合新手的一个原因硬件上最难的模拟部分被芯片吃掉了但又不至于变成纯“搭积木”项目因为你仍然要理解增益、噪声、标定这些底层的概念。4. 软件标定与数字滤波让读数从“乱跳”变“稳针”4.1 线性标定的本质与两步标定流程ADC读出来的原始码值是一个没有任何物理意义的数字它和重量的关系要靠标定来建立。标定的本质就是一个一元线性方程weight (read_raw - read_zero) / slope。其中read_zero是空秤时的读数slope是“每克对应多少原始码”。两步标定的流程很直接先把秤盘清空读取几十次原始码求平均得到read_zero然后放上一个已知重量的标准砝码再读取几十次求平均得到read_full。slope (read_full - read_zero) / standard_weight。以后每次称重把当前读数减去read_zero再除以slope就是重量。这里有个经验之谈如果手头没有标准砝码尽量不要用瓶装水代替因为瓶子本身的重量和水的蒸发都会引入误差。我第一次做的时候就拿一瓶550ml矿泉水当500g标准物结果标出来的秤在300g处差了2.5g。后来老老实实买了一组标准砝码精度一下就上来了。砝码没到之前可以先用已知重量、稳定不变的金属件做替代但最终还是要用标准砝码复核一次。标定参数最好不只算一个斜率而是做两到三个点的线性修正。比如空秤、1kg、5kg三个点各记录一次中间段用插值或最小二乘拟合。单点标定应对日常称重够用但如果你想追求±0.1%这种指标多点标定几乎是必须的。4.2 滑动平均、静止判稳与去皮逻辑标定完之后直接显示读数你会遇到第二个问题屏幕上的数字一直在跳。原因有两层一是HX711在10SPS输出下本身有±1到2个码值的噪声二是因为传感器机械振动和风的影响真实重量本来就在微变。如果你直接把每次读到的重量丢到显示屏上结果就是数字乱滚。我用的方法分两步先是滑动平均滤波把最近N次重量值取平均再加一个静止判稳逻辑只有当连续几次平均值的变化小于0.3g时才把最终重量刷新到屏幕上。这两步合在一起就解决了“跳字”问题。滑动平均的代码没什么难度关键在窗口长度。窗口太短滤波效果差数字还是跳窗口太长数字反应迟钝东西放上去要等半天才稳定。我实测下来5到10次比较合适对应0.5秒到1秒的稳定时间既平滑又不会太肉。为了快速展示大致重量还可以让显示值先用短窗口临时显示稳定后再切换成长窗口的值这样体验会好很多。去皮功能在逻辑上就是调整基准点按下去皮键后把当前稳定读数记为tare_offset之后显示的真实重量 当前重量 - tare_offset。注意去皮之后如果秤盘上的物品被拿走显示会变成负值。我的做法是计算后若结果接近零就强行显示0.00避免用户看到“-0.00”这种莫名其妙的东西。5. 多功能交互层单价、报警、存储和自动关机的实现5.1 按键扫描与长按短按的软件处理基础称重做完之后再加交互功能就显得特别顺了。按键是最直接的人机接口我设计了四个键去皮、单位切换、单价设置、开关键。为了避免机械抖动和误触按键扫描不是简单的延时消抖而是每10ms检查一次连续3次读到同一个稳定电平才确认按下。长按和短按的区分也不复杂记录按键按下的时刻如果释放时持续时间小于500ms算短按执行单击动作如果超过800ms还没有释放就进入长按重复模式每200ms触发一次适合用来快速加减单价数字。有一点要特别留意按键消抖和称重数据的正常读取千万不要放在同一个阻塞循环里。我见过不少人用delay消抖结果按下按键的瞬间HX711的数据读取被中断DOUT时序乱掉读出来的码值直接飞走。我这边用的是状态机扫描主循环每10ms检查一次按键HX711的读取在Timebase中断或独立的高优先级循环里做两边互不干扰。5.2 计价、单位切换、超限报警的逻辑细节计价功能是电子秤的经典实用功能逻辑相当简单金额 重量 × 单价。难点在处理小数位和小数舍入。我这边重量按kg为单位存储单价设置成每500g或每kg对应的价格金额四舍五入到分。为了避免浮点数计算误差重量和金额全部用整数运算重量用“克”存储单价用“分”存储这样乘法结果就是“分”显示的时候除以100。单位切换看起来简单实际上必须考虑显示精度。kg和g切换只需乘以1000但lb和oz是英制单位换算系数分别是0.4536和0.02835。直接换算会导致小数位不够我建议切换单位时同步调整显示精度kg显示3位小数g显示整数lb显示2位小数oz显示2位小数。精度不够的单位宁可多显示一位也别让用户看到一个跳来跳去的约数。超限报警则是把重量值和用户设置的上下限比较超上限时蜂鸣器长鸣低于下限时短鸣两声。这个阈值设置在设置菜单里完成用按键逐位输入数字。需要注意的是蜂鸣器不要直接并联在单片机的IO口上最好加一个三极管驱动否则蜂鸣器启动电流可能让ADC读数瞬时跳动。这又是一个项目里真实踩过的坑后面实测章节会细聊。5.3 参数掉电保存EEPROM写入策略单价、报警阈值、标定系数、单位设置这些参数如果每次关机都丢用户体验会非常差所以必须掉电保存。我这里直接用了主控片内的EEPROM按页面分配存储区域简单的读写接口就够了。EEPROM写入有一个关键策略不能频繁写。因为它的擦写寿命通常只有一十万次左右如果每次称重都写一次几个月就把寿命耗尽了。我的做法是只在两种情况下触发保存一是用户完整退出设置菜单时二是标定流程结束时。正常运行中所有参数都只缓存在RAM里这样既保数据又保寿命。标定系数存EEPROM之前还要加一个校验位。我的地址规划是0x00区域存一个标志字节写入时固定置为0x5A读取时如果发现标志不对说明EEPROM数据无效就提示重新标定。这个做法成本极低却能避免“存了一堆垃圾数据还当真”的尴尬。6. 实测结果与调试过程中最容易翻车的四个坑6.1 滤波前后的数据对比把滤波算法和标定都做完之后我做了一组简单的实测。在桌面上支好秤放上1g、100g、500g砝码分别记录滤波前单次读数和滤波后稳定显示值结果如下表真实重量滤波前单次读数的波动范围滤波后稳定显示值误差0g空秤-0.8g ~ 1.1g0.0g0g1g-0.6g ~ 1.6g1.1g0.1g100g98.6g ~ 101.4g100.2g0.2g500g498.5g ~ 502.8g500.3g0.3g单次读数的波动幅度达到了2g左右这和HX711在10SPS时叠加机械振动后的噪声水平是吻合的。但滑动平均之后误差稳定控制在±0.5g以内满量程5kg时这个精度已经超过了“±0.1%FS”的设计目标。看这张表应该能体会到一个道理称重系统的精度是“硬件底子加软件算法”共同撑起来的少了任何一环都做不出来这个数。6.2 电源纹波与机械安装带来的怪异现象第一个坑是电源纹波导致读数周期性跳动。我用的是一个普通开关电源适配器供电不称重时空秤读数很稳但一到数码管刷新点亮的那几十毫秒读到的重量就会突然变大个几克。最开始我以为是滤波窗口选短了后来用示波器一测才发现数码管扫描的瞬间电源输出被拉低了约150mVHX711虽然做了激励和基准的同步抵消但极端情况下的动态压降还是会穿透到信号链路里。解决方法是给HX711的电源脚单独加一个100uF电解电容和一个0.1uF陶瓷电容数码管驱动供电从主电源经过LC隔离再走问题立刻消失。第二个坑是机械安装引起的非线性误差。我一开始为了调试方便只用一颗螺丝把传感器锁在木板上另一端悬空。结果标定完成后1kg以内精度不错到4kg以上误差突然增大到15g。后来检查发现是传感器单点受力弹性体变形不对称输出曲线在大量程段严重弯曲。把传感器装到平整的金属基板上四个固定孔用同样的扭矩锁好同样流程再标定一次满量程误差立刻回落到3g以内。称重设备的机械结构真的和电子设计同等重要。6.3 常见异常快速排查表做这类项目遇到的问题基本都有共性。我把调试中遇到过的问题按现象整理了张表后续做同款项目的人可以拿来当参照现象可能原因处理办法读数上下乱跳滤波无效电源纹波大传感器供电脚去耦不足增加电源去耦电容传感器线远离数字信号线读数一直为负S和S-接反或零点未校准调换S和S-重新执行空秤校准小重量准确大重量偏差越来越大传感器安装不平受力不对称重新固定传感器保证四个安装孔受力一致按键按下时重量突变按键消抖阻塞了HX711读取改用定时扫描不要用延时消抖蜂鸣器响时读数漂移蜂鸣器启动电流冲击电源蜂鸣器用独立IO驱动电源加LC隔离断电后设置丢失EEPROM未写入或标志位错误检查EEPROM读写地址和标志字节6.4 后续还能扩展些什么这套系统做到现在已经是一个能独立使用、精度靠谱、交互完整的小产品了。如果后续想玩得更深我建议从三个方向入手一是加串口或蓝牙透传把称重数据上传到手机端做记录这对做膳食管理或者物流称重记录很有用二是改用压力或者称重传感器阵列做更大台面的秤兼顾大物体和中心偏移三是在标定算法上再进一步做温度补偿HX711和传感器的温漂是真实存在的冷链场景或者户外使用时会很明显。最后一个实用小建议所有参数和校准数据的设计从一开始就要留出扩展位。比如EEPROM地址规划留白LCD还是数码管的接口做成配置文件里可选这样以后加新功能不用推翻重写一遍主逻辑。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑