一、HX711模块基本介绍
一)、核心功能
-
24位高精度ADC
- 专为称重传感器设计的模数转换芯片,支持±20mV或±40mV满幅差分输入
- 内置128/64倍可编程增益放大器(通道A)及固定32倍增益(通道B)
-
集成化设计
- 集成稳压电源、时钟振荡器等外围电路,无需额外模拟电源
- 支持两路差分信号输入,可灵活选择通道A或B进行数据采集
二)、硬件特性
参数 | 规格 |
---|---|
工作电压 | 2.6~5.5V(兼容3.3V/5V系统) |
输出数据速率 | 10Hz(抗50/60Hz工频干扰)或80Hz(高速模式) |
通信接口 | 仅需SCK(时钟)和DOUT(数据)两线制串行通信 |
封装形式 | SOP-16封装,支持工业级温度范围(-20°C~+85°C) |
三)、工作原理
-
数据采集流程
- DOUT引脚变低电平后,控制器发送25~27个时钟脉冲读取24位数据及增益配置
- 第25个脉冲用于切换下一次采样通道(A或B)
-
信号处理机制
- 差分输入信号经可编程放大器放大后,由24位ADC转换为数字量
- 输出数据格式为二进制补码,需进行符号位扩展处理
四)、典型应用场景
- 称重系统:电子秤、料斗秤、工业称重设备
- 压力检测:压力传感器信号采集与处理
- 工业控制:张力检测、物料流量监控等场景
二、硬件连接规范
-
电源接口
- HX711的 VCC 接 ESP32 的 3.3V 输出端
- HX711的 GND 与 ESP32 共地连接
-
数据通信接口
- HX711的 DOUT(数据输出)接 ESP32 的任意 GPIO 输入引脚(比如 GPIO5)
- HX711的 PD_SCK(时钟信号)接 ESP32 的任意 GPIO 输出引脚(比如 GPIO4)
-
传感器接口
- 称重传感器的 E+、E- 接 HX711 的激励电压输出端(通常为红色、黑色线)
- 称重传感器的 A+、A- 接 HX711 的信号输入端(通常为白色、绿色线)
三、软件配置要点
-
引脚初始化
from machine import Pin hx711_dout = Pin(5, Pin.IN) # DOUT接GPIO5 hx711_sck = Pin(4, Pin.OUT) # SCK接GPIO4
-
通信时序控制
- 遵循 24个时钟脉冲读取数据 + 1个脉冲结束通信 的时序规范
- 每个时钟脉冲后需保持至少 1μs 的延时
-
电源管理
- 建议在 HX711 的 VCC 和 GND 之间并联 100nF 滤波电容
- 若使用外部稳压电源,需确保 DVDD 与 ESP32 共地
四、代码实现及其要点说明
from machine import Pin
import time
import ujson
class HX711:
def __init__(self, dt_pin, sck_pin):
self.dt = Pin(dt_pin, Pin.IN)
self.sck = Pin(sck_pin, Pin.OUT)
self.offset = 0
self.scale = 1.0
def read_raw(self):
# 等待数据准备好(DT引脚变低)
while self.dt.value() == 1:
time.sleep_us(1)
data = 0
for _ in range(24): # 读取24位数据
self.sck.value(1)
time.sleep_us(1)
data = (data << 1) | self.dt.value()
self.sck.value(0)
time.sleep_us(1)
# 补码符号位扩展
if data & 0x800000:
data |= 0xFF000000
self.sck.value(1) # 发送第25个脉冲结束本次读取
time.sleep_us(1)
self.sck.value(0)
time.sleep_us(1)
return data
def tare(self, samples=10):
# 去皮操作
self.offset = sum(self.read_raw() for _ in range(samples)) / samples
def set_scale(self, weight,samples=10):
# 设置比例系数
raw = sum(self.read_raw() for _ in range(samples)) / samples
self.scale = (raw - self.offset) / weight
if self.scale == 0:
self.scale = 1
def get_weight(self, samples=3):
# 获取校准后的重量
raw = sum(self.read_raw() for _ in range(samples)) / samples
return (raw - self.offset) / self.scale
def save_offset_scale(self,filename="hx711setting.json"):
with open(filename, 'w') as f:
ujson.dump({'offset':self.offset, 'scale':self.scale}, f)
# 使用示例
hx = HX711(dt_pin=5, sck_pin=4)
# 校准流程
hx.tare() # 空载时去皮
hx.set_scale(500) # 设置比例系数,需根据实际砝码校准
hx.save_offset_scale()
# 获取重量
while True:
weight = hx.get_weight()
print("重量: %.2f g" % weight)
time.sleep(1)
建议读取数据前,先检测数据是否就绪,这样可以避免无谓的等待,提高产品的体验感,当然如果是单纯的电子称重器就无所谓了。
设置比例系数之前必须去皮,也就是调用hx.tare()。设置比例系数,其实就是计算出每克对应的AD值,所以,建议使用精度相对较高的,质量相对大一些的砝码来操作。设置好后建议保存到flash或eeprom中,这样断电后重新上电就不需要重新设置比例系统。同样的,去皮得到的值也需要保存到flash或eeprom中。