打印
[MM32硬件]

实现稳定、准确的ADC采样

[复制链接]
62|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
鱿鱼丝|  楼主 | 2025-4-30 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 设置足够的采样保持时间(Sample Hold Time)
灵动MCU的 ADC 通道通常支持配置采样周期(例如 ADC_SampleTime_239Cycles5)。采样保持时间太短,会导致信号未稳定就完成采样,从而引发毛刺或跳变。

建议:
对高阻抗信号源(如分压电阻、传感器)使用较长采样时间(如 71.5 或 239.5 cycles)

对低阻抗源可使用短一些采样时间

示例配置(MM32):
c
复制
编辑
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
2. 添加软件滤波算法(如中值/平均滤波)
即使硬件干净,ADC 本身也存在±1 LSB 的抖动。可用以下方式平滑采样值:

中值滤波(抗尖刺能力强):
c
复制
编辑
// 三点中值滤波
uint16_t mid(uint16_t a, uint16_t b, uint16_t c) {
    return a > b ? (b > c ? b : (a > c ? c : a)) : (a > c ? a : (b > c ? c : b));
}
均值滤波(适合轻微抖动):
c
复制
编辑
uint32_t sum = 0;
for (int i = 0; i < 16; i++) {
    sum += ADC_Read();  // 多次采样
}
uint16_t filtered = sum / 16;
3. 保证模拟电源和参考电压稳定
ADC精度高度依赖 V<sub>REF</sub> 参考电压 和 AVDD模拟电源 的稳定性。若电源带有纹波(如使用开关电源或长走线),可能造成 ADC 结果出现周期性毛刺或突变。

建议:
AVDD 使用独立 LDO、加滤波电容(如 10uF + 100nF)

VREF 若外部提供,必须加旁路电容(如 1μF)

若支持使用内部参考电压(如 MM32L系列),优先使用

4. 配置ADC连续采样 + DMA + 滑动平均
通过 DMA 实现 ADC 连续采样,再结合滑动窗口平均可有效抑制跳变:

c
复制
编辑
#define WINDOW_SIZE 16
uint16_t adc_window[WINDOW_SIZE];
uint16_t window_index = 0;

void update_adc_window(uint16_t new_val) {
    adc_window[window_index++] = new_val;
    if (window_index >= WINDOW_SIZE) window_index = 0;
}

uint16_t get_average() {
    uint32_t sum = 0;
    for (int i = 0; i < WINDOW_SIZE; i++) sum += adc_window[i];
    return sum / WINDOW_SIZE;
}
5. 防止外部干扰和引脚耦合
硬件注意:
ADC通道引脚应避免靠近高频/高电流走线(如PWM、MOS管)

加入简单 RC 滤波(如 10kΩ + 100nF)可稳压信号

地线布线尽量短,避免“地弹”干扰参考电压

6. 避免CPU中断干扰采样(特别是手动触发方式)
若使用软件触发 ADC 或单次采样,建议关闭其他高优先级中断(如串口、定时器)

或使用 硬件触发 + DMA 方式,避开中断不确定性


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

480

帖子

2

粉丝