当前位置: 首页 > news >正文

STM32F103C8T6 + HX711 + 电子秤模块:CubeMX配置与滤波实战(附完整代码)

STM32F103C8T6与HX711电子秤开发实战:从硬件对接到数据优化

在创客社区和嵌入式学习领域,电子秤项目一直是检验硬件接口能力和数据处理技术的经典案例。STM32F103C8T6作为性价比极高的ARM Cortex-M3内核微控制器,配合专为称重设计的HX711模块,构成了一个既适合教学又具备实用价值的开发组合。本文将彻底拆解这个技术方案,不仅覆盖CubeMX的基础配置,更深入探讨如何通过硬件优化和算法改进来提升测量精度——这些实战经验往往是一般教程不会涉及的细节。

1. 硬件架构与核心元件选型

1.1 系统组成框架

一个完整的电子秤系统由四个关键部分组成:压力传感器(通常为金属箔式应变片)、HX711模数转换模块、STM32主控制器以及显示/通信接口。其中HX711作为桥梁,将毫伏级的模拟信号转换为24位数字量,其内部集成了可编程增益放大器(PGA),支持128倍或64倍增益选择,这正是它相比通用ADC芯片的特殊优势。

典型硬件连接方式

STM32F103C8T6 ↔ HX711 ↔ 应变片传感器 │ │ └─串口/USB─┘ └─5V/3.3V供电

1.2 元件参数对比

元件关键参数选型建议
STM32F103C8T672MHz主频, 64KB Flash, 20KB RAM蓝桥杯开发板或最小系统板
HX711模块24位ADC, 10Hz/80Hz输出速率选择带稳压电路的版本
应变片灵敏度2mV/V, 量程5kg根据实际称重需求选择

实际采购时需注意:市场上HX711模块质量参差不齐,劣质产品的基准电压稳定性差会导致测量漂移。建议选择带有TL431基准源的正规模块。

2. CubeMX工程配置详解

2.1 时钟树与GPIO设置

在CubeMX中新建工程时,选择STM32F103C8T6型号后,首先配置时钟树。虽然HX711对时序要求不高,但保持系统时钟稳定有利于后续其他功能扩展:

  1. 在Clock Configuration标签页:
    • 选择HSE(外部高速时钟)作为时钟源
    • 设置PLL倍频至72MHz系统时钟
    • 保持APB1分频系数为2(36MHz)

对于GPIO配置,HX711只需要两个普通IO口:

  • DT线:配置为输入模式(浮空输入或上拉输入均可)
  • SCK线:配置为推挽输出模式,初始电平设为低
// 自动生成的GPIO初始化代码片段 static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : DAT_Pin */ GPIO_InitStruct.Pin = DAT_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(DAT_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : CLK_Pin */ GPIO_InitStruct.Pin = CLK_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(CLK_GPIO_Port, &GPIO_InitStruct); }

2.2 串口调试输出配置

虽然不涉及HX711的核心功能,但添加串口输出能极大方便调试。建议使用USART1(PA9/PA10)作为调试输出:

  1. Connectivity标签页启用USART1
  2. 参数设置:115200波特率,8数据位,无校验,1停止位
  3. 开启中断(可选)

3. HX711底层驱动实现

3.1 时序模拟关键技巧

HX711采用类似SPI但不完全相同的二线制协议,需要严格遵循其时序要求。以下是经过优化的读取函数实现:

#define HX711_DELAY_US 1 // 时序延时微调参数 uint32_t HX711_Read() { uint32_t count = 0; uint8_t i; // 等待数据就绪 while(HAL_GPIO_ReadPin(DAT_GPIO_Port, DAT_Pin)); // 读取24位数据 for(i=0; i<24; i++) { HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET); delay_us(HX711_DELAY_US); count <<= 1; HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET); delay_us(HX711_DELAY_US); if(HAL_GPIO_ReadPin(DAT_GPIO_Port, DAT_Pin)) count++; } // 第25个脉冲选择通道和增益 HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET); delay_us(HX711_DELAY_US); HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET); delay_us(HX711_DELAY_US); return count ^ 0x800000; // 补码转换 }

实际调试中发现:某些HX711模块对时序延时的敏感性较高。如果读取不稳定,可以尝试调整HX711_DELAY_US的值在0.5-2μs之间。

3.2 校准流程标准化

准确的校准是电子秤可用的前提。建议采用以下标准化校准流程:

  1. 空载校准

    • 不放置任何重物,连续读取100次取平均值作为零点值
    • 将结果存入Weight_Maopi变量
  2. 砝码校准

    • 放置已知重量的标准砝码(如500g)
    • 记录AD值,计算比例系数GapValue
    • 公式:GapValue = (AD_sample - AD_zero) / 实际重量
float Calibrate_GapValue(uint32_t known_weight) { uint32_t sum = 0; const uint8_t samples = 50; // 采集已知重量样本 for(int i=0; i<samples; i++) { sum += HX711_Read(); HAL_Delay(10); } uint32_t avg = sum / samples; // 计算并返回比例系数 return (float)(avg - Weight_Maopi) / known_weight; }

4. 数据滤波与优化策略

4.1 多级滤波方案设计

原始传感器数据往往包含多种噪声,需要组合应用多种滤波技术:

  1. 硬件级滤波

    • 在HX711的AVDD和DVDD引脚添加0.1μF陶瓷电容
    • 传感器输出端并联100nF电容
  2. 软件滤波组合

    • 移动平均滤波(快速去除脉冲干扰)
    • 卡尔曼滤波(处理系统噪声和测量噪声)
    • 滑动窗口中值滤波(抑制周期性干扰)
// 改进的复合滤波实现 float Enhanced_Filter(float raw_data) { static float history[5] = {0}; static uint8_t index = 0; // 更新历史数据 history[index] = raw_data; index = (index + 1) % 5; // 中值滤波 float temp[5]; memcpy(temp, history, sizeof(temp)); bubble_sort(temp, 5); // 实现简单的冒泡排序 float median = temp[2]; // 结合卡尔曼滤波 return KalmanFilter(median); }

4.2 动态补偿算法

在实际使用中发现,传感器读数会受温度变化和长期应力影响。可以增加自动补偿机制:

  1. 温度补偿

    • 记录连续10分钟的空载读数
    • 计算漂移率,建立一阶补偿模型
  2. 非线性校正

    • 在不同重量点(如100g、500g、1kg)采集数据
    • 建立二次或三次多项式补偿函数
// 非线性补偿表示例 float NonLinear_Compensation(float weight) { // 这些系数需要通过实际校准获得 const float a = 0.000015f; const float b = -0.002f; const float c = 1.05f; return a*weight*weight + b*weight + c*weight; }

5. 系统集成与性能优化

5.1 电源管理技巧

不稳定的电源是测量误差的主要来源之一。建议采取以下措施:

  • 为STM32和HX711使用独立的LDO稳压器
  • 在3.3V电源线上串联10Ω电阻并并联100μF电解电容
  • 如果使用USB供电,添加LC滤波电路(22μH电感+100μF电容)

典型供电方案对比

供电方式成本稳定性推荐指数
USB 5V直供较差★★☆☆☆
AMS1117稳压一般★★★☆☆
TPS7A4700稳压优秀★★★★☆
电池+充电管理最高极好★★★★★

5.2 实战调试经验

在多个实际项目中发现以下常见问题及解决方案:

  1. 读数跳变严重

    • 检查传感器焊接是否牢固
    • 尝试缩短HX711与STM32的连接线长度
    • 在SCK和DT线上添加1kΩ上拉电阻
  2. 测量值随时间漂移

    • 预热系统30分钟后再校准
    • 避免阳光直射传感器
    • 定期自动零点校准(如每2小时)
  3. 不同位置测量不一致

    • 确保被测物体重心在传感器中心
    • 使用多个传感器时需进行力平衡校准
// 自动零点跟踪实现 void Auto_Zero_Tracking() { static uint32_t last_check = 0; if(HAL_GetTick() - last_check > 7200000) { // 每2小时 last_check = HAL_GetTick(); Get_Maopi(); // 重新获取零点 } }

通过以上技术方案的组合实施,我们的测试系统在0-5kg量程内实现了±2g的测量精度,长期稳定性控制在±5g/8小时以内。这个性能已经能满足大部分家用和商业电子秤的需求。

http://www.jsqmd.com/news/1014762/

相关文章:

  • Redis 从入门到精通:Python + Redis 构建高并发秒杀系统
  • 华硕笔记本终极控制方案:如何用G-Helper彻底摆脱Armoury Crate的臃肿束缚
  • 学习型搜索与启发式算法完全解析
  • 2026年离心泵源头厂家推荐榜单:辽阳单级/双吸/卧式/立式/不锈钢/防爆/耐酸碱/高温/化工泵全方位品质解析 - 品牌发掘
  • WebAssembly组件模型:从接口定义到跨语言调用的互操作架构
  • 会MySQL就会 Elasticsearch?这个国产框架做到了
  • 告别静态图表!用PyQt+Matplotlib打造媲美ECharts的交互式数据看板(附完整代码)
  • Vim 替换字符串(超详细)
  • 从Sail语言到可执行模拟器:手把手教你用RISC-V官方模型搭建自己的指令测试环境
  • 右键秒算哈希:Windows文件校验神器HashCheck完全指南
  • 终极指南:使用openFPGALoader快速编程300+ FPGA开发板
  • [Android] 三维山水全景地图-3D地形全景观测地图
  • MySQL 系列:第1篇 数据库时代与MySQL
  • 企业必藏!2026最新山东GEO优化机构TOP8横评与全维度选型避坑图谱 - 936品牌测评网
  • Rust借用检查器深度剖析:从NLL到生命周期省略规则的编译器逻辑
  • 荆州住宅精装一站式服务公司排行:5家实力服务商盘点 - 互联网科技品牌测评
  • YOLOv8训练实测:为什么我的小目标数据集上,nano模型和small模型效果差不多?
  • 潮州市黄金回收三家门店实地探店综合测评 - 靖昱黄金回收
  • 网络安全体系设计
  • 茂名市黄金回收三家门店实地探店综合测评 - 靖昱黄金回收
  • 开发记录19_让视频进入语义搜索_抽帧去重与代表向量
  • 明清老医书收藏热度暴涨!2026行情走势与变现优势全解析 - 深鉴新闻
  • 3步解锁中兴光猫工厂模式:zteOnu工具完整使用指南
  • 3步颠覆传统:AI驱动的智能视频自动化创作系统深度解析
  • 2026荆州全屋家装公司名录:核心维度客观对比 - 互联网科技品牌测评
  • 2026年6月江西一线GEO优化机构TOP8硬核测评 - 936品牌测评网
  • [Android] 题有有-中小学拍照找题组卷学习工具
  • CVPR、ICCV、ECCV之外,WACV这个计算机视觉顶会到底值不值得投?
  • 金三银四上云正当时!腾讯云/华为云/阿里云新购续费85折攻略
  • 计算机Java毕设实战-基于 SpringBoot 的水果库存与购物管理系统的设计与实现 现代化生鲜水果电商信息化管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】