STM32F103C8T6驱动HX711称重模块:从接线到校准的保姆级避坑指南

张开发
2026/4/18 2:39:28 15 分钟阅读

分享文章

STM32F103C8T6驱动HX711称重模块:从接线到校准的保姆级避坑指南
STM32F103C8T6驱动HX711称重模块从接线到校准的保姆级避坑指南当你第一次拿到HX711模块和STM32开发板时可能会被那些细小的引脚和复杂的接线图吓到。别担心这完全正常。我清楚地记得自己第一次尝试连接称重传感器时因为线序接反而浪费了整个下午的时间。本文将带你避开这些新手常踩的坑从硬件连接到软件校准一步步构建一个稳定的称重系统。1. 硬件连接那些容易忽略的细节1.1 引脚连接的正确姿势HX711模块与STM32的连接看似简单但魔鬼藏在细节中。最常见的错误就是混淆DOUT和SCK引脚。记住DOUT数据输出应连接到STM32的GPIO输入引脚SCK时钟信号应连接到STM32的GPIO输出引脚推荐使用以下引脚配置模块引脚STM32引脚功能说明VCC3.3V电源输入GNDGND地线DOUTPA6数据输出SCKPA7时钟输入提示避免使用带有特殊功能如JTAG的GPIO引脚这可能导致冲突。1.2 称重传感器的线序陷阱称重传感器通常有四根线红、黑、白、绿。最常见的接线错误是混淆A和A-。如果发现重量显示为负数或完全不变化尝试以下步骤首先确认电源线红-正极黑-负极连接正确交换白绿两线的位置如果问题依旧检查焊接是否牢固// 示例HX711引脚初始化代码 void HX711_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; // 使能GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置SCK为推挽输出 GPIO_InitStruct.GPIO_Pin GPIO_Pin_7; GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStruct); // 配置DOUT为浮空输入 GPIO_InitStruct.GPIO_Pin GPIO_Pin_6; GPIO_InitStruct.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStruct); }2. 软件配置从基础读取到数据稳定2.1 HX711数据读取原理HX711采用24位ADC数据通过同步串行接口传输。读取过程分为三个阶段等待就绪检测DOUT引脚变低数据采集发送24个时钟脉冲读取数据增益设置发送额外脉冲设置下次转换的增益uint32_t Read_HX711(void) { uint32_t value 0; // 等待模块就绪 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)); // 读取24位数据 for(uint8_t i0; i24; i) { GPIO_SetBits(GPIOA, GPIO_Pin_7); // SCK高 delay_us(1); value 1; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)) value; GPIO_ResetBits(GPIOA, GPIO_Pin_7); // SCK低 delay_us(1); } // 设置下次增益为128 GPIO_SetBits(GPIOA, GPIO_Pin_7); delay_us(1); GPIO_ResetBits(GPIOA, GPIO_Pin_7); return value ^ 0x800000; // 转换补码 }2.2 数据滤波算法实战原始数据往往存在噪声中值滤波结合均值滤波效果最佳#define FILTER_SIZE 5 uint32_t Filter_Data(uint32_t raw_data) { static uint32_t buffer[FILTER_SIZE] {0}; static uint8_t index 0; uint32_t temp[FILTER_SIZE]; uint32_t sum 0; // 更新数据缓冲区 buffer[index] raw_data; if(index FILTER_SIZE) index 0; // 复制数据用于排序 memcpy(temp, buffer, sizeof(buffer)); // 冒泡排序 for(uint8_t i0; iFILTER_SIZE-1; i) { for(uint8_t j0; jFILTER_SIZE-i-1; j) { if(temp[j] temp[j1]) { uint32_t swap temp[j]; temp[j] temp[j1]; temp[j1] swap; } } } // 取中间3个值求平均 for(uint8_t i1; iFILTER_SIZE-1; i) { sum temp[i]; } return sum / (FILTER_SIZE-2); }3. 校准技巧从理论到实践3.1 校准系数计算原理校准公式为实际重量 (原始读数 - 皮重) × 校准系数校准步骤空载时读取皮重Tare放置已知重量的砝码如500g记录此时原始读数计算校准系数校准系数 已知重量 / (读数 - 皮重)3.2 多点校准方法单点校准在量程两端可能误差较大建议采用两点校准准备两个标准砝码如100g和1000g分别记录两个重量对应的原始读数计算线性关系校准系数 (W2 - W1) / (R2 - R1) 偏移量 W1 - R1 × 校准系数示例代码typedef struct { float scale; // 校准系数 int32_t offset; // 偏移量 } CalibrationData; void TwoPointCalibration(CalibrationData *cal, int32_t raw1, float weight1, int32_t raw2, float weight2) { cal-scale (weight2 - weight1) / (raw2 - raw1); cal-offset weight1 - raw1 * cal-scale; } float Get_Weight(CalibrationData *cal, int32_t raw_data) { return raw_data * cal-scale cal-offset; }4. 常见问题排查指南4.1 数据跳动严重可能原因及解决方案电源干扰在VCC和GND之间添加100μF电解电容使用独立的稳压电源为HX711供电机械振动确保称重平台稳定增加软件滤波采样次数接线问题检查所有连接是否牢固尝试缩短导线长度4.2 读数始终为零或满量程检查流程确认传感器是否正确加载尝试用手轻压检查HX711的DOUT引脚在未加载时是否为高电平验证时钟信号是否正常用逻辑分析仪观察SCK波形检查代码中引脚定义与实际连接是否一致4.3 温度漂移问题HX711对温度较敏感解决方法在设备启动时自动执行皮重校准在恒温环境中使用定期重新校准如每小时一次void Auto_Tare(uint32_t samples) { uint32_t sum 0; for(uint32_t i0; isamples; i) { sum Read_HX711(); delay_ms(10); } current_offset sum / samples; }5. 进阶优化提升称重系统性能5.1 动态补偿算法当称重物体突然放置时传感器会产生振荡。采用动态补偿算法可快速稳定读数float DynamicCompensation(float current, float previous) { static float velocity 0; const float damping 0.2f; // 阻尼系数 const float stiffness 0.5f; // 刚度系数 float acceleration (current - previous) - stiffness * velocity; velocity acceleration * damping; return previous velocity; }5.2 低功耗设计技巧对于电池供电设备间歇工作模式每秒钟只唤醒HX711一次降低采样率设置HX711为10Hz模式动态调整滤波强度静止时增加滤波变化时减少滤波void HX711_PowerDown(void) { // 保持SCK高电平超过60μs使HX711进入休眠 GPIO_SetBits(GPIOA, GPIO_Pin_7); delay_us(70); } void HX711_WakeUp(void) { // SCK拉低唤醒HX711 GPIO_ResetBits(GPIOA, GPIO_Pin_7); delay_us(1); }5.3 多传感器融合对于需要四角平衡的称重平台可使用4个HX711模块分别校准每个传感器读取各传感器数据计算总重量和重心位置自动补偿各角度的偏差typedef struct { float weight; float x_pos; float y_pos; } PlatformData; void CalculatePlatform(PlatformData *data, float w1, float w2, float w3, float w4) { >

更多文章