You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32 ADC采样峰值降噪:基于5次采样平均值取最大值的代码求助

基于平均值滤波的STM32 ADC峰值检测实现

实现逻辑

  • 优先对ADC原始采样值做累加运算,满5次后计算单组平均值,再转换为电压值,减少浮点运算量,提升运行效率
  • 每生成一组平均值就和当前存储的最大平均值做比较,更新最大峰值
  • 单组采样计数和累加和每满5次自动重置,循环采集

完整实现代码

变量定义(可放在回调函数外,或设为函数内静态变量)

/* 可根据噪声情况调整单组采样数,这里按需求设置为5次一组 */
static uint16_t adc_sample_cnt = 0;      // 单组内采样计数
static uint32_t adc_raw_sum = 0;         // 单组原始采样值累加和
float Vmax_avg = 0;                      // 最终输出的最大平均峰值电压

修改后的ADC转换完成回调函数

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    uint16_t ADC_raw = HAL_ADC_GetValue(hadc);
    adc_raw_sum += ADC_raw;
    adc_sample_cnt++;

    // 单组采满5次,计算平均值并更新最大峰值
    if(adc_sample_cnt == 5)
    {
        // 计算当前组的平均原始值,再转换为电压
        uint16_t adc_raw_avg = adc_raw_sum / 5;
        float current_avg_v = 3.3f * (float)adc_raw_avg / 4095.0f;

        // 更新最大平均峰值
        if(current_avg_v > Vmax_avg)
        {
            Vmax_avg = current_avg_v;
        }

        // 重置计数和累加值,准备下一组采样
        adc_sample_cnt = 0;
        adc_raw_sum = 0;
    }

    // 若使用单次采样中断模式,可在此处添加下一次采样启动语句,例如:HAL_ADC_Start_IT(&hadc1); 按实际使用的ADC句柄修改
}

注意事项:

  1. 若需要每次检测周期开始时重置峰值,可在对应逻辑位置添加Vmax_avg = 0;即可
  2. 如果噪声仍不符合要求,可以直接修改计数阈值,把每组采样数调整为8、10等更大的数值,滤波效果会更强
  3. 若需要保留原代码的实时最大峰值逻辑,可以同时保留原Vmax变量的更新逻辑

内容的提问来源于stack exchange,提问作者Umt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:45:05