在 ADC 中断里加 “滑动平均滤波”:对连续 16 次采样值取平均,再传入 Clark 变换,代码片段如下:
#define ADC_SAMPLE_NUM 16
uint16_t adc_buf[ADC_SAMPLE_NUM] = {0};
uint8_t adc_cnt = 0;
void ADC_IRQHandler(void) {
adc_buf[adc_cnt++] = ADC_GetValue(ADC_CH0);
if (adc_cnt >= ADC_SAMPLE_NUM) {
// 计算平均值
uint32_t adc_avg = 0;
for (uint8_t i=0; i<ADC_SAMPLE_NUM; i++) {
adc_avg += adc_buf[i];
}
adc_avg /= ADC_SAMPLE_NUM;
g_i_sample = Adc2Current(adc_avg); // 转换为电流值
adc_cnt = 0;
}
}
启用小华 MCU 的 “ADC oversampling” 功能(通过ADC_EnableOversampling函数),采样率提升 4 倍,有效降低量化噪声。
电源噪声抑制:
给 ADC 供电引脚(Vref)加 10uF 钽电容 + 0.1uF 陶瓷电容的组合滤波,远离开关电源输出端;
若用开关电源给系统供电,在电源输入端加共模电感(如 ACM2012-900),减少电网噪声耦合到采样电路。
我之前用 HC32F460 做吸尘器电机时,就是通过这套组合方案,把电流噪声从 200mA 峰峰值降到 30mA 以内,电机抖动完全消失,你可以按顺序逐步优化。
|
|