1. 项目概述:基于STM8F103与HX711的电子秤采集模块
去年帮朋友工厂改造老旧电子秤产线时,发现市面上很多模块要么成本太高,要么稳定性不足。于是基于STM8F103和HX711设计了这个量产级电子秤采集方案,经过6个月实际产线验证,日均称重3000+次无故障。整套方案包含硬件设计文件、量产固件和完整开发文档,特别适合需要快速投产的中小企业。
这个模块的核心价值在于:
- 采用工业级STM8F103C6T6作为主控,成本控制在5元以内
- 支持40kg量程传感器(可适配其他规格)
- 内置看门狗和异常恢复机制
- 提供标准UART通信协议
- 全套量产验证过的工程文件
2. 硬件设计解析
2.1 核心器件选型
主控芯片选择:
STM8F103C6T6这颗8位MCU可能看起来有些"过时",但在电子秤这种对实时性要求不高但需要长期稳定运行的场景中,它的优势非常明显:
- 内置16MHz RC振荡器(省去外部晶振)
- 10万次擦写寿命的Flash
- 2.95-5.5V宽电压工作
- 价格仅为STM32同性能型号的1/3
HX711模数转换器:
这个专为电子秤设计的24位ADC芯片有几个关键特性需要注意:
- 内置128倍可编程增益放大器
- 典型转换速度10Hz/80Hz可选
- 工作电压2.6-5.5V
- 差分输入设计有效抑制共模干扰
实际测试中发现:HX711的基准电压稳定性直接影响测量精度,建议在VCC和GND之间并联100uF+0.1uF电容组合。
2.2 PCB设计要点
原理图中几个关键电路需要特别注意:
传感器接口电路:
code复制 +---------------+
| HX711 |
SENSOR+--|AINP VCC |--+3.3V
| SCK |--|-->PA1
SENSOR-|AINN DOUT |--|-->PA2
| GND |--GND
+---------------+
- 传感器线建议使用屏蔽双绞线
- 在AINP/AINN引脚就近放置0.1uF滤波电容
- 信号线走线尽量等长
电源电路:
采用HT7333 LDO为系统提供3.3V电源,虽然STM8工作电压范围宽,但HX711在3.3V下性能更稳定。实测发现,当市电波动较大时,在LDO输入端增加470uF电解电容可有效避免读数跳变。
3. 固件设计与实现
3.1 系统架构设计
采用经典的前后台系统架构:
c复制void main(void) {
System_Init();
while(1) {
IWDG_ReloadCounter(); // 喂狗
Weight_Process(); // 重量处理
UART_Command_Check(); // 命令处理
LED_Blink(); // 状态指示
}
}
看门狗配置:
c复制// 独立看门狗初始化
void IWDG_Init(void) {
IWDG->KR = 0xCC; // 启动IWDG
IWDG->KR = 0x55; // 解除PR/RLR写保护
IWDG->PR = 0x06; // 预分频256
IWDG->RLR = 0xFF; // 重载值
IWDG->KR = 0xAA; // 重载计数器
}
看门狗超时时间计算:256(分频) × 255(重载值) / 38kHz ≈ 1.71s
3.2 HX711驱动实现
关键时序实现:
c复制uint32_t HX711_Read(void) {
uint32_t data = 0;
while(DOUT_PIN); // 等待数据就绪
for(uint8_t i=0; i<24; i++) {
SCK_HIGH();
delay_us(1);
data <<= 1;
if(DOUT_PIN) data++;
SCK_LOW();
delay_us(1);
}
// 设置下次转换的通道和增益
SCK_HIGH();
delay_us(1);
SCK_LOW();
return data ^ 0x800000; // 转换补码
}
数据处理算法:
c复制#define SAMPLE_TIMES 10 // 采样次数
int32_t Data_Process(void) {
int64_t sum = 0;
for(uint8_t i=0; i<SAMPLE_TIMES; i++) {
sum += HX711_Read();
delay_ms(5);
}
return (int32_t)(sum/SAMPLE_TIMES);
}
3.3 校准与重量计算
校准流程:
- 空载状态下发送校准命令"CALIB"
- 模块采集当前AD值作为Weigh_Zero
- 将Weigh_Zero写入Flash保存
重量计算公式:
code复制实际重量(g) = (当前AD值 - Weigh_Zero) / 比例系数
比例系数需要通过标准砝码标定得出,不同量程传感器该值不同。
4. 量产注意事项
4.1 生产测试流程
建议按以下步骤进行模块测试:
- 电源测试:上电电流应<15mA
- 通信测试:发送"TEST"应返回"OK"
- 零点测试:空载时重量显示应在±5g内波动
- 线性测试:用500g/1000g/2000g标准砝码验证
4.2 常见问题解决
问题1:读数不稳定
- 检查传感器供电是否稳定
- 确认HX711的基准电容(0.1uF)质量
- 尝试增加采样次数(SAMPLE_TIMES)
问题2:校准后数值不准
- 确保校准时完全空载
- 检查传感器量程设置是否正确
- 重新标定比例系数
问题3:看门狗频繁复位
- 检查主循环执行时间是否过长
- 确认没有阻塞式延时
- 适当调整看门狗超时时间
5. 进阶优化建议
对于有更高要求的应用场景,可以考虑以下优化:
温度补偿:
在PCB上增加DS18B20温度传感器,采集温度数据后对重量值进行补偿:
c复制float temp_compensate(float weight, float temp) {
// 根据温度-误差曲线进行补偿
static const float comp_table[] = {0.1,0.2,0.15...};
return weight * (1 + comp_table[(int)temp]);
}
滤波算法优化:
采用滑动平均+卡尔曼滤波组合算法:
c复制#define FILTER_LEN 5
typedef struct {
float buffer[FILTER_LEN];
uint8_t index;
} Filter_Type;
float kalman_filter(Filter_Type* f, float new_val) {
// 实现省略...
}
这个方案已经成功应用于3家电子秤制造企业,累计出货超过2万套。特别提醒:不同批次的HX711可能存在细微差异,建议每批次抽检10%进行全参数测试。