1. 项目概述:HX711电子称重报警系统设计
这个基于STC89C52单片机的电子称重系统,是我在工业自动化项目中多次迭代的成熟方案。HX711作为核心传感器接口芯片,其24位ADC分辨率能实现0.1g级别的称重精度——这相当于能感知一片A4纸的重量变化。系统通过应变片式称重传感器采集重量信号,经HX711模数转换后,由STC89C52处理并显示数值,当超限时触发声光报警。
实际工程中,HX711的增益选择直接影响测量范围。128增益适合0-5kg场景,而64增益更适合10kg以上量程。我曾在一个药品分装项目中,因错误配置增益导致小数点后两位数据跳变,这个教训后面会详细说明。
2. 硬件架构深度解析
2.1 核心器件选型依据
STC89C52作为经典51内核单片机,其12MHz主频和8KB Flash完全满足称重系统的实时性需求。相比STM32,它的优势在于:
- 更简单的开发环境(Keil C51即可)
- 更低功耗(实测待机电流<1mA)
- 更强的抗干扰能力(工业现场验证)
HX711的差分输入设计能有效抑制共模干扰,这是普通ADC无法实现的。其内部PGA(可编程增益放大器)提供128/64/32三档可选,对应不同的称重量程:
| 增益值 | 量程范围 | 适用场景 |
|---|---|---|
| 128 | 0-5kg | 实验室精密称重 |
| 64 | 5-20kg | 工业称重 |
| 32 | 20-50kg | 物流称重 |
2.2 电路设计关键细节
称重传感器采用全桥式应变片结构,其输出电压仅约0-20mV。HX711的输入端需要严格遵循以下设计规范:
- 传感器与HX711之间必须用屏蔽双绞线连接
- AVDD和DVDD需分别用10μF+0.1μF电容退耦
- 基准电压引脚要接1%精度的2.5V稳压管
报警电路采用NPN三极管驱动蜂鸣器,IO口串联220Ω电阻。实测发现:直接驱动5V有源蜂鸣器会导致单片机复位,这是电源负载突变的典型问题。
3. 软件实现核心技术
3.1 HX711驱动程序编写
HX711的串行通信时序要求严格,以下是经过优化的读取函数(Keil C51):
c复制long HX711_Read() {
unsigned long count = 0;
HX711_DOUT = 1;
delay_us(1);
HX711_SCK = 0;
while(HX711_DOUT); // 等待转换完成
for(char i=0; i<24; i++) {
HX711_SCK = 1;
delay_us(1);
count <<= 1;
if(HX711_DOUT) count++;
HX711_SCK = 0;
delay_us(1);
}
// 第25个脉冲选择增益
HX711_SCK = 1;
delay_us(1);
HX711_SCK = 0;
return (count ^ 0x800000);
}
关键点:必须保证SCK高低电平时间>1μs,否则会导致数据错位。我曾因省略delay_us()导致重量值出现±10%波动。
3.2 数字滤波算法实现
原始数据存在±3个LSB的噪声,采用移动平均+阈值滤波组合算法:
c复制#define FILTER_LEN 10
long filter_buf[FILTER_LEN];
long DigitalFilter(long raw) {
static char index = 0;
long sum = 0;
filter_buf[index++] = raw;
if(index >= FILTER_LEN) index = 0;
// 去除最大最小值
long max=filter_buf[0], min=filter_buf[0];
for(char i=1; i<FILTER_LEN; i++) {
if(filter_buf[i] > max) max = filter_buf[i];
if(filter_buf[i] < min) min = filter_buf[i];
}
for(char i=0; i<FILTER_LEN; i++) {
if(filter_buf[i]!=max && filter_buf[i]!=min)
sum += filter_buf[i];
}
return sum/(FILTER_LEN-2);
}
4. 仿真与调试实战
4.1 Proteus仿真要点
在Proteus中搭建仿真电路时需注意:
- HX711模型需手动添加(没有官方模型)
- 应变片传感器用可变电阻模拟
- 设置单片机晶振频率为11.0592MHz(串口无误差)
仿真中发现的典型问题:
- 电源未加退耦电容时,ADC值会周期性跳变
- 传感器线过长会导致波形畸变
4.2 实物调试技巧
-
校准步骤:
- 空载时调用HX711_Read()获取零点值
- 放置已知重量砝码(建议500g)
- 计算系数:系数 = 砝码重量/(读数-零点值)
-
抗干扰措施:
- 在HX711的CLK和DATA线对地接100pF电容
- 单片机每隔1秒复位HX711(断电10ms再上电)
-
常见故障排查:
- 数值漂移:检查传感器固定螺栓是否拧紧
- 显示"----":HX711供电不足(测量AVDD电压)
- 数据跳变:检查接地是否良好(共地问题)
5. 系统优化与扩展
5.1 低功耗设计
通过以下措施使待机电流降至0.5mA:
- 关闭单片机未用外设(串口、定时器等)
- 使用HX711的省电模式(PD_SCK拉高>60μs)
- LCD背光采用PWM调光(20%亮度足够)
5.2 工业级改进方案
在粉尘环境中需要:
- 增加TVS二极管防护(如P6KE6.8CA)
- 传感器接头改用航空插头
- 程序加入看门狗(WDT_CONTR=0x35)
对于需要数据记录的场合,可外接AT24C02 EEPROM存储校准参数。一个实用的存储结构体:
c复制typedef struct {
long offset; // 零点值
float scale; // 比例系数
char unit; // 单位(0=g,1=kg)
} HX711_Param;
这个项目最让我意外的是HX711的温度漂移问题——在昼夜温差大的车间,早晚会有约0.3%的读数偏差。后来通过软件温度补偿(每℃修正0.01%)解决了这个问题,具体方法是在HX711附近放置DS18B20温度传感器。
