STM32F103C8T6 + HX711 压力传感器实战:CubeMX配置与卡尔曼滤波降噪全流程

张开发
2026/4/17 16:58:45 15 分钟阅读

分享文章

STM32F103C8T6 + HX711 压力传感器实战:CubeMX配置与卡尔曼滤波降噪全流程
STM32F103C8T6 HX711 压力传感器实战CubeMX配置与卡尔曼滤波降噪全流程当你在电子秤或压力检测项目中遇到数据跳变严重的问题时是否曾怀疑过是硬件连接不稳定实际上90%的传感器噪声问题都源于软件处理不当。本文将带你深入STM32F103C8T6与HX711的实战应用重点解决三个核心痛点CubeMX的精准配置、原始数据的噪声分析以及卡尔曼滤波的参数调优。不同于基础教程我们会直接切入工业级应用的信号处理方案。1. 硬件架构设计与CubeMX关键配置1.1 硬件连接拓扑优化HX711与STM32的典型连接只需4根线但细节决定稳定性电源去耦在HX711的VCC与GND之间并联100nF陶瓷电容10μF电解电容信号保护DOUT和SCK线路串联100Ω电阻可抑制振铃现象接地策略采用星型接地避免数字地与模拟地形成环路硬件连接参考表引脚功能STM32F103C8T6引脚HX711引脚备注数据输出PA0DOUT配置为上拉输入模式时钟控制PA1SCK推挽输出初始低电平电源正极3.3VVCC不超过5V电源负极GNDGND靠近芯片放置去耦电容1.2 CubeMX配置的隐藏技巧在Clock Configuration中将HCLK设置为72MHz可获得最佳时序精度。针对HX711的特殊需求// GPIO初始化代码片段自动生成 GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin GPIO_PIN_0; GPIO_InitStruct.Mode GPIO_MODE_INPUT; GPIO_InitStruct.Pull GPIO_PULLUP; // 必须启用上拉 HAL_GPIO_Init(GPIOA, GPIO_InitStruct); GPIO_InitStruct.Pin GPIO_PIN_1; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, GPIO_InitStruct);注意HX711对时序极其敏感建议将SCK引脚的速度等级设置为High2. HX711底层驱动开发与噪声诊断2.1 精准时序控制实现HX711的24位ADC读取需要严格遵循时序图。实测发现时钟高电平持续时间不得少于0.2μsuint32_t HX711_Read() { uint32_t count 0; HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET); if(HAL_GPIO_ReadPin(DAT_GPIO_Port, DAT_Pin) 0) { for(uint8_t i0; i24; i) { HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET); DWT_Delay(0.3); // 使用DWT实现微秒级延时 count 1; HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET); DWT_Delay(0.3); if(HAL_GPIO_ReadPin(DAT_GPIO_Port, DAT_Pin)) count; } // 第25个脉冲选择通道和增益 HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET); DWT_Delay(0.3); HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET); } return count ^ 0x800000; }2.2 噪声源分析与量化通过串口输出原始AD值可以观察到三种典型噪声白噪声表现为±5个LSB的随机波动电源噪声50Hz工频干扰导致的周期性波动机械振动噪声突发性大幅跳变使用示波器捕获的电源噪声频谱低频段10Hz幅度约3mV50Hz谐波幅度达10mV3. 卡尔曼滤波的工程化实现3.1 滤波器参数物理意义typedef struct { float q; // 过程噪声协方差 float r; // 观测噪声协方差 float p; // 估计误差协方差 float k; // 卡尔曼增益 float x; // 最优估计值 } 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; }参数调试经验值快速响应模式q0.01, r1 适合动态称重高稳定模式q0.001, r0.1 适合静态测量3.2 自适应参数调整策略根据信号变化率自动调节q值float dynamic_q_adaptation(float prev, float current) { float delta fabs(current - prev); if(delta 100) return 0.1; // 大波动 else if(delta 10) return 0.01; else return 0.001; // 稳定状态 } // 在滤波调用前更新q值 kf.q dynamic_q_adaptation(last_weight, raw_data); filtered_data Kalman_Update(kf, raw_data);4. 工业级抗干扰综合方案4.1 硬件滤波组合拳前端模拟滤波二阶低通滤波器截止频率10Hz共模扼流圈抑制射频干扰电源处理使用LDO稳压器如TPS7A4700增加π型滤波网络4.2 软件处理增强移动平均卡尔曼的二级滤波架构#define WINDOW_SIZE 5 float moving_avg_filter(float new_val) { static float buffer[WINDOW_SIZE]; static uint8_t index 0; static float sum 0; sum - buffer[index]; buffer[index] new_val; sum buffer[index]; index (index 1) % WINDOW_SIZE; return sum / WINDOW_SIZE; } // 使用示例 float first_stage moving_avg_filter(raw_data); float final_output Kalman_Update(kf, first_stage);4.3 温度补偿方案建立温度-漂移补偿表温度(℃)补偿系数零点漂移101.025251.000400.98-8实现代码float temp_compensation(float raw, float temp) { float comp_factor 1.0 (25.0 - temp) * 0.001; return raw * comp_factor get_offset(temp); }在完成整套优化方案后某工业称重项目的测试数据显示短期稳定性±0.02% FS长期漂移0.1% FS/4h动态响应时间200ms达到90%最终值

更多文章