在嵌入式测量系统中,模数转换器(ADC)的分辨率往往成为制约测量精度的关键因素。传统解决方案是选用更高位数的ADC芯片,但这会显著增加硬件成本和系统复杂度。过采样与平均技术提供了一种纯数字域的精度提升方案,其核心思想是通过提高采样率来换取更高的有效分辨率。
任何ADC转换过程都会引入量化误差,这是由模拟信号的无限可分性与数字量的有限分辨率之间的矛盾决定的。当输入电压位于两个相邻量化电平之间时,ADC只能将其归入最接近的量化电平,这个舍入过程产生的误差称为量化误差。
量化噪声具有以下重要特性:
对于N位ADC,其理论信噪比(SNR)可由公式计算:
SNR(dB) = 6.02N + 1.76
这意味着每增加1位分辨率,SNR可提升约6dB。
过采样技术建立在信号处理的两个基本定理之上:
奈奎斯特采样定理:要无失真地重建信号,采样频率fs必须至少是信号最高频率fm的两倍,即fs ≥ 2fm
噪声整形原理:当采样频率提高时,量化噪声的总功率不变,但噪声能量会分布在更宽的频带内。通过数字低通滤波后,保留在信号带宽内的噪声功率将按比例降低
过采样率(OSR)定义为实际采样频率与奈奎斯特频率的比值:
OSR = fs / (2fm)
噪声功率降低与OSR的关系为:
Pn = P0 / OSR
其中P0为原始量化噪声功率,Pn为滤波后的噪声功率
完整的过采样系统包含三个关键模块:

(注:实际实现时应替换为具体框图)
要实现额外w位的分辨率,所需的过采样率为:
OSR = 4^w
常见分辨率提升对应的过采样率:
在资源受限的嵌入式系统中,可采用简化的"累加-转储"算法:
C语言实现示例:
c复制#define OSR 256 // 过采样率(4^4)
void ADC_ISR() {
static uint32_t accumulator = 0;
static uint16_t count = 0;
accumulator += ADC_READ();
count++;
if(count >= OSR) {
uint16_t result = accumulator >> 4; // 右移4位相当于除以16
ProcessResult(result); // 处理高分辨率结果
accumulator = 0;
count = 0;
}
}
采样频率的确定需要考虑以下因素:
计算公式:
fs_required = 2 × fm × 4^w
示例:对于带宽100Hz的信号,要实现16位分辨率(12→16位):
fs = 2 × 100 × 256 = 51.2kHz
累加过程需要考虑数据溢出问题。对于N位ADC和w位提升:
最小累加器位宽 = N + 2w
典型配置:
以文中温度传感器为例:
参数:
原始分辨率:
LSB = Vref/(2^N×Gain) = 2.4/(4096×2) ≈ 293μV
温度分辨率 = 293μV / 2.8mV ≈ 0.105°C
过采样后(16位):
有效LSB = 2.4/(65536×2) ≈ 18.3μV
温度分辨率 = 18.3μV / 2.8mV ≈ 0.0065°C
过采样技术对噪声特性有严格要求:
适用场景:
不适用场景:
通过直方图分析验证系统适用性:

(注:实际实现时应替换为具体直方图)
过采样技术的理论极限受以下因素制约:
实际应用中,12位ADC通常可实现14-16位有效分辨率。
问题1:分辨率提升不达预期
问题2:输出数据跳变过大
问题3:CPU负载过高
在实际项目中,我们采用过采样技术将STM32内置12位ADC的有效分辨率提升到15位以上,成功应用于高精度电子秤系统。关键是在PCB设计阶段就充分考虑模拟信号的完整性,同时通过软件校准消除了ADC的偏移误差。经过优化,系统在100Hz输出率下可实现0.01%FS的测量精度,完全满足商业衡器的精度要求。