1. 项目概述:基于STM8F103与HX711的电子秤模块设计
最近在整理工作室物料时翻出一个尘封的电子秤项目,这是去年为某食品包装产线开发的称重模块量产方案。整套系统采用STM8F103作为主控,搭配经典的HX711称重芯片,实测精度能达到±5g(使用40kg传感器时)。这个方案最让我满意的是其极简的外围电路——算上电源指示灯整个PCB仅需22个元件,BOM成本控制在15元以内,非常适合需要大批量部署的工业场景。
模块的核心功能非常纯粹:上电即通过串口连续输出重量数据(19200bps),支持远程发送指令进行零点校准。特别值得一提的是看门狗机制的引入,在三个月的老化测试中,模块累计运行超过2000小时未出现死机情况。下面我将从硬件设计、固件架构到量产调校,完整拆解这个经过市场验证的方案。
2. 硬件设计解析
2.1 核心器件选型
主控芯片STM8S103F3P6的选择经过多轮对比:
- 8位内核运行在16MHz,完全满足称重应用的实时性要求
- 内置8KB Flash和1KB RAM,足够存储校准参数和运行复杂滤波算法
- 提供硬件I2C和UART,简化与HX711及上位机的通信
- 2.95-5.5V宽电压支持,可直接由锂电池供电
- 最关键的是其2元左右的单价,大幅降低量产成本
HX711芯片的优势在于:
- 24位ADC分辨率,理论灵敏度达0.01g(实际受传感器限制)
- 内置128倍可编程增益放大器(PGA),可直接连接桥式传感器
- 单电源供电(2.6-5.5V),功耗仅1mA@10Hz采样率
- 硬件SPI接口,仅需两个GPIO即可驱动
2.2 电路设计要点
原理图中几个关键设计值得注意:
-
传感器接口:
- 采用4线制接法(EXC+、EXC-、SIG+、SIG-)
- 0.1μF去耦电容尽量靠近HX711的AVDD引脚
- 在信号线串联100Ω电阻抑制射频干扰
-
电源处理:
- 使用ME6210线性稳压芯片提供3.3V
- 数字与模拟地通过0Ω电阻单点连接
- 电池输入端反接肖特基二极管防反接
-
抗干扰设计:
- 所有IO口串联220Ω电阻限流
- UART线路添加TVS二极管防静电
- PCB布局时将HX711与MCU保持至少10mm间距
提示:量产时建议在HX711的DVDD与AVDD之间预留0Ω电阻位置,方便后期根据实际传感器特性调整供电方案。
3. 固件架构实现
3.1 主程序流程
系统采用经典的前后台架构,主循环代码如下(已简化):
c复制void main(void) {
Hardware_Init(); // 硬件初始化
Load_Calibration(); // 读取EEPROM中的校准值
while(1) {
IWDG_ReloadCounter(); // 喂狗
Weight_Process(); // 重量采集处理
UART_Command_Check(); // 指令处理
LED_Blink(); // 状态指示
}
}
3.2 重量采集算法
原始ADC值需要经过三重处理:
- 数字滤波:连续采样25次取中值
c复制int32_t HX711_ReadMedian(uint8_t times) {
int32_t buffer[25];
for(uint8_t i=0; i<times; i++) {
buffer[i] = HX711_Read();
}
BubbleSort(buffer, times); // 冒泡排序
return buffer[times/2]; // 取中值
}
-
单位转换:
重量(g) = (原始值 - 零点值) / 比例系数
其中比例系数=传感器量程(40kg)/灵敏度(2mV/V) -
滑动平均:
c复制#define FILTER_SIZE 5
int32_t filter_buf[FILTER_SIZE];
int32_t Moving_Average(int32_t new_val) {
static uint8_t index = 0;
filter_buf[index++] = new_val;
if(index >= FILTER_SIZE) index = 0;
int64_t sum = 0;
for(uint8_t i=0; i<FILTER_SIZE; i++) {
sum += filter_buf[i];
}
return sum / FILTER_SIZE;
}
3.3 校准流程优化
量产时发现三个关键点:
- 预热校准:传感器通电后需要至少5分钟预热才能获得稳定零点
- 多点校准:建议在10%、50%、90%量程设置校准点
- 温度补偿:在EEPROM中存储两组校准值(常温与高温)
校准指令处理逻辑:
c复制if(cmd == CALIBRATE_CMD) {
Weigh_Zero = HX711_ReadMedian(25);
FLASH_ProgramWord(Addr_Zero, Weigh_Zero);
UART_SendMsg("Calibration OK");
}
4. 量产测试方案
4.1 PCB测试要点
我们设计了专用治具进行自动化测试:
-
电源测试:
- 3.3V电压偏差需<±1%
- 静态电流<1mA(休眠状态)
-
通信测试:
- 发送"TEST"指令应返回"OK"
- 连续发送1000条指令校验无丢包
-
精度测试:
使用标准砝码验证各量程点:- 100g点误差<±3g
- 10kg点误差<±10g
- 40kg点误差<±30g
4.2 常见问题排查
根据5000套量产经验总结的故障树:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 上电无反应 | 电源反接 | 检查二极管方向 |
| 数据跳动大 | 传感器未接地 | 补焊地线 |
| 校准后归零不准 | EEPROM写保护 | 重新烧录选项字节 |
| 通信中断 | 波特率偏移 | 调整HSI微调值 |
5. 进阶优化方向
在实际部署中我们还尝试了以下增强方案:
- 动态补偿算法:检测到快速重量变化时自动提高采样率
- 电池管理:电压低于3V时进入脉冲工作模式
- 无线传输:通过HC-12模块实现百米级数据传输
这个项目最让我意外的发现是:STM8的硬件I2C在驱动HX711时,稳定性反而不如GPIO模拟时序。后来用逻辑分析仪抓取波形才发现,HX711对时钟下降沿的建立时间要求异常严格(至少500ns),而硬件I2C无法精确控制这个参数。这个小细节让我在调试点上多花了两天时间,但也再次验证了嵌入式开发的金科玉律——永远不要轻信数据手册上的理想波形。