电子秤这东西看起来简单,不就是个传感器加个屏幕嘛,但真要做到精度稳定、跳数小、长期不漂移,里面的门道比大多数人想象的多得多。我前后做过好几款基于应变片式传感器的称重设备,从最初用运放加分立ADC搭电路,到后来转向集成方案,踩过的坑足够写一本小册子。NAU7802 这颗 24 位 ADC 是我目前在小量程高精度称重场景下最常用的方案之一,它把 PGA、振荡器、桥路激励和数字滤波都集成进去了,外围只需要几个电容和电阻就能跑起来,特别适合做 3kg 以内的电子秤、厨房秤、咖啡秤或者小型配料系统。
但"能跑起来"和"跑得准"之间隔着一条很宽的河。很多人第一次用 NAU7802 的时候,接上线、读出来数据、发现数值乱跳或者零点漂移严重,就开始怀疑芯片有问题。实际上绝大多数情况下问题出在硬件布局、激励方式、校准流程或者滤波参数上。这篇内容我会从实际项目出发,把 NAU7802 从原理到落地的完整链路拆开讲清楚,包括应变片桥路的匹配、模拟前端的布局要点、I2C 通信的稳定性处理、校准算法的设计,以及最终怎么把这些东西整合成一个能稳定出数的电子秤。不管你是刚接触称重电子的新手,还是已经做过几款秤但精度始终差一口气的老手,应该都能从里面找到有用的东西。
1. 应变片桥路与 NAU7802 的匹配逻辑
1.1 为什么 24 位 ADC 不是精度瓶颈
很多人一上来就盯着 ADC 的位数看,觉得 24 位就是比 16 位强,实际上在称重应用里,ADC 的分辨率只是整个信号链里的一环。一个典型的应变片式称重传感器,满量程输出通常只有 1mV/V 到 3mV/V 之间。假设你用 5V 激励,满量程差分输出也就 5mV 到 15mV。而 NAU7802 的 PGA 可以设置 1、2、4、8、16、32、64、128 倍增益,在 128 倍增益下,15mV 的满量程信号被放大到 1.92V,这时候 ADC 的有效位数才能真正被利用起来。
但问题在于,应变片桥路的输出阻抗、温漂特性、非线性度,以及激励源的稳定性,都会直接影响最终精度。我见过太多案例,ADC 选得很好,但传感器本身的一致性差,或者激励电压随温度变化,导致读数漂移。所以第一步不是选 ADC,而是搞清楚你的传感器特性和精度需求之间的匹配关系。
| 传感器满量程输出 | 推荐 PGA 增益 | 有效分辨率(约) | 适用场景 |
|---|---|---|---|
| 1mV/V | 128 | 17-18 bit | 小量程精密秤 |
| 2mV/V | 64-128 | 18-19 bit | 常规电子秤 |
| 3mV/V | 32-64 | 18-19 bit | 大量程台秤 |
这张表的意思是,如果你的传感器输出很小,就必须用高增益把信号拉起来,否则 ADC 的低几位全是噪声。但增益也不是越高越好,增益越高,对前端噪声和失调的要求就越苛刻。
1.2 桥路激励方式的选择与影响
NAU7802 内部集成了一个低噪声的 LDO 稳压器,可以给外部桥路提供激励电压,典型值是 4.5V 左右(取决于 AVDD)。这个设计很方便,但要注意它的驱动能力有限,如果你的传感器桥路阻抗较低(比如 350Ω 的传感器),激励电流可能达到十几毫安,这时候内部 LDO 的负载调整率就会影响激励电压的稳定性。
我的做法是:对于 350Ω 桥路的传感器,优先考虑外部独立激励源,比如用一个低温漂的基准电压源加缓冲运放来驱动桥路。NAU7802 的激励输出可以作为参考电压输入(REFP/REFN),这样 ADC 的参考电压和桥路激励是同源的,比例式测量的好处是激励电压的绝对精度和温漂会被抵消掉。
注意:如果你用内部 LDO 直接激励桥路,同时又把内部 LDO 作为参考电压,那比例式测量的优势是成立的。但如果你用外部激励源,就必须把外部激励分压后接入 REFP/REFN,否则测量结果会随激励电压波动。
1.3 传感器选型中的隐性参数
选传感器的时候,除了量程、输出灵敏度、非线性度这些明面上的参数,还有几个隐性参数会直接影响你的调试难度。一个是零点漂移,也就是空载时输出随温度的变化量;另一个是蠕变,也就是负载恒定情况下输出随时间的变化。这两个参数在规格书里通常都有,但很多人不看。
我一般会优先选零点漂移小于 0.5% FS/10°C 的传感器,蠕变小于 0.05% FS/30min 的型号。如果传感器本身漂移大,后面用软件补偿会非常痛苦,因为你很难区分是传感器漂移还是电路漂移。
2. 模拟前端布局与抗干扰设计
2.1 电源去耦不是随便放几个电容
NAU7802 有两个电源引脚:AVDD 和 DVDD。AVDD 给模拟部分供电,DVDD 给数字部分供电。很多人图省事,直接把两个引脚接到同一个 3.3V 电源上,然后在每个引脚旁边放一个 0.1uF 电容就完事了。这种做法在低精度场景下勉强能用,但如果你想要稳定的 18 位以上有效精度,电源处理必须认真对待。
我的标准做法是:AVDD 用独立的 LDO 供电,或者在 AVDD 前面加一级 RC 滤波(比如 10Ω 加 10uF 加 0.1uF)。DVDD 可以和 MCU 共用电源,但同样要加去耦。关键是 AVDD 的电源纹波要控制在 1mV 以内,否则它会直接调制到测量结果上。
另外,NAU7802 的 VBG 引脚(内部基准旁路)需要接一个 1uF 到 10uF 的电容到地,这个电容的位置要尽量靠近芯片引脚,走线要短而粗。我见过有人把这个电容放在板子另一头,结果噪声大得没法用。
2.2 模拟走线的三个原则
模拟前端的 PCB 布局,我总结下来就是三个原则:短、隔离、对称。
短是指传感器到 NAU7802 的差分输入走线要尽可能短,最好控制在 5cm 以内。如果传感器和板子之间有较长距离,建议用屏蔽线,并且屏蔽层单点接地。
隔离是指模拟走线和数字走线要分开,尤其是 I2C 的 SCL 和 SDA 走线,不要和模拟输入走线平行走长距离。如果必须交叉,尽量垂直交叉。
对称是指差分输入的两根走线要等长、等宽、靠近走,这样共模干扰才能被有效抑制。NAU7802 的输入是差分输入,但如果你走线不对称,共模抑制比会大幅下降。
2.3 接地策略与噪声来源排查
接地这件事,说起来简单做起来难。我的经验是:模拟地和数字地在芯片下方分开铺铜,然后在一点通过磁珠或者 0Ω 电阻连接。这个连接点要靠近芯片的 AGND 引脚。
如果你发现读数噪声大,可以按以下顺序排查:
- 先用示波器看 AVDD 上的纹波,如果超过 2mV,先解决电源问题。
- 再看传感器激励电压是否稳定,如果激励源本身在跳,后面全白搭。
- 检查差分输入走线是否靠近了高频信号线,比如时钟线或者 PWM 线。
- 最后检查 NAU7802 的配置寄存器,确认采样率和滤波参数是否合理。
我遇到过一次特别隐蔽的问题:板子上有一个 LED 指示灯,它的限流电阻走线刚好从模拟输入旁边经过,LED 闪烁的时候读数就会跳。后来把 LED 走线改到板子另一层就好了。这种问题用万用表根本查不出来,必须用示波器看波形。
3. NAU7802 寄存器配置与采样率取舍
3.1 上电初始化流程
NAU7802 的上电初始化有一套固定流程,顺序错了可能读不到正确数据。我的标准初始化步骤如下:
- 上电后等待至少 10ms,让内部 LDO 稳定。
- 复位芯片(写 R0x00 的 RR 位为 1),然后等待复位完成。
- 配置 PGA 增益(R0x01 的 GAINS 位),根据传感器输出选择合适增益。
- 配置采样率(R0x02 的 CRS 位),通常选 10SPS 或 20SPS。
- 使能内部 LDO 给桥路激励(R0x01 的 VLDO 位)。
- 开启转换(R0x00 的 PUD 位为 1)。
- 等待 DRDY 引脚变低,然后读取 24 位数据。
// NAU7802 初始化示例(伪代码) void nau7802_init(void) { i2c_write(NAU7802_ADDR, 0x00, 0x00); // 复位 delay_ms(10); i2c_write(NAU7802_ADDR, 0x01, 0x30); // PGA=128, LDO使能 i2c_write(NAU7802_ADDR, 0x02, 0x10); // 10SPS i2c_write(NAU7802_ADDR, 0x00, 0x06); // 开启转换 }这段代码看起来简单,但每一步都有讲究。比如复位后必须等待足够时间,否则后续配置可能不生效。PGA 增益的选择要结合传感器输出,增益太高会导致饱和,太低则浪费分辨率。
3.2 采样率与噪声的权衡
NAU7802 支持 10SPS、20SPS、40SPS、80SPS 和 320SPS 几种采样率。采样率越低,内部数字滤波器的抑制效果越好,噪声越小。10SPS 模式下,50Hz 和 60Hz 工频干扰会被有效抑制,适合大多数称重场景。
但低采样率意味着响应速度慢。如果你做的是动态称重,比如传送带上快速过磅,10SPS 就不够用了,得用 80SPS 甚至 320SPS。这时候噪声会明显增大,需要配合软件滤波来平滑数据。
我的建议是:静态称重优先用 10SPS,动态称重根据实际需求选 80SPS 或 320SPS,然后在 MCU 端做滑动平均或者中值滤波。滑动平均的窗口大小要根据响应速度要求来定,一般 4 到 16 个点比较合适。
3.3 寄存器读写中的常见坑
NAU7802 的 I2C 接口有一个特点:读写寄存器时需要先写寄存器地址,然后读或写数据。这个过程中如果 I2C 总线受到干扰,可能会出现数据错位。我的做法是在每次读写后都检查 ACK 信号,如果失败就重试,重试三次还失败就复位 I2C 总线。
另外,NAU7802 的 DRDY 引脚是开漏输出,需要接上拉电阻。如果你用轮询方式读数据,可以不用 DRDY,直接读 R0x00 的 CR 位来判断转换是否完成。但轮询会占用 MCU 资源,而且可能读到重复数据。我一般还是用 DRDY 中断方式,响应更及时。
还有一个坑是:NAU7802 的转换数据是 24 位补码格式,读取后需要做符号扩展。如果你直接当成无符号数处理,负值会变成很大的正数。这个错误在调试时很容易被发现,但如果你用的是现成的库,最好确认一下库里面有没有正确处理符号。
4. 校准算法:从两点校准到多点拟合
4.1 为什么两点校准不够用
大多数电子秤的校准流程就是两点校准:空载时记录零点,放上标准砝码后记录满量程点,然后计算斜率和截距。这个方法在理想线性传感器上没问题,但实际传感器的非线性度通常在 0.02% 到 0.05% FS 之间,对于高精度秤来说,这个非线性误差已经不可忽略了。
我做过一个 3kg 量程的秤,用两点校准后,在 500g 和 2500g 两个点的误差分别是 +0.3g 和 -0.5g。虽然看起来不大,但对于要求 0.1g 分辨率的秤来说,这个误差已经超标了。后来改用五点校准加分段线性拟合,误差降到了 ±0.1g 以内。
4.2 多点校准的实操步骤
多点校准的步骤比两点校准复杂一些,但效果提升明显。我的做法是:
- 空载,记录零点 ADC 值,连续采样 100 次取平均。
- 依次放上 20%、40%、60%、80%、100% 满量程的标准砝码,每个点稳定后采样 100 次取平均。
- 用最小二乘法拟合一条直线,或者用分段线性插值。
- 把拟合参数存入 MCU 的 Flash 中,每次上电后加载。
import numpy as np # 校准数据:砝码重量和对应的ADC读数 weights = np.array([0, 500, 1000, 1500, 2000, 2500, 3000]) # 单位:g adc_values = np.array([1000, 850000, 1700000, 2550000, 3400000, 4250000, 5100000]) # 最小二乘拟合 coeffs = np.polyfit(adc_values, weights, 1) slope, intercept = coeffs[0], coeffs[1] def adc_to_weight(adc): return slope * adc + intercept这段代码演示了最小二乘拟合的基本思路。实际使用中,我建议把校准数据也存下来,如果发现拟合残差太大,可以改用分段线性插值。分段线性插值的好处是不需要假设传感器是线性的,每个区间内单独计算斜率。
4.3 温漂补偿的实用方案
温漂是电子秤精度的大敌。应变片传感器本身有温漂,NAU7802 的基准电压也有温漂,这两个漂移叠加在一起,可能导致读数在温度变化 10°C 时漂移几十克。
我的补偿方案是:在板子上靠近传感器的地方放一个 NTC 热敏电阻或者数字温度传感器,实时监测环境温度。然后在不同温度下做校准,建立温度-零点漂移曲线和温度-灵敏度漂移曲线。实际运行时,根据当前温度查表补偿。
这个方案需要额外的校准工作量,但对于精度要求高的场景是值得的。如果不想做全温度范围的校准,至少可以在常温下校准后,用经验公式做一阶补偿。比如零点漂移通常和温度呈线性关系,可以用两个温度点的数据算出漂移系数。
提示:温漂补偿的前提是温度传感器要能真实反映传感器附近的温度,不要把温度传感器放在发热元件旁边,否则补偿会适得其反。
5. 软件滤波与数据稳定性的实战处理
5.1 滑动平均与中值滤波的组合
原始 ADC 数据即使经过硬件优化,仍然会有一定的噪声。我通常会用滑动平均加中值滤波的组合来平滑数据。具体做法是:先取最近 N 个采样值,去掉最大值和最小值,然后对剩下的值求平均。这样既能抑制随机噪声,又能剔除突发的尖峰干扰。
N 的选择要根据采样率和响应速度来定。10SPS 采样率下,N=8 意味着 0.8 秒的响应延迟,对于静态称重是可以接受的。如果你需要更快的响应,可以减小 N,但噪声会相应增大。
5.2 动态阈值与稳定判定
电子秤的一个基本功能是判断读数是否稳定。我的做法是:连续比较最近几次滤波后的值,如果变化量小于某个阈值(比如 0.5 个最小分度值),就认为读数稳定,锁定显示。这个阈值不能设得太小,否则永远等不到稳定;也不能太大,否则读数还没稳定就锁定了。
实际调试时,我会先把阈值设大一点,观察稳定判定的效果,然后逐步收紧。对于 0.1g 分辨率的秤,阈值设在 0.2g 到 0.3g 之间比较合适。
5.3 开机零点跟踪与自动去皮
开机零点跟踪是电子秤的另一个实用功能。每次开机时,如果空载读数在零点附近的一个小范围内,就自动把当前值设为零点。这个范围不能太大,否则会把小重量误认为零点;也不能太小,否则传感器稍微漂移就无法归零。
自动去皮则是用户放上容器后按一下去皮键,把当前重量设为零点。这个功能实现简单,但要注意去皮后如果容器重量超过量程,要有提示。
6. 从样机到产品的工程化细节
6.1 结构设计对精度的影响
很多人忽略了结构设计对电子秤精度的影响。传感器的安装方式、秤盘的刚度、底座的平整度,都会影响测量结果。我见过一个案例,秤盘用了一块很薄的铝板,放上砝码后秤盘本身变形,导致传感器受力不均匀,读数重复性很差。
我的经验是:秤盘要有足够的刚度,最好用 2mm 以上的铝板或者不锈钢板。传感器的一端固定在底座上,另一端悬空,秤盘通过一个传力柱压在悬空端上。传力柱的位置要正对传感器的受力中心,偏移会导致附加力矩,影响线性度。
6.2 长期稳定性测试与老化处理
样机做出来后,不要急着批量生产,先做至少 72 小时的老化测试。老化测试的内容包括:空载零点漂移、满载蠕变、反复加载卸载的重复性。我一般会用一个简单的数据记录脚本,每隔 10 分钟记录一次读数和温度,然后画成曲线看趋势。
如果发现零点在老化过程中持续漂移,可能是传感器或者电路板存在应力释放。这时候可以把传感器和电路板在常温下放置 24 小时后再校准,或者做一次温度循环(比如 0°C 到 40°C 各保持 2 小时)来加速应力释放。
6.3 量产校准的效率优化
小批量生产时,手动校准还能应付。但到了批量生产,每个秤都做多点校准就太慢了。我的做法是:在产线上只做两点校准(零点和满量程),然后抽检 5% 做多点校准,用抽检数据来修正整体的拟合参数。这样既能保证精度,又能提高效率。
另外,校准工装也很重要。我设计过一个简单的校准工装,用气缸推动标准砝码上下料,配合自动校准脚本,一个秤的校准时间可以压缩到 10 秒以内。
7. 常见故障排查与调试经验
7.1 读数跳变严重时的排查链路
读数跳变是最常见的问题,排查时我一般按以下顺序进行:
- 检查电源纹波,用示波器看 AVDD 和 DVDD 上的噪声。
- 检查传感器激励电压是否稳定,如果激励源在跳,读数必然跳。
- 检查差分输入走线是否受到干扰,可以尝试在输入端加 RC 滤波。
- 检查 NAU7802 的配置,确认采样率和 PGA 增益是否合适。
- 检查 MCU 端的 I2C 时序,确认读写是否稳定。
有一次我遇到读数每隔几秒跳一次的问题,排查了很久才发现是 MCU 的看门狗定时器中断影响了 I2C 时序。后来把 I2C 读写放在临界区里,问题就解决了。
7.2 零点漂移的根因分析
零点漂移可能来自传感器、电路或者环境。我的排查方法是:先断开传感器,用短接线短接 NAU7802 的输入端,观察读数是否漂移。如果漂移,说明是电路问题;如果不漂移,说明是传感器或者机械结构问题。
电路问题通常是基准电压漂移或者 PGA 失调漂移。NAU7802 的内部基准温漂典型值是 10ppm/°C,在 0°C 到 40°C 范围内可能漂移 400ppm,对于 24 位 ADC 来说这个漂移是可见的。如果要求更高,可以考虑用外部低温漂基准。
7.3 I2C 通信失败的几种可能
I2C 通信失败通常有几种表现:读不到数据、读到的数据全是 0xFF 或者 0x00、数据偶尔错位。我的排查经验是:
- 先用示波器看 SCL 和 SDA 的波形,确认时序是否正确。
- 检查上拉电阻是否合适,NAU7802 的 I2C 速率支持 400kHz,上拉电阻一般用 4.7kΩ。
- 检查地址是否正确,NAU7802 的 7 位地址是 0x2A,写地址是 0x54,读地址是 0x55。
- 如果总线上有其他设备,确认地址没有冲突。
我遇到过一种情况:I2C 总线上挂了一个 OLED 屏幕,屏幕刷新的时候会拉低 SDA,导致 NAU7802 通信失败。后来把两个设备分到不同的 I2C 总线上就好了。
7.4 温度变化导致读数漂移的应对
温度变化导致的漂移,前面提到了补偿方案。但如果你不想做复杂的温度补偿,至少可以做到以下几点来减小温漂影响:
- 选择低温漂的传感器和基准源。
- 在结构设计上让传感器远离发热元件。
- 在软件上做简单的零点跟踪,比如每隔一段时间检测空载状态并自动归零。
这些措施不能完全消除温漂,但可以把漂移控制在可接受的范围内。
8. 精度验证与性能评估方法
8.1 用标准砝码做重复性测试
重复性测试是评估电子秤性能的基本方法。具体做法是:用同一个标准砝码,反复加载和卸载 10 次,记录每次加载后的读数,计算最大值和最小值的差。这个差值就是重复性误差。
对于 0.1g 分辨率的秤,重复性误差应该控制在 0.2g 以内。如果超过这个值,说明系统噪声或者机械结构有问题。
8.2 线性度测试与误差曲线绘制
线性度测试需要多个标准砝码,从空载到满量程均匀取点。每个点稳定后记录读数,然后计算每个点的误差(读数减去砝码重量),画成误差曲线。理想情况下误差曲线应该是一条接近零的水平线,实际会有一定的弯曲。
如果误差曲线的弯曲程度超过规格要求,可以考虑用多点校准来修正。如果修正后仍然不达标,可能是传感器本身非线性度太大,需要更换传感器。
8.3 长期稳定性观察的实操建议
长期稳定性观察需要时间和耐心。我的做法是:把秤放在一个温度相对稳定的环境中,每隔 1 小时记录一次空载读数和满载读数,持续 24 小时以上。然后分析读数的变化趋势,看是否存在单调漂移或者周期性波动。
如果发现周期性波动,可能是环境温度变化或者电源波动引起的。如果发现单调漂移,可能是传感器或者电路存在老化效应。这些信息对于改进设计非常有价值。
9. 关键参数速查与选型参考
9.1 NAU7802 核心参数一览
| 参数 | 典型值 | 备注 |
|---|---|---|
| 分辨率 | 24 位 | 有效位数取决于增益和采样率 |
| PGA 增益 | 1-128 | 步进为 2 的幂次 |
| 采样率 | 10-320SPS | 低采样率噪声更小 |
| 电源电压 | 2.7-5.5V | AVDD 和 DVDD 可独立供电 |
| 内部 LDO | 4.5V | 可给桥路激励 |
| I2C 速率 | 最高 400kHz | 标准 I2C 接口 |
| 基准温漂 | 10ppm/°C | 内部基准 |
这张表可以作为选型和调试时的快速参考。需要注意的是,有效位数和采样率、增益都有关系,不是固定值。
9.2 传感器与 ADC 的匹配建议
选传感器的时候,我一般会遵循以下原则:
- 传感器输出灵敏度越高越好,这样可以降低对 PGA 增益的要求。
- 传感器桥路阻抗要和激励源的驱动能力匹配,350Ω 桥路需要更大的激励电流。
- 传感器的非线性度和温漂要尽可能小,这两项直接决定最终精度。
- 传感器的量程要留 20% 的余量,避免过载损坏。
9.3 常用外围元件选型清单
| 元件 | 推荐型号/参数 | 用途 |
|---|---|---|
| 去耦电容 | 0.1uF X7R | 电源去耦 |
| 基准旁路电容 | 1uF X7R | VBG 引脚 |
| I2C 上拉电阻 | 4.7kΩ | SCL/SDA |
| 激励滤波电容 | 10uF | 桥路激励 |
| 输入滤波电阻 | 100Ω | 差分输入 |
| 输入滤波电容 | 0.1uF | 差分输入 |
这些元件看起来不起眼,但选型和布局不当会直接影响性能。比如输入滤波电容要用低漏电流的型号,否则会影响测量精度。
10. 从调试台到实际场景的落地思考
10.1 不同应用场景的精度需求差异
电子秤的应用场景很多,精度需求差异很大。厨房秤一般要求 1g 分辨率,量程 3kg 到 5kg;咖啡秤要求 0.1g 分辨率,量程 2kg 左右;实验室天平要求 0.001g 分辨率,量程几百克。不同场景对 ADC、传感器和结构的要求完全不同。
NAU7802 适合的是中高精度场景,也就是 0.1g 到 1g 分辨率的电子秤。如果你要做 0.001g 分辨率的分析天平,NAU7802 可能就不够用了,需要考虑更高端的 ADC 方案。
10.2 成本与性能的平衡策略
做产品不能只看性能,还要看成本。NAU7802 的价格在同类芯片中属于中等偏上,但它的集成度高,外围元件少,整体方案成本其实有优势。如果为了省几毛钱用分立方案,调试成本和不良率可能会吃掉省下来的钱。
我的建议是:小批量或者对精度要求高的场景,直接用 NAU7802 这样的集成方案;大批量且精度要求不高的场景,可以考虑更便宜的 16 位或者 18 位方案。
10.3 后续升级与扩展方向
NAU7802 的方案做完之后,如果想进一步提升精度,可以考虑几个方向:一是换用更低噪声的外部基准源;二是增加温度补偿通道;三是优化机械结构,减少应力干扰。如果想增加功能,可以加蓝牙或者 WiFi 模块,把数据传到手机或者云端。
但不管怎么升级,核心思路都是一样的:先把模拟前端做干净,再把校准做准确,最后才是软件功能的堆叠。顺序反了,后面会越做越乱。
我在实际项目中最深的体会是,电子秤这个东西,硬件是基础,校准是灵魂,软件滤波是保障。三者缺一不可,而且必须按顺序做好。很多人一上来就研究滤波算法,结果硬件噪声太大,怎么滤都滤不干净。先把电源和布局做扎实,再认真做校准,最后用简单的滤波就能得到很稳定的读数。这个顺序,我踩过很多次坑才真正理解。