STM32F103C8T6 + HX711 高精度体重秤:从电路到代码的5步实现(精度0.1kg) STM32F103C8T6 HX711 高精度体重秤从电路到代码的5步实现精度0.1kg在健康监测设备日益普及的今天一款精准可靠的体重秤已成为许多家庭的标配。对于嵌入式开发者而言如何快速构建一个具备工业级精度的智能称重系统本文将带你从硬件选型到软件实现完整走通STM32与HX711协同工作的全流程。1. 硬件架构设计1.1 核心器件选型主控芯片选用STM32F103C8T6这款Cortex-M3内核的MCU具备72MHz主频和丰富的外设接口其ADC采样速率和GPIO响应速度完全满足称重场景需求。相比Arduino等开发板STM32提供了更精确的时钟控制和更低的中断延迟。称重模块采用HX711专用24位ADC芯片其关键参数如下表所示参数指标值说明分辨率24位理论可检测1/16777216量级变化采样率10/80SPS可选高速模式适合动态称重场景输入电压范围2.6-5.5V与STM32供电兼容差分输入范围±40mV可直接连接应变片传感器1.2 电路连接方案完整的硬件连接需要关注三个关键接口电源部分使用AMS1117-3.3稳压芯片为系统供电在HX711的AVDD与AGND间并联100μF电解电容传感器激励电压建议采用独立LDO供电传感器接口称重传感器(4线制) → HX711 RED → E BLACK → E- WHITE → A- GREEN → A数据通信线路// STM32与HX711连接示意 #define HX711_SCK_PIN GPIO_Pin_0 // PB0 #define HX711_DOUT_PIN GPIO_Pin_1 // PB1注意传感器与HX711之间的导线应尽量短30cm并使用双绞线减少干扰。实际布线时建议采用四线制接法以消除导线电阻影响。2. 传感器初始化与校准2.1 HX711驱动实现首先构建底层读写函数注意时序必须严格遵循芯片手册要求uint32_t HX711_Read(void) { uint32_t count 0; GPIO_ResetBits(GPIOB, HX711_SCK_PIN); while(GPIO_ReadInputDataBit(GPIOB, HX711_DOUT_PIN)); // 等待数据就绪 for(uint8_t i0; i24; i) { GPIO_SetBits(GPIOB, HX711_SCK_PIN); delay_us(1); count 1; if(GPIO_ReadInputDataBit(GPIOB, HX711_DOUT_PIN)) count; GPIO_ResetBits(GPIOB, HX711_SCK_PIN); delay_us(1); } // 设置下次读取的通道和增益 for(uint8_t i0; iGAIN; i) { GPIO_SetBits(GPIOB, HX711_SCK_PIN); delay_us(1); GPIO_ResetBits(GPIOB, HX711_SCK_PIN); delay_us(1); } return count ^ 0x800000; // 补码转换 }2.2 三点校准法为达到0.1kg精度需要执行以下校准步骤空载校准long offset 0; for(int i0; i10; i) { offset HX711_Read(); delay(100); } offset / 10;已知重量校准float scale_factor 0; put_known_weight(5.0kg); // 放置5kg砝码 long raw 0; for(int i0; i10; i) { raw HX711_Read(); delay(100); } scale_factor (raw - offset) / 5.0;线性验证 用不同重量砝码如1kg、3kg、10kg验证读数线性度计算修正系数。3. 数字滤波算法实现3.1 滑动平均滤波基础滤波方案实现简单但效果显著#define FILTER_WINDOW 10 float weight_buffer[FILTER_WINDOW] {0}; float moving_avg_filter(float raw) { static uint8_t index 0; float sum 0; weight_buffer[index] raw; if(index FILTER_WINDOW) index 0; for(uint8_t i0; iFILTER_WINDOW; i) { sum weight_buffer[i]; } return sum / FILTER_WINDOW; }3.2 卡尔曼滤波进阶对于动态称重场景可采用卡尔曼滤波提升响应速度typedef struct { float q; // 过程噪声协方差 float r; // 测量噪声协方差 float x; // 估计值 float p; // 估计误差协方差 float k; // 卡尔曼增益 } KalmanFilter; float kalman_update(KalmanFilter* kf, float measurement) { kf-p kf-p kf-q; kf-k kf-p / (kf-p kf-r); kf-x kf-x kf-k * (measurement - kf-x); kf-p (1 - kf-k) * kf-p; return kf-x; }提示卡尔曼参数需要根据实际传感器特性调整通常q取0.01-0.001r取0.1-1.0。4. 用户交互设计4.1 重量显示方案采用0.96寸OLED实现多信息显示void display_weight(float weight) { char buf[16]; OLED_Clear(); OLED_ShowString(0, 0, (uint8_t*)Weight:, 16); sprintf(buf, %.1f kg, weight); OLED_ShowString(40, 2, (uint8_t*)buf, 24); // 显示历史曲线 for(uint8_t i0; i7; i) { OLED_DrawLine(10i*15, 50, 10i*15, 50-history[i]/2); } }4.2 自动休眠与唤醒通过检测重量变化实现低功耗void power_manage(void) { static uint32_t last_active 0; if(fabs(current_weight) 0.5) { // 有效重量阈值 last_active HAL_GetTick(); return; } if(HAL_GetTick() - last_active 30000) { // 30秒无操作休眠 enter_low_power_mode(); } }5. 系统集成与测试5.1 硬件组装要点传感器安装需保证四角平衡建议使用M3螺丝固定在PCB上为应变片预留惠斯通电桥补偿电阻外壳设计应避免侧向力影响测量精度5.2 精度验证方法采用标准砝码进行多点测试标准重量(kg)测量值(kg)误差(g)0.00.05505.05.022010.09.97-3020.020.0330通过软件校准后最终系统精度可稳定在±0.1kg范围内。实际测试中发现环境温度变化超过10℃时需要重新校准。