1. 项目概述:基于STM8F103与HX711的电子秤采集模块
这个项目实现了一个完整的电子秤数据采集系统,核心由STM8F103微控制器和HX711模数转换芯片组成。作为一个实际量产项目的全套资料,它包含了可直接用于生产的原理图、PCB设计文件、物料清单(BOM)以及经过验证的固件源码。
我在工业称重设备领域有多年开发经验,这个设计方案最大的特点是稳定可靠且成本低廉。STM8F103作为一款经典的8位MCU,配合专为电子秤设计的HX711芯片,能够实现高达24位的ADC分辨率,满足大多数商业电子秤的精度要求。整套系统设计简洁,BOM成本控制在20元以内,非常适合批量生产。
2. 硬件设计解析
2.1 核心器件选型
STM8F103微控制器:
- 采用LQFP48封装,运行频率16MHz
- 内置8KB Flash和1KB RAM
- 具备UART、SPI、I2C等通信接口
- 工作电压2.95V-5.5V,适合电池供电场景
选择这款MCU主要基于三点考虑:首先是成本优势,量大时单价可低至2元;其次是开发环境成熟,IAR for STM8工具链稳定;最后是其外设资源完全满足本项目需求。
HX711模数转换芯片:
- 24位高精度ADC
- 内置低噪声可编程放大器(PGA)
- 支持10Hz或80Hz输出数据速率
- 两线制串行接口(SCK和DOUT)
HX711是电子秤专用芯片,其内部PGA可设置128倍增益,能直接连接称重传感器(Load Cell)的毫伏级输出信号。相比通用ADC芯片,HX711省去了外部放大电路,简化了设计。
2.2 电路设计要点
传感器接口电路:
code复制 +---------------+
| HX711 |
LOADCELL +--- A+ A- |
| |
+--- SCK DOUT--+
| |
| +--- 10K上拉
|
STM8F103
PC5 PC6
称重传感器通常采用全桥式结构,输出差分信号。HX711的A+和A-引脚直接连接传感器,中间不需要额外信号调理电路。但要注意:
- 传感器供电必须稳定,建议使用LDO稳压
- 信号线要尽量短,避免电磁干扰
- 在恶劣环境下可考虑添加TVS二极管保护
电源设计:
- 主电源输入5V,通过AMS1117-3.3转换为3.3V
- HX711和STM8均可工作在3.3V
- 称重传感器建议单独供电,与数字部分隔离
提示:在PCB布局时,模拟部分(传感器和HX711)与数字部分(MCU)要分开布局,地平面用0Ω电阻单点连接,可有效降低噪声。
3. 固件设计与实现
3.1 系统架构
固件采用前后台(Super Loop)架构:
c复制void main(void) {
System_Init(); // 硬件初始化
Load_Calibration(); // 读取校准参数
while(1) {
IWDG_ReloadCounter(); // 喂狗
if(Need_Weigh) {
Weigh_Process(); // 称重处理
Need_Weigh = 0;
}
UART_Process(); // 处理串口通信
LED_Blink(); // 状态指示
}
}
这种架构简单可靠,适合实时性要求不高的应用。主循环中各个任务按优先级顺序执行,配合看门狗确保系统稳定性。
3.2 HX711驱动程序实现
HX711的驱动关键在于精确的时序控制。以下是读取ADC值的核心代码:
c复制uint32_t HX711_Read(void) {
uint32_t data = 0;
while(HX711_DOUT); // 等待数据就绪
__disable_interrupt(); // 关闭中断确保时序准确
for(uint8_t i=0; i<24; i++) {
HX711_SCK_HIGH();
Delay_us(1);
data <<= 1;
if(HX711_DOUT_READ()) data++;
HX711_SCK_LOW();
Delay_us(1);
}
// 第25个脉冲设置增益
HX711_SCK_HIGH();
Delay_us(1);
HX711_SCK_LOW();
__enable_interrupt();
return data ^ 0x800000; // 补码转换
}
这段代码有几个关键点:
- 读取前要等待DOUT变低,表示数据就绪
- 24个时钟脉冲对应24位数据,MSB优先
- 第25个脉冲用于设置下次转换的增益
- 关闭中断确保时序不被干扰
- 最后进行补码转换,得到有符号数
3.3 数据处理与校准算法
原始ADC值需要转换为实际重量,这涉及两个关键参数:零点和斜率。
零点校准:
c复制void Calibrate_Zero(void) {
Weigh_Zero = Data_Process(); // 获取当前ADC值
EE_Write(Addr_Zero, (uint8_t*)&Weigh_Zero, 4); // 保存到EEPROM
}
重量计算:
c复制float Get_Weight(void) {
int32_t adc_val = Data_Process() - Weigh_Zero;
return (float)adc_val / Scale_Factor; // 单位:克
}
对于不同量程的传感器,需要调整Scale_Factor参数。40kg传感器的典型值约为4000,表示每克对应的ADC码值。这个值需要通过标准砝码实际测量得到。
4. 通信协议与接口
4.1 串口配置
- 波特率:19200
- 数据位:8
- 停止位:1
- 无校验位
这个配置平衡了传输速度和可靠性,适合大多数应用场景。如果需要更长距离传输,可以降低波特率或添加校验。
4.2 数据帧格式
系统采用自定义协议帧,结构如下:
| 字段 | 长度 | 说明 |
|---|---|---|
| 帧头 | 5字节 | 固定为"HX711"ASCII码 |
| 长度 | 2字节 | 后续数据长度 |
| 命令 | 1字节 | 指令代码 |
| 参数 | 变长 | 指令参数 |
| 校验 | 1字节 | 异或校验和 |
主要指令:
- 0x01:读取重量
- 0x02:零点校准
- 0x03:设置量程系数
4.3 典型通信流程
读取重量:
code复制上位机发送:48 58 37 31 31 00 02 01 00 02 (HX711 + 长度2 + 命令01 + 校验02)
模块回复:48 58 37 31 31 00 04 01 13 88 00 9E (HX711 + 长度4 + 命令01 + 重量5000g + 校验9E)
零点校准:
code复制上位机发送:48 58 37 31 31 00 01 02 03 (HX711 + 长度1 + 命令02 + 校验03)
模块回复:48 58 37 31 31 00 01 02 03 (确认执行)
5. 系统可靠性设计
5.1 看门狗应用
独立看门狗(IWDG)配置:
c复制void IWDG_Config(void) {
IWDG->KR = 0xCC; // 启动看门狗
IWDG->KR = 0x55; // 解锁PR和RLR寄存器
IWDG->PR = 0x06; // 预分频256
IWDG->RLR = 0xFF; // 重载值
IWDG->KR = 0xAA; // 重载计数器
}
这样配置后,看门狗超时时间约为1秒。在主循环中定期喂狗,如果程序跑飞无法正常喂狗,系统会自动复位。
5.2 数据滤波算法
为提高称重稳定性,固件实现了滑动平均滤波:
c复制#define FILTER_SIZE 8
int32_t filter_buf[FILTER_SIZE];
uint8_t filter_index = 0;
int32_t Data_Filter(int32_t new_data) {
filter_buf[filter_index++] = new_data;
if(filter_index >= FILTER_SIZE) filter_index = 0;
int64_t sum = 0;
for(uint8_t i=0; i<FILTER_SIZE; i++) {
sum += filter_buf[i];
}
return (int32_t)(sum / FILTER_SIZE);
}
这种算法简单有效,能有效抑制随机干扰。根据实际需求,可以调整FILTER_SIZE参数,值越大滤波效果越好但响应越慢。
6. 量产注意事项
6.1 生产测试流程
-
硬件测试:
- 检查各电源电压是否正常
- 测量传感器激励电压(通常5V或10V)
- 验证HX711时钟信号波形
-
功能测试:
- 空载时输出应为0±1g
- 加载标准砝码检查读数准确性
- 测试串口通信是否正常
-
校准流程:
- 空载状态下发送校准指令
- 加载已知重量(如500g)设置量程系数
- 验证中间点(如250g)精度
6.2 常见问题排查
问题1:读数不稳定,跳动大
- 检查传感器安装是否牢固
- 确认电源是否干净,可尝试增加滤波电容
- 检查PCB布局,模拟和数字地处理是否正确
问题2���称重线性度差
- 检查传感器是否过载损坏
- 验证校准过程是否正确
- 可能需要重新设置量程系数
问题3:通信异常
- 确认波特率设置一致
- 检查TX/RX线序是否正确
- 测量信号电平是否符合标准
7. 项目扩展与优化
这套基础方案可以根据需求进行多种扩展:
-
显示界面:
- 添加LCD或LED数码管显示
- 使用TM1620等驱动芯片简化设计
-
无线传输:
- 通过HC-05蓝牙模块实现手机连接
- 使用ESP8266增加Wi-Fi功能
-
高级功能:
- 实现称重累加功能
- 添加重量变化触发报警
- 支持多台设备组网
在实际项目中,我发现STM8F103的Flash空间有时会成为限制。如果需要更复杂的功能,可以考虑升级到STM32F0系列,它们引脚兼容但性能更强。
