← 返回基础原理库

噪声与滤波:ADC 读数为什么老跳,怎么把它按住

最后更新 2026-07-01
⏱ 约 8 分钟 🟢 软件/低风险

你接了个模拟传感器,代码没问题,可 ADC 读数就是不老实——静止不动的信号,每次读都跳个几十,画出来一条毛毛虫。这不是你代码写错了,是噪声混进了信号里。噪声治不好,后面所有精密测量都是空中楼阁。这篇把噪声从哪来、硬件怎么挡、软件怎么滤,一次说透。

噪声从哪来:先找源头再谈治

噪声不是凭空冒出来的,常见就这四个源头,对号入座才好下药。

  • 电源纹波:你的 3.3V 供电本身就不干净。DC-DC 开关电源出来的电压带着几十 mV 的开关毛刺,传感器和 ADC 都靠它供电,供电抖,读数就跟着抖。
  • 地环路:多个模块共地时,地线本身有电阻,大电流器件(电机、继电器)一动,在地线上压出个电压差,你的模拟地"地平面"就不再是干净的 0V 了,参考基准都在晃。
  • EMI(电磁干扰):空间里的高频电磁场耦合进你的走线。WiFi、开关电源、电机、旁边的数字高频线,都是发射源,长的模拟走线就是天线,全给你收进来。
  • ADC 自身抖动:即便前面都干净,ADC 量化到最低那一两位(LSB)本身也在跳——这是量化噪声加内部噪声,属于"底噪",滤不掉但能平均掉。

一句话记牢:读数跳,先想它是哪一路进来的。电源纹波和地环路要在硬件上堵,EMI 要在布局上避,ADC 底噪才轮到软件去平。

硬件抗干扰:能在源头堵的,绝不留给软件

软件滤波是补救,硬件抗干扰是治本。四招,从性价比最高的排起。

去耦电容——最便宜最有效的一招。在传感器和 ADC 的电源脚紧贴着放一颗 0.1μF 陶瓷电容到地,它把高频纹波就近旁路掉,给芯片一个干净的局部电源。这几乎是白给的抗噪,每个模拟器件都该配。原理见 电容 里的去耦一节。

RC 低通滤波——在模拟信号进 ADC 脚之前,串一个电阻 R、并一个电容 C 到地,组成一阶低通。它让慢变的有用信号通过、把高频毛刺抹平。截止频率 f = 1 / (2πRC),比如 R=1kΩ、C=100nF,截止约 1.6kHz,测温度光照这种慢信号绰绰有余。这是硬件滤波里最实用的一招。

远离干扰源 + 走线讲究——模拟走线尽量短、尽量粗、尽量远离数字高频线和电源开关节点。长走线是天线,能短则短。

共地要干净——所有模块的地要真正连到一起形成统一基准,但大电流器件(电机、继电器)的地路径要和模拟地分开走、最后单点汇合,别让它们的回流电流从你的模拟地上淌过去。共地怎么接才不制造地环路,见 接地与共地

软件滤波:四种算法,各治各的病

硬件堵到位后,剩下的底噪和残余抖动交给软件。别一上来就套算法,先看你要治的是什么。

均值滤波(滑动平均)——连续读 N 次求平均。噪声有正有负,一平均就互相抵消了,对付随机白噪声(ADC 底噪、随机抖动)最对路。代价是响应变慢、内存要存 N 个数。

sum = 0; for(i=0;i<N;i++) sum += adc_read();
value = sum / N;   // N 取 8~64,越大越平滑但越迟钝

中值滤波——读 N 次,排序取中间那个。它专治偶发的尖峰脉冲——某次读数突然蹦出一个离谱的大值(继电器一吸合窜进来的),均值会被这个野值拖偏,中值直接把它扔在两头、取不到。对付脉冲干扰,中值比均值强。

一阶低通滤波——只保留上一次结果,新值按比例掺进去,不用存数组,单片机上最省资源:

y = α * x + (1 - α) * y_prev;   // α 越小越平滑越迟钝,常取 0.1~0.3

它其实就是 RC 低通的软件版,α 对应截止频率。适合连续信号平滑,一个变量搞定,特别适合内存紧张的场合。

限幅滤波——不是滤,是"防"。设一个单次允许的最大变化量,新值和上次差太多就判为干扰、直接丢弃或钳住。它防的是那种物理上不可能发生的突变(温度不可能一次跳 50 度),常和上面几种叠着用打头阵。

选型一张表记住:

噪声类型 首选 为什么
随机白噪声、ADC 底噪 均值 / 一阶低通 正负抵消,平滑
偶发尖峰脉冲 中值 野值被排到两头取不到
物理不可能的突变 限幅 直接拦下,不让它进
内存紧、要连续平滑 一阶低通 只存一个变量

实战:ADC 读数跳动的治理顺序

回到开头那条毛毛虫,按这个顺序上,一步步压下去:

  1. 先堵源头:ADC 和传感器电源脚各补一颗 0.1μF 去耦电容;确认模拟走线短、离开关电源和数字线远;共地单点汇合。
  2. 加 RC 低通:信号进 ADC 前串 1kΩ + 并 100nF 到地,先物理抹平一波高频毛刺。
  3. 软件多采平均:一次读 16~32 次取均值(或中值,若怀疑有脉冲干扰),底噪就被平掉了。
  4. 联网项目避坑:ESP32 系列 ADC2 在 WiFi 开启时读数异常,模拟传感器一律接 ADC1 引脚——这条见 ADC 采样原理

按这个顺序做完,原来跳几十的读数通常能压到只跳一两个 LSB,够绝大多数应用了。

🚧 避坑

别指望软件滤波救一切。滤波能压随机噪声,压不掉系统性的错——如果读数是因为地环路整体抬高、或参考电压漂移,那是偏差不是噪声,你平均一万次它还是偏的。读数不稳先查硬件(去耦、共地、走线),软件滤波是最后一道,不是第一道。还有:滤波越狠响应越慢,测快变信号时平均次数别贪多,否则跟不上真实变化。

信号要走很远?就近数字化

如果传感器离主控很远(几十厘米以上),模拟信号在长线上被干扰几乎是必然的,再滤也是事倍功半。这时更聪明的做法是别让模拟信号走长路:把 ADC 或数字接口传感器放到贴近信号源的地方,就地转成数字,再用抗干扰强的数字总线(近距 I2C、远距 RS485)把数值传回来。数字信号只认高低两态,长线上蹭点噪声也不影响判决,比让脆弱的模拟电压跑长途稳得多。一句话:模拟怕长线,能就近数字化就别硬拉模拟线。

一句话口诀

噪声四个源——电源纹波、地环路、EMI、ADC 底噪;硬件先堵——去耦电容 + RC 低通 + 远离干扰源 + 共地干净;软件再滤——随机噪声用均值/一阶低通、尖峰脉冲用中值、离谱突变用限幅。顺序永远是先硬件后软件,滤波治噪声不治偏差。

下一步

滤波的硬件搭档在这几篇:去耦电容怎么摆见 电容,共地与地环路见 接地与共地,读数从哪来、atten 和校准怎么设见 ADC 采样原理。回 元器件原理总览 补齐其余基础。

内容有错、看不懂、或想看下一期?告诉我们 →

本文为公开资料的学习整理,非亲测。涉接线/花钱/合规的步骤请结合实物与官方最新资料验证,风险自负。见免责声明