STM32驱动高精度称重模块:HX711 24位ADC的电路设计与代码实战

张开发
2026/4/19 18:05:21 15 分钟阅读

分享文章

STM32驱动高精度称重模块:HX711 24位ADC的电路设计与代码实战
1. HX711称重模块的核心价值与应用场景HX711这款24位ADC芯片在电子秤、智能厨房秤、工业称重等领域已经成为性价比之王。我经手过的十几个称重项目里有9个都选择了HX711原因很简单——它用1/10的价格实现了接近专业级ADC的性能。不同于普通16位ADCHX711的24位分辨率意味着它能检测到毫克级别的重量变化比如我在做一个咖啡烘焙机项目时就靠它准确捕捉到了0.01克的咖啡豆重量变化。这个芯片最聪明的地方在于内置了可编程增益放大器PGA支持128倍、64倍和32倍三档放大。实际使用中发现当称重传感器输出信号特别微弱时比如满量程只有2mV128倍增益就能把信号放大到ADC的理想检测范围。不过要注意增益不是越大越好去年我做智能花盆项目时就踩过坑——过高的增益会导致信号饱和最后改用64倍才解决问题。2. 硬件设计中的三个关键陷阱2.1 电平转换的巧妙设计STM32的3.3V逻辑电平与HX711的5V供电如何兼容这是新手最容易栽跟头的地方。经过多次实测我发现最可靠的方案是将STM32的时钟引脚配置为开漏输出Open-drain并通过1KΩ电阻上拉到HX711的AVDD5V。这里有个血泪教训曾经用10KΩ上拉电阻导致通信不稳定后来查手册才发现HX711要求时钟上升时间不能超过1μs。具体连接方式STM32的GPIO带FT标志→ HX711 CLK开漏输出1K上拉HX711 DOUT → STM32 GPIO浮空输入称重传感器EXC → AVDD称重传感器EXC- → AGND2.2 电源噪声的消除技巧HX711对电源噪声极其敏感特别是在工业环境中。有个项目在现场测试时读数总是跳变后来发现是开关电源的纹波导致的。解决方法很朴素但有效在AVDD和AGND之间加100μF电解电容0.1μF陶瓷电容传感器激励线采用双绞线模拟地和数字地单点连接2.3 传感器接线的防错设计称重传感器的四线制接法看似简单但接反线序会导致读数反向。我的经验是红色线EXC接AVDD黑色线EXC-接AGND白色线SIG接AIN绿色线SIG-接AIN-如果发现重量增加时读数反而减小八成是SIG和SIG-接反了。建议用万用表测量传感器阻抗正常情况EXC两端阻抗≈350ΩSIG两端阻抗≈320Ω。3. 驱动代码的五个核心要点3.1 精准的时序控制HX711的通信时序要求严格代码中必须实现微秒级延时。经过反复测试最稳定的时序组合是#define hx711_delay() PY_Delay_us_t(1) // 实测1μs最稳定 void hx711_read(uint32_t *data) { while(hx711_rdy); // 等待准备就绪 while(!hx711_rdy); // 等待数据就绪 *data 0; for(uint8_t i0; i24; i) { hx711_clk_h; hx711_delay(); hx711_clk_l; *data | hx711_dout (23-i); hx711_delay(); } // 通道选择脉冲 hx711_clk_h; hx711_delay(); hx711_clk_l; }3.2 数据校验的实用方法原始数据常会有±3个LSB的跳动推荐采用移动平均滤波#define FILTER_SIZE 8 int32_t hx711_filter() { static int32_t buf[FILTER_SIZE]; static uint8_t index 0; int64_t sum 0; hx711_read(buf[index]); if(index FILTER_SIZE) index 0; for(uint8_t i0; iFILTER_SIZE; i) { sum buf[i]; } return sum/FILTER_SIZE; }3.3 零点和标定的工程实现称重系统必须做两点标定零点标定空载时读取AD值如0xABCDEF满量程标定放置已知重量如500g读取AD值如0x123456转换公式float weight (current_ad - zero_offset) * (calib_weight / (calib_ad - zero_offset));3.4 异常状态的自动恢复实际项目中我发现HX711偶尔会死机解决方法是在每次读取前加入软复位void hx711_reset() { hx711_clk_h; PY_Delay_us_t(100); // 保持高电平60μs以上 hx711_clk_l; PY_Delay_us_t(100); }3.5 多通道切换的优化方案如果需要切换增益和通道建议不要在每次读取时切换而是通过硬件引脚设置// 通过RATE引脚设置转换速率 #define hx711_set_rate() HAL_GPIO_WritePin(RATE_GPIO, RATE_PIN, GPIO_PIN_SET) // 80Hz4. 从原始数据到实际重量的完整流程4.1 原始数据的特征解析HX711输出的24位数据是二进制补码格式需要转换为有符号整数int32_t raw_to_value(uint32_t raw) { if(raw 0x800000) { // 负数处理 return (int32_t)(raw | 0xFF000000); } return (int32_t)raw; }4.2 温度补偿的实战技巧称重传感器会受温度影响我在智能冷链项目中是这样处理的在传感器旁安装DS18B20温度传感器建立温度-零点偏移量的查找表实时补偿float temp ds18b20_read(); float compensated raw_value temp_comp_table[(uint8_t)temp];4.3 非线性校正的高级玩法高端场合需要对传感器的非线性进行校正推荐采用二阶多项式拟合float nonlinear_comp(float weight) { return a * weight * weight b * weight c; // 系数通过标定得出 }4.4 防抖算法的选择策略根据不同的应用场景选择滤波算法电子秤移动平均去极值动态称重卡尔曼滤波工业称重FIR数字滤波5. 常见问题排查指南5.1 读数不稳定怎么办检查清单电源电压是否稳定用示波器看纹波传感器线缆是否受干扰尝试缩短线长接地是否良好重点检查模拟地机械结构是否有应力用手轻敲看读数变化5.2 读数始终为零的可能原因传感器激励电压未接通测量EXC和EXC-间电压应为5V差分输入短路测量AIN和AIN-间电压空载时应≈0mV芯片未正常工作检查HX711的AVDD电压5.3 重量增加读数反而减小典型症状是SIG和SIG-接反了解决方法交换AIN和AIN-的连接或者在代码中对结果取反int32_t value -raw_to_value(raw_data);5.4 如何验证HX711是否正常工作简易测试方法不接传感器将AIN通过10kΩ电阻接AVDD读取的AD值应该接近满量程0x7FFFFF将AIN接地读数应接近负满量程0x8000006. 进阶优化技巧6.1 低功耗设计秘诀电池供电设备可以这样优化void hx711_power_save() { hx711_clk_h; PY_Delay_us_t(60); // 保持高电平进入休眠 // 唤醒时需要重新初始化 }6.2 多传感器轮询方案需要多个称重传感器时建议每个HX711独立供电共用STM32的GPIO但分时复用通过MOS管切换传感器电源6.3 抗干扰布线规范工业环境布线建议使用屏蔽双绞线屏蔽层单端接地信号线远离电机和变频器在信号线两端加磁珠6.4 固件升级的实用设计推荐在代码中加入在线标定功能通过串口发送ZERO清零发送CALIB 500进行500g标定参数保存到Flash的EEPROM区域

更多文章