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/128A通道可选
数据速率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」。你只要记住:等长、屏蔽、单端接地,这三个关键词,基本不会出大问题。

下一讲,咱们聊聊温湿度传感器,那个又是另一套玩法了。