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句柄修改 }
注意事项:
- 若需要每次检测周期开始时重置峰值,可在对应逻辑位置添加
Vmax_avg = 0;即可- 如果噪声仍不符合要求,可以直接修改计数阈值,把每组采样数调整为8、10等更大的数值,滤波效果会更强
- 若需要保留原代码的实时最大峰值逻辑,可以同时保留原
Vmax变量的更新逻辑
内容的提问来源于stack exchange,提问作者Umt
相关产品推荐
相关产品推荐

