# 基于 Arduino 的 AVR 单片机低功耗模式 ADC 采样噪声抑制实战技巧 在物联网、可穿戴设备等电池供电的嵌入式系统中,低功耗是核心需求,而 ADC 采样又是感知物理世界的必要环节。然而,当 AVR 单片机进入睡眠模式(如 SLEEP_MODE_ADC)后,ADC 采样结果往往出现明显抖动或偏移,这源于电源噪声、参考电压波动以及数字电路耦合。本文以 Arduino Uno(ATmega328P)为例,分享一套经过验证的噪声抑制方案。 ## 一、噪声来源分析 低功耗模式下 ADC 噪声主要来自三方面: - **电源纹波**:睡眠时稳压器或电池电压波动,尤其当系统其他外设(如无线模块)间歇性工作时,纹波可达数十毫伏。 - **参考电压不稳定**:内部 1.1V 参考源(bandgap)在低功耗下驱动能力下降,受温度影响明显。 - **数字信号耦合**:I/O 引脚翻转、SPI 通信等数字活动通过衬底或电源线耦合到模拟输入端。 ## 二、硬件设计要点 1. **电源去耦**:在 AVCC 引脚与 GND 之间放置 10µF 钽电容 + 0.1µF 陶瓷电容,且尽量靠近引脚。 2. **模拟地分离**:将模拟地(AGND)与数字地(GND)单点连接,避免数字电流流过模拟地平面。 3. **输入滤波**:在 ADC 输入引脚前串联 1kΩ 电阻并并联 0.1µF 电容,构成低通滤波器,截止频率约 1.6kHz,可有效抑制高频噪声。 ## 三、关键寄存器配置 AVR 的 ADCSRA 和 ADCSRB 寄存器控制 ADC 模式。低功耗采样时,我们采用“自动触发”模式,让 ADC 在睡眠中自动完成转换,然后唤醒 CPU。 ```c // 设置 ADC 时钟分频为 128(16MHz/128=125kHz,符合 ADC 要求) ADCSRA = (1< #include volatile uint16_t adc_result; void setup() { Serial.begin(9600); // 配置 ADC ADMUX = (1<