4、套色偏差信号处理:信号滤波与放大、模数转换、偏差信号的特征提取
各位同行,咱们接着聊。上一章我们把传感器怎么抓取偏差信号讲清楚了,但说实话,传感器出来的原始信号,根本没法直接用。为什么?因为太脏了。
我刚开始干这行的时候,就吃过这个亏。当时调试一台八色机,套色偏差老是跳来跳去,我以为是机械问题,折腾了两天。后来老师傅过来看了一眼,说:「你小子先看看信号波形。」我一测,好家伙,噪声比信号还大。嗯,从那以后我就记住了——信号处理这步,省不了。
4.1 信号滤波:把脏东西洗掉
传感器采集到的电信号,里面混杂着各种干扰。比如电机转动带来的电磁干扰、车间里变频器的谐波、甚至日光灯的频闪都能耦合进来。你想想看,这些乱七八糟的东西叠在偏差信号上,控制器根本分不清哪个是真偏差。
我个人习惯,第一道防线用低通滤波器。套色偏差的变化频率其实不高,一般几十赫兹以内。那些高频噪声,直接切掉。
核心思路:保留低频偏差信号,滤除高频噪声。
模拟滤波器我常用二阶巴特沃斯,电路简单,衰减特性也够用。给你看个典型电路参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 截止频率 | 50 Hz | 高于套色偏差变化频率 |
| 增益 | 1 (0 dB) | 通带内不放大 |
| 阻带衰减 | -40 dB/dec | 二阶特性 |
当然,现在很多设备直接用数字滤波了。我在项目里常用移动平均滤波,代码简单,效果也还行:
// 移动平均滤波,窗口长度 N=8
#define FILTER_N 8
int filter_buf[FILTER_N];
int filter_index = 0;
long filter_sum = 0;
int moving_average(int new_sample) {
filter_sum -= filter_buf[filter_index];
filter_buf[filter_index] = new_sample;
filter_sum += new_sample;
filter_index = (filter_index + 1) % FILTER_N;
return filter_sum / FILTER_N;
}
小技巧:窗口长度N选2的幂次,比如8、16、32。这样除法可以用移位操作,MCU跑起来快很多。
4.2 信号放大:把微弱信号提上来
滤波之后,信号干净了,但幅度可能还不够。光电传感器出来的信号,往往只有几毫伏到几十毫伏。ADC(模数转换器)的输入范围通常是0~5V或者0~3.3V,你想想看,几毫伏的信号进去,量化误差就能把它吃掉。
所以必须放大。我建议用仪表放大器,比如AD620、INA128这类。共模抑制比高,适合传感器这种差分信号。
放大倍数怎么定?举个例子:传感器输出最大偏差对应10 mV,ADC满量程5V,那放大倍数就是5V / 10 mV = 500倍。但实际要留余量,我一般取400倍左右,防止信号偶尔超限。
注意:放大倍数不是越大越好。放大倍数太大,噪声也被放大了。而且运放本身有失调电压,放大倍数高了,失调也会被放大,导致零点漂移。我曾经遇到过一台设备,开机半小时后偏差值慢慢飘了0.1mm,查了半天就是运放温漂的问题。
4.3 模数转换:把模拟量变成数字量
信号调理好了,接下来要进ADC。这一步决定了整个系统的精度上限。
选ADC主要看三个指标:
- 分辨率:常用12位或16位。12位对应4096个码值,16位对应65536个。对于套色偏差,12位基本够用,但要求高的时候我会上16位。
- 采样率:套色偏差变化不快,几百赫兹的采样率就足够了。但要注意,采样率太低会丢失细节,太高又浪费资源。
- 参考电压:一定要稳定。我见过有人直接用板子上的5V供电做参考,结果电源纹波大,ADC读数跳个不停。
采样时机也很关键。我建议在色标信号到达的时刻触发采样。这样可以保证每次采到的都是色标位置的偏差值,而不是随机时刻的值。很多MCU的ADC支持外部触发,正好用色标传感器的脉冲信号来触发。
// 伪代码:外部触发采样
void ADC_IRQHandler(void) {
uint16_t adc_value = ADC_GetValue();
// 此时 adc_value 就是当前色标位置的偏差值
process_deviation(adc_value);
}
4.4 偏差信号的特征提取:从数据到信息
ADC出来的是原始数字量,还不是我们想要的偏差值。需要做特征提取。
这一步说白了,就是把数字量换算成物理量,再提取出有用的特征。我一般做三件事:
- 标定转换:把ADC码值换算成毫米或微米。比如ADC读数是2048,对应0偏差;读数是1024,对应-0.1mm。这个线性关系需要在设备校准时确定。
- 去直流分量:有些传感器会有固定的偏置电压,需要减去。我通常在设备初始化时采集100次取平均,作为零点基准。
- 提取偏差值:对于套色偏差,我们关心的是当前色标与基准色标的位置差。这个差值就是套色偏差信号。
特征提取的核心公式:
偏差值 = (当前色标位置 - 基准色标位置) × 标定系数
这里有个坑,我踩过。有些设备的色标传感器安装位置有机械误差,导致即使套色对准了,传感器读出来的偏差也不为零。解决办法是在设备初始化时做一次零点校准,把这个固定偏差记录下来,后续实时减去。
好了,信号从传感器出来,经过滤波、放大、模数转换、特征提取,最终变成了控制器能用的偏差数值。这一步走扎实了,后面的PID调节才有意义。否则,你调得再好,也是基于错误的数据在瞎调。
经验之谈:信号处理链路上的每一个环节都会引入延迟。滤波器的延迟、ADC的转换时间、特征提取的计算时间,加起来可能有好几毫秒。对于高速印刷机,这几毫秒的延迟可能造成相位滞后。我一般会在控制器里做一个延迟补偿,把信号处理链路的群延迟测量出来,然后在控制算法里反向补偿。
最后说一句,信号处理这块,理论是一回事,实际调试是另一回事。同样的电路,在不同车间、不同设备上表现可能完全不同。我建议你拿到新设备后,先用示波器看看原始信号长什么样,再决定滤波参数和放大倍数。别偷懒,这一步省了,后面有你哭的。
公众号:蓝海资料掘金营,微信deep3321