4. 信号采集与预处理:霍尔传感器信号调理电路设计、ADC采样策略、抗混叠滤波与去噪
信号采集这步,说白了就是给霍尔信号“梳妆打扮”。传感器出来的原始信号,又脏又乱,直接送给ADC采样,结果肯定一塌糊涂。我早年吃过这个亏——信号调理没做好,后面算法写得再漂亮,伺服电机照样抖得像筛糠。
这一章,咱们把信号调理、ADC采样、抗混叠滤波、去噪这几个环节拆开揉碎。你跟着我的思路走一遍,以后遇到霍尔信号处理,心里就有底了。
4.1 霍尔传感器信号调理电路设计
霍尔元件输出的信号,通常是毫伏级的差分信号,还带着共模噪声。直接采样?不行。得先过三关:差分转单端、电平抬升、限幅保护。
4.1.1 差分转单端与电平抬升
我习惯用仪表放大器来做第一级。比如AD620或者INA128,增益设个10倍到50倍,把毫伏信号放大到ADC的输入范围。为什么用仪表放大器?因为它共模抑制比高,能把电源噪声、地弹干扰压下去。
放大之后,信号可能是双极性的(比如-2V到+2V)。但大多数ADC只能采0-3.3V或0-5V的单极性信号。怎么办?加一个电平抬升电路。用运放搭个加法器,把信号整体往上平移2V,变成0-4V。嗯,这里要注意:抬升电压的参考源必须干净,我一般用精密基准源,比如REF3033,而不是直接从电源分压。
4.1.2 限幅保护与驱动
ADC的输入引脚很娇贵,超过供电电压就可能烧掉。所以信号进ADC之前,必须加限幅保护。最简单的做法:两个肖特基二极管(比如BAT54S)反向并联到地和VCC。再串一个1kΩ电阻限流。
最后一级是驱动。运放输出要能快速驱动ADC的采样电容。我推荐用高速轨到轨运放,比如OPA2356,压摆率够高,建立时间短。
信号调理电路设计要点
- 第一级:仪表放大器,增益10-50倍,滤除共模噪声
- 第二级:电平抬升,将双极性信号平移至ADC单极性范围
- 第三级:限幅保护,肖特基二极管+串联电阻
- 第四级:高速运放驱动,确保ADC采样电容快速建立
4.2 ADC采样策略
ADC采样不是越快越好,也不是越慢越好。你得算一笔账。
4.2.1 采样率的选择
霍尔信号里,我们关心的最高频率成分是电机换向频率的几倍。比如电机最高转速6000rpm,极对数是4,那换向频率就是400Hz。为了捕捉换向时刻的细节,采样率至少要设到换向频率的10倍以上,也就是4kHz以上。
但我个人习惯留更多余量。一般设到换向频率的20-30倍。为什么?因为后面还要做数字滤波,采样率高一点,滤波后的相位延迟就小一点。伺服跟随最怕延迟。
| 电机转速 (rpm) | 极对数 | 换向频率 (Hz) | 建议采样率 (Hz) |
|---|---|---|---|
| 3000 | 4 | 200 | 4000 - 6000 |
| 6000 | 4 | 400 | 8000 - 12000 |
| 10000 | 2 | 333 | 6660 - 10000 |
4.2.2 采样触发时机
霍尔信号是位置信号,采样时机很关键。我建议用PWM同步触发。在PWM周期的中间点触发ADC采样,这样能避开功率管开关带来的噪声尖峰。你想想看,功率管在PWM边沿开关时,电流突变会产生很大的di/dt噪声,会耦合到霍尔信号线上。在中间点采样,噪声最小。
实战技巧: 如果MCU支持,可以配置ADC为连续扫描模式,配合DMA自动搬运数据。这样CPU不用频繁进中断,省出来的算力可以跑更复杂的滤波算法。我在一个高速伺服项目里就是这么干的,采样率跑到20kHz,CPU负载才不到5%。
4.3 抗混叠滤波
抗混叠滤波,很多人不重视。其实这是信号链里最容易被忽略但后果最严重的一环。
4.3.1 为什么要抗混叠
根据奈奎斯特采样定理,采样率必须大于信号最高频率的两倍。但现实中的信号不是理想正弦波,它包含很多高频谐波。如果这些谐波频率超过采样率的一半,就会折叠回低频段,混在有用信号里,怎么滤都滤不掉。
我曾经在一个项目里遇到过:电机低速运行时,速度反馈信号里莫名其妙出现一个低频振荡。查了两天,最后发现是PWM开关频率的谐波混叠进了采样信号。加上一个简单的二阶低通滤波器,问题立刻消失。
4.3.2 硬件抗混叠滤波器设计
硬件抗混叠滤波器放在ADC之前,用运放搭一个二阶有源低通滤波器。截止频率一般设为采样率的1/4到1/3。比如采样率10kHz,截止频率就设在2.5kHz到3.3kHz。
我常用的拓扑是Sallen-Key结构。元件少,性能稳定。下面是一个典型设计:
// 二阶Sallen-Key低通滤波器参数
// 截止频率: 3kHz, 品质因数: 0.707 (巴特沃斯响应)
// 元件值:
R1 = R2 = 10kΩ
C1 = 4.7nF
C2 = 2.2nF
// 运放: OPA2356 (轨到轨, 高速)
// 实际截止频率:
fc = 1 / (2 * π * sqrt(R1 * R2 * C1 * C2))
= 1 / (2 * π * sqrt(10k * 10k * 4.7n * 2.2n))
≈ 3.1kHz
注意: 电容要用C0G或NP0材质的,温度稳定性好。X7R的电容容值会随电压和温度变化,导致滤波器截止频率漂移。我在一个工业现场项目里吃过这个亏,夏天和冬天的滤波效果完全不一样。
4.4 数字去噪:均值滤波与中值滤波
硬件滤波之后,信号已经干净了不少。但伺服系统对噪声要求极高,还得加一道数字滤波。常用的有两种:均值滤波和中值滤波。它们各有各的脾气。
4.4.1 均值滤波
均值滤波,就是把最近N个采样值加起来除以N。简单,算得快,对高斯白噪声抑制效果好。但缺点也很明显:它对脉冲噪声(比如一个突然的尖峰)很敏感,一个坏点就能把平均值拉偏。
我一般把均值滤波用在电机匀速运行的场景。比如速度环的反馈信号,用4点或8点均值滤波,既能平滑噪声,延迟又不大。
// 均值滤波实现 (C语言)
#define FILTER_LEN 8
static uint16_t buffer[FILTER_LEN] = {0};
static uint8_t index = 0;
static uint32_t sum = 0;
uint16_t mean_filter(uint16_t new_sample) {
sum -= buffer[index];
buffer[index] = new_sample;
sum += new_sample;
index = (index + 1) % FILTER_LEN;
return (uint16_t)(sum / FILTER_LEN);
}
4.4.2 中值滤波
中值滤波,是把N个采样值排序,取中间那个。它对脉冲噪声有奇效。一个尖峰进来,排序后要么在头要么在尾,根本影响不到中间值。
但中值滤波的缺点也明显:计算量大,排序耗时。而且它对高斯白噪声的抑制效果不如均值滤波。
我个人的经验是:在换向时刻附近用中值滤波。因为换向时霍尔信号最容易出现毛刺(开关噪声耦合过来的),中值滤波能干净利落地把这些毛刺剔除。而在匀速运行段,用均值滤波平滑噪声。
// 中值滤波实现 (C语言, 5点中值)
#define MEDIAN_LEN 5
static uint16_t window[MEDIAN_LEN] = {0};
static uint8_t pos = 0;
uint16_t median_filter(uint16_t new_sample) {
uint16_t temp[MEDIAN_LEN];
uint8_t i, j;
window[pos] = new_sample;
pos = (pos + 1) % MEDIAN_LEN;
// 复制到临时数组并排序 (冒泡排序, 仅用于演示)
for(i = 0; i < MEDIAN_LEN; i++) temp[i] = window[i];
for(i = 0; i < MEDIAN_LEN - 1; i++) {
for(j = 0; j < MEDIAN_LEN - 1 - i; j++) {
if(temp[j] > temp[j+1]) {
uint16_t t = temp[j];
temp[j] = temp[j+1];
temp[j+1] = t;
}
}
}
return temp[MEDIAN_LEN / 2];
}
4.4.3 两种滤波的对比与选择
| 特性 | 均值滤波 | 中值滤波 |
|---|---|---|
| 高斯白噪声抑制 | 优秀 | 一般 |
| 脉冲噪声抑制 | 差 | 优秀 |
| 计算量 | 低 (O(1)) | 高 (O(n²) 或 O(n log n)) |
| 相位延迟 | N/2 个采样周期 | N/2 个采样周期 |
| 适用场景 | 匀速运行、速度环反馈 | 换向时刻、位置跳变检测 |
我的推荐策略: 先用3点中值滤波剔除明显的脉冲噪声,再用4点均值滤波平滑残余的高斯噪声。两级滤波加起来延迟只有3.5个采样周期,效果却比单用任何一种好得多。这个组合我在三个伺服项目里验证过,屡试不爽。
4.5 本章知识体系
下面这张图,把信号采集与预处理的整个流程串起来了。从霍尔传感器出来,到最终送给控制算法的干净信号,每一步都不能少。
你看,从霍尔传感器到最终的控制算法,中间要经过信号调理、抗混叠滤波、ADC采样、数字去噪四个环节。每个环节都有坑,但只要你按照我上面说的来,基本不会出大问题。