5Kg/10Kg称重传感器接HX712:24位ADC有效精度与STM32标定

发布时间:2026/10/26 4:43:02
5Kg/10Kg称重传感器接HX712:24位ADC有效精度与STM32标定 简介5Kg、10Kg称重传感器HX712重量采集工程包面向电子秤、食品包装、物流分拣及工业检测等需要克级精度重量读取的嵌入式开发者重点解决HX712双通道24位Σ-Δ ADC与STM32、HK32微控制器之间的数据采集与通信问题。包内共189个文件以24个c源文件、40个h头文件为核心配套uvprojx工程、axf与hex可执行文件、map映射文件及调试配置压缩包约4.6MB兼顾源码查阅、编译验证与烧录测试。已有2257人学习下载。代码围绕SPI/I2C接口完成传感器数据交换注释较充分可帮助读者理解HX712的低噪声、高分辨率采集流程并快速将重量采集方案移植到STM32或HK32平台减少从搭建到联调的时间。1. 5Kg/10Kg 称重传感器接 HX71224 位 ADC 不是 24 位有效精度5Kg、10Kg 称重传感器接 HX712 做重量采集最容易被忽略的反直觉点是24 位 ADC 并不等于 24 位有效精度。HX712 输出的是 24 位原始码真正决定读到 0.1g 还是 1g 的是传感器灵敏度、激励稳定性、机械安装和标定方式。这套采集链路围绕 HX712 两线时序、STM32 采样状态机、两点标定和 5Kg/10Kg 双量程参数表展开适合做配料秤、台秤、料斗称重和小型检重工位的开发者。硬件接线和机械边界没打好后面滤波参数调得再玄学也救不回来先把量程、灵敏度和参考电压算清再写驱动很多跳数问题会少一半。2. 从应变片电桥到 HX7125Kg 与 10Kg 的量程、灵敏度与接线边界称重传感器本质上是贴在弹性体上的应变片惠斯通电桥。受力后应变片电阻发生微小变化电桥输出一对差分毫伏信号HX712 负责把这对差分信号放大并量化成 24 位原始码。5Kg 和 10Kg 的差别不只是额定载荷数字灵敏度、弹性体刚度、安装力矩和过载能力都会改变原始码的斜率。很多人拿到传感器先写代码读出一串跳变值再回头怀疑 HX712其实问题往往在电桥输出没有落在预期范围或者机械安装引入了侧向力。2.1 惠斯通电桥输出怎么落到 HX712 差分输入四线称重传感器通常有 E、E-、S、S- 四根线E 和 E- 是激励S 和 S- 是差分信号。传感器铭牌上的灵敏度常见写法是 1mV/V 或 2mV/V含义是额定载荷下每 1V 激励电压对应多少毫伏输出。比如 5Kg、2mV/V 的传感器配 5V 激励满量程差分输出是 10mV10Kg、1mV/V 的传感器配 5V 激励满量程输出是 5mV。这个电压很小HX712 的差分输入端必须远离数字走线屏蔽层通常单端接地不要两头接地形成地环路。四线传感器没有反馈线激励线电阻会分压实际加到电桥上的电压略低于电源电压六线传感器多一对反馈线能把线阻压降补回来。用四线传感器时激励线尽量短、线径足够HX712 的模拟地和 STM32 的数字地要在电源入口附近单点处理。差分输入不能把 S- 直接当普通地S 和 S- 要成对走线最好走成紧耦合的差分对。HX712 的 PD_SCK 和 DOUT 是数字线不要和 S、S- 并排长距离平行否则时钟串扰会直接体现在原始码上。提示先不接 HX712用万用表测 S 与 S- 之间的空载电压正常应在零点附近加载后变化几毫伏。变化量完全对不上铭牌灵敏度先查接线和激励不要急着调代码。2.2 5Kg 和 10Kg 的量程与理论分辨率估算理论码值可以用一个简单公式估算V_diff V_exc × S × (W / W_rated)其中V_exc是激励电压S是灵敏度W是当前载荷W_rated是额定载荷。HX712 内部增益按 128 估算时量化码值约为2^23 × (V_diff × 128 / V_ref)。下面按参考 2.5V、增益 128 做一组示例实际模块的参考电压和增益配置要以手册为准替换公式里的数字即可。参数5Kg 传感器示例10Kg 传感器示例额定载荷5kg10kg灵敏度2mV/V1mV/V激励电压5V5V满量程差分输出10mV5mV增益 128 后电压1.28V0.64V理论码值Vref2.5V约 4.29M约 2.15M理论 LSB约 1.16mg约 4.66mg这张表只说明“理论上有多少码”不代表实际能稳定读到 1mg。24 位 ADC 的有效位数会被噪声、温漂、激励纹波和机械振动吃掉实际有效分辨率可能只有十几到二十位。5Kg 传感器拿 10Kg 量程去标定满量程只用一半理论分辨率也减半反过来5Kg 传感器长期称 6Kg弹性体会过载蠕变和零点漂移会明显变差。静态称重建议留 1.5 倍余量有冲击或下料动作的工位留 2 到 3 倍余量别只看额定值。注意灵敏度 1mV/V 和 2mV/V 只是常见档位5Kg 和 10Kg 都可能出现。换传感器时先看铭牌不要默认所有 10Kg 传感器都是同一个斜率。2.3 供电、参考与四线/六线传感器的接线取舍HX712 的模拟供电和传感器激励要干净。电机、继电器、PWM 灯带共用一个电源时激励上的纹波会直接调制差分输出原始码会出现和开关频率同步的跳变。常见做法是模拟部分单独一路低噪声 LDO数字部分另外供电入口处加磁珠和去耦电容。如果 HX712 的参考电压和传感器激励同源激励波动会按比例进入参考测量结果反而更稳这就是常说的比率测量思路如果参考和激励各自独立就要保证两边都稳否则误差会叠加。信号传感器线接到 HX712/板端备注激励正E激励正输出线短、压降小激励负E-激励负/模拟地不要和数字地混走差分正S差分输入正与 S- 成对走线差分负S-差分输入负不要单端接地屏蔽层Shield机壳/单端地只接一端5Kg 和 10Kg 传感器的安装孔距、受力方向可能不同机械上不要用同一个安装座硬凑。传感器受力面要正对载荷侧向力、扭矩和偏载都会带来回程误差。安装螺钉按铭牌力矩拧不要一端拧死再拧另一端预紧不均会让空载零点漂移。限位螺钉留一点间隙防止下料冲击把弹性体压过载。接线和机械都确认后再进入 STM32 驱动阶段否则后面调滤波就是黑匣子。3. STM32 驱动 HX712GPIO 时序、24 位补码与采样状态机HX712 不是 SPI 也不是 I2C常见模块走两根线PD_SCK 给时钟DOUT 回数据。STM32 这边把 PD_SCK 配成推挽输出空闲拉低DOUT 配成输入建议加上拉避免传感器没接时引脚悬空读随机值。HX712 的数据准备好后 DOUT 会拉低STM32 检测到低电平再发 24 个时钟脉冲读数据之后补额外脉冲选择增益或通道。不同批次、不同后缀的 HX712 在脉冲数上可能有差异代码里把额外脉冲数做成宏按手册改不要硬编码。3.1 两线时序的 GPIO 配置与微秒延时先给引脚宏和基础读写函数。下面以 HAL 库为例引脚号按实际板子改。PD_SCK 初始电平一定要低DOUT 输入上拉这样传感器没插时不会读到全 0 和全 1 之间乱跳。微秒延时用 DWT 周期计数器实现Cortex-M3/M4 常见可用M0 内核没有 DWT换成定时器或循环校准。/* 引脚宏按实际板子修改 */ #define HX712_SCK_PORT GPIOA #define HX712_SCK_PIN GPIO_PIN_5 #define HX712_DOUT_PORT GPIOA #define HX712_DOUT_PIN GPIO_PIN_6 static inline void hx712_sck(GPIO_PinState s) { HAL_GPIO_WritePin(HX712_SCK_PORT, HX712_SCK_PIN, s); } static inline uint8_t hx712_dout(void) { return HAL_GPIO_ReadPin(HX712_DOUT_PORT, HX712_DOUT_PIN) GPIO_PIN_SET; } static void dwt_delay_init(void) { CoreDebug-DEMCR | CoreDebug_DEMCR_TRCENA_Msk; DWT-CYCCNT 0; DWT-CTRL | DWT_CTRL_CYCCNTENA_Msk; } static inline void delay_us(uint32_t us) { uint32_t start DWT-CYCCNT; uint32_t ticks us * (SystemCoreClock / 1000000U); while ((DWT-CYCCNT - start) ticks) { } }这段代码只做两件事把 SCK 和 DOUT 的读写封装成短函数再用 DWT 产生 1us 级延时。delay_us(1)是保守值HX712 的时序允许范围通常比 1us 宽但先用慢速把波形跑通再考虑缩短。SystemCoreClock要跟实际主频一致否则延时不准。读函数里不要用HAL_Delay毫秒级延时会把采样速率拖垮。#define HX712_EXTRA_PULSES 1u /* 24 个数据脉冲后再补的脉冲常见为 1按手册改 */ #define HX712_TIMEOUT_MS 100u int32_t hx712_read_raw(void) { uint32_t t0 HAL_GetTick(); while (hx712_dout()) { /* DOUT 高转换未完成 */ if ((HAL_GetTick() - t0) HX712_TIMEOUT_MS) return INT32_MIN; } uint32_t raw 0; for (int i 0; i 24; i) { /* 高位先出 */ hx712_sck(GPIO_PIN_SET); delay_us(1); raw (raw 1) | (hx712_dout() ? 1u : 0u); hx712_sck(GPIO_PIN_RESET); delay_us(1); } for (int i 0; i HX712_EXTRA_PULSES; i) { hx712_sck(GPIO_PIN_SET); delay_us(1); hx712_sck(GPIO_PIN_RESET); delay_us(1); } if (raw 0x800000u) raw | 0xFF000000u; /* 24 位补码符号扩展 */ return (int32_t)raw; }读函数先等 DOUT 变低再发 24 个时钟读数据最后补HX712_EXTRA_PULSES个脉冲。HX712_TIMEOUT_MS防止传感器没接时死等返回INT32_MIN作为错误码。符号扩展把 24 位补码变成 32 位有符号数负重量或反向安装时不会读成巨大的正数。HX712_EXTRA_PULSES不是随便填的常见模块是 1 个额外脉冲总时钟 25 个如果手册要求 26 或 27 个改宏后重新抓波形确认。提示第一次调试别靠 printf 猜时序拿逻辑分析仪或示波器抓 PD_SCK 和 DOUT。确认 24 个数据位、额外脉冲数、空闲电平和手册一致比反复改代码快得多。3.2 24 位原始码转有符号数符号扩展与饱和判断HX712 输出 24 位补码正满量程是0x7FFFFF负满量程是0x800000。符号扩展之后原始码落在-8388608到8388607之间。有人把uint32_t直接乘系数转 float负半轴会变成几百万的正数重量直接翻车。还有人在零附近看到0xFFFFFF就以为传感器坏了其实那是 -1 的 24 位补码符号扩展后就是 -1。static bool hx712_is_saturated(int32_t raw) { return raw 0x7FFFFF || raw -0x800000; } /* 连续 3 次饱和才认为输入过载避免单点噪声误判 */ static bool hx712_sat_filter(int32_t raw) { static uint8_t cnt 0; if (hx712_is_saturated(raw)) { if (cnt 3) cnt; } else { cnt 0; } return cnt 3; }饱和判断不要只看一次。传感器下料瞬间冲击、电源上电抖动都可能让单次采样贴到满量程连续 3 次饱和再报错更稳。如果原始码长期贴在0x7FFFFF先查差分输入是否超范围、增益是否选错、激励是否过高长期贴在0x800000查 S 和 S- 是否接反、传感器是否反向受力。排除硬件后再看软件增益和标定系数。3.3 用定时器触发采样状态机别在主循环里死等HX712 的输出速率通常不高常见是 10Hz 或 80Hz 档位具体看芯片配置。主循环里死等 DOUT 会把其他任务拖住正确做法是用定时器按采样周期触发状态机先查 DOUT再读原始码再滤波再输出。状态机每步只做一小段超时回空闲不会卡死。typedef enum { HX_IDLE, HX_WAIT, HX_READ, HX_FILTER, HX_OUT } hx_state_t; static hx_state_t s_state HX_IDLE; void hx712_task(void) { /* 定时器按 10Hz 或 80Hz 调用 */ switch (s_state) { case HX_IDLE: s_state hx712_dout() ? HX_WAIT : HX_READ; break; case HX_WAIT: if (!hx712_dout()) s_state HX_READ; break; case HX_READ: { int32_t raw hx712_read_raw(); if (raw ! INT32_MIN) { filter_push_raw(raw); /* 原始码入滤波队列 */ s_state HX_FILTER; } else { s_state HX_IDLE; /* 超时下一周期重试 */ } break; } case HX_FILTER: filter_update(); s_state HX_OUT; break; case HX_OUT: output_weight_grams(); s_state HX_IDLE; break; } }状态机的调用周期要和 HX712 实际输出速率匹配。10Hz 档位配 100ms 定时器80Hz 档位配 12.5ms 定时器不要用 1kHz 去轮询既浪费 CPU 又容易读到未完成的数据。filter_push_raw和filter_update放在任务上下文不要塞进中断里做长计算。读失败返回INT32_MIN时不要拿错误码去滤波直接丢弃这一拍否则滤波队列会被污染。4. 标定与滤波把 HX712 原始码变成可用的克数原始码本身没有重量含义标定就是找原始码和克数之间的线性关系。5Kg 和 10Kg 传感器灵敏度不同同一套固件如果只改额定值不改标定系数显示重量会成比例偏差。标定之前先让系统预热空载采样几十次取中值再放接近满量程 50% 到 80% 的标准砝码采样后算斜率。标定系数和零点要存进 Flash 或 EEPROM掉电不丢存的时候带版本号和 CRC换传感器时能识别出参数不匹配。4.1 两点标定、去皮与单位换算两点法足够应付大多数静态称重。空载时记录raw0放已知砝码weight1_g记录raw1斜率g_per_lsb weight1_g / (raw1 - raw0)。斜率可能为负取决于传感器接线方向和安装方式不要看到负斜率就取绝对值。去皮是另一层本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询