4、重量传感器接口:HX711模块详解、ADC采样原理、差分信号与屏蔽线布线
好,咱们进入第四讲。重量传感器,说白了就是电子秤的核心。你想想看,货架上每件商品多重,数据怎么来的?全靠这个小小的传感器和它背后的信号链。
我个人习惯把重量测量系统分成三段:传感器本体、模拟前端、数字接口。今天重点讲后两段——HX711这个专用ADC,以及怎么把信号干净地传过来。
4.1 HX711模块:专为称重而生
HX711这芯片,我用了快十年了。它不是什么万能ADC,但做称重,它确实是把好手。
为什么这么说?因为它把很多麻烦事都替你干了:
- 内置差分输入:直接接电桥,不用额外运放
- 24位Δ-Σ ADC:分辨率够用,噪声控制得不错
- 可编程增益:32、64、128三档,适应不同量程
- 两路差分通道:A通道接主传感器,B通道可以接参考
- 数字接口简单:就两根线,PD_SCK和DOUT
我记得第一次用HX711时,还担心24位ADC会不会太娇气。后来发现,它内部有数字滤波器,对工频干扰抑制得挺好。当然,前提是你布线别太随意。
核心参数速查
| 参数 | 典型值 | 说明 |
|---|---|---|
| 分辨率 | 24位 | 无失码 |
| 增益 | 32/64/128 | A通道可选 |
| 数据速率 | 10Hz / 80Hz | 可配置 |
| 供电电压 | 2.6V ~ 5.5V | 兼容3.3V和5V系统 |
| 差分输入范围 | ±0.5V / ±1V | 取决于增益 |
4.2 ADC采样原理:从模拟到数字的桥梁
ADC采样,说白了就是把连续的电压值,变成一串二进制数。HX711用的是Δ-Σ架构,跟普通的逐次逼近型不太一样。
Δ-Σ的核心思想是「过采样+噪声整形」。它用很高的频率去采样,然后把噪声推到高频段,再用数字滤波器把高频部分砍掉。这样做的好处是:分辨率高,线性度好。
但代价是什么?速度慢。HX711的数据速率最高才80Hz,做静态称重没问题,你要是想测快速变化的力,它就不太行了。
我遇到过一位客户,非要用HX711做动态称重,结果数据跳得跟心电图似的。后来换了ADS1232,才解决问题。所以选型时一定要想清楚:你要的是精度,还是速度?
采样时序要点
HX711的DOUT引脚在数据准备好后会拉低。这时你给PD_SCK发25个脉冲:前24个读出数据,第25个切换通道或增益。注意,脉冲频率不能超过2MHz,我一般用1MHz左右,稳定。
4.3 差分信号:为什么比单端强?
重量传感器输出的是差分信号。什么意思?就是两根线,一根正,一根负,信号是它们之间的差值。
你想想看,如果周围有电磁干扰,干扰信号会同时耦合到两根线上。差分传输时,两根线上的干扰幅度差不多,一相减,干扰就被抵消了。这就是共模抑制。
HX711的差分输入范围是±0.5V(增益128时)。实际应用中,电桥输出也就几毫伏到几十毫伏。所以增益128是常用档位。
我个人的习惯是:差分线尽量等长、等距。不等长会导致两根线上耦合的噪声有相位差,共模抑制效果就打折扣了。
注意:差分信号不是随便两根线就行。必须保证两根线的路径尽可能一致,否则共模噪声无法完全抵消。我曾经见过一个设计,差分线走了不同的过孔层,结果噪声大了三倍。
4.4 屏蔽线布线:实战中的避坑指南
好了,理论说完了,咱们聊聊实战。屏蔽线怎么布?我踩过的坑,你最好别踩。
第一,屏蔽层单端接地。 屏蔽层的作用是收集外部干扰,然后把它引到地。如果两端都接地,会形成地环路,反而引入噪声。我一般只在传感器端接地,ADC端悬空。
第二,屏蔽层不能当信号地用。 有些人图省事,把屏蔽层当作信号地线来走电流。这是大忌!屏蔽层一旦有电流流过,就会产生压降,干扰信号。
第三,差分线用双绞屏蔽线。 双绞线本身就有抗干扰能力,再加上屏蔽层,效果更好。我推荐用AWG24或AWG26的双绞屏蔽线,长度不超过3米。
我曾经在一个项目里,传感器离主板有2米远。一开始用了普通排线,数据跳得没法看。后来换成双绞屏蔽线,屏蔽层单端接地,数据立马稳了。嗯,有时候问题就这么简单。
布线检查清单
- 差分线是否等长?误差控制在5mm以内
- 屏蔽层是否单端接地?
- 信号线是否远离电源线和时钟线?
- HX711的模拟地和数字地是否分开?最后单点连接
- 电源去耦电容是否靠近芯片引脚?
4.5 代码示例:读取HX711数据
最后,给一段实际读取代码。我用的是STM32,但逻辑通用,移植到其他MCU也很简单。
// HX711读取函数
// 返回24位有符号整数
int32_t HX711_Read(void)
{
int32_t value = 0;
uint8_t i;
// 等待DOUT变低,表示数据就绪
while(HAL_GPIO_ReadPin(HX711_DOUT_GPIO_Port, HX711_DOUT_Pin));
// 读取24位数据
for(i = 0; i < 24; i++)
{
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
value = value << 1;
if(HAL_GPIO_ReadPin(HX711_DOUT_GPIO_Port, HX711_DOUT_Pin))
{
value |= 1;
}
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
}
// 第25个脉冲,切换通道和增益
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
// 处理符号位(24位数据,最高位是符号)
if(value & 0x800000)
{
value |= 0xFF000000; // 扩展为32位有符号数
}
return value;
}
小技巧:读取到的原始数据需要减去空载时的零点值,再乘以标定系数,才能得到实际重量。标定系数可以用已知重量的砝码来校准。我一般取10次读数的平均值,减少随机噪声。
好了,这一讲就到这里。差分信号和屏蔽线布线,说白了就是「让信号干净地到达ADC」。你只要记住:等长、屏蔽、单端接地,这三个关键词,基本不会出大问题。
下一讲,咱们聊聊温湿度传感器,那个又是另一套玩法了。