4. 数据采集与信号处理:模拟信号与数字信号、采样定理、滤波基础
大家好,我是老李。今天咱们聊聊数据采集和信号处理。说实话,这章是力控系统里最容易被忽视,但也是最容易出坑的地方。很多新手觉得,传感器一接,数据不就来了吗?哪有那么简单。你想想看,现场环境那么复杂,电机一转、变频器一开,各种干扰全来了。搞不好你采集到的信号,跟实际值差了十万八千里。
4.1 模拟信号与数字信号:两个世界的语言
先说说最基础的概念。模拟信号,就是连续变化的信号。比如温度从20度升到30度,中间每一个值都有。数字信号呢,是离散的,只有0和1。PLC和计算机只能处理数字信号,但传感器输出的往往是模拟信号。所以,我们得做个翻译工作。
我个人习惯把模拟信号想象成水龙头的水流,可以任意调节大小。数字信号就像开关,要么开要么关。但现实世界是连续的,我们只能用离散的点去逼近它。这就引出了下一个问题——怎么采样才能不失真?
核心区别总结:
- 模拟信号:连续、无限取值、易受干扰
- 数字信号:离散、有限取值、抗干扰强
我在项目中遇到过一件事。有个现场,温度传感器接的是4-20mA模拟量,但PLC读出来的数值一直在跳。查了半天,发现是信号线跟动力电缆走了一个桥架,干扰串进来了。后来换了屏蔽线,单独走管,问题才解决。所以,模拟信号传输,布线真的很关键。
4.2 采样定理:别让你的数据“说谎”
采样定理,也叫奈奎斯特定理。说白了就是一句话:采样频率必须大于信号最高频率的两倍。否则,你会看到一种叫“混叠”的现象——高频信号被误认为低频信号。
为什么会这样?我画个图你就明白了。
你看,红色虚线是原始的高频信号。绿色点是采样点。因为采样频率太低,把这些点连起来(蓝色线),就变成了一个低频信号。这就是混叠。你采集到的数据,根本不是真实信号。
避坑指南:我曾经在一个振动监测项目里,采样频率设成了100Hz,但振动频率有80Hz。结果分析出来的频谱全是错的,差点把设备误判为故障。后来把采样频率提到200Hz以上,数据才正常。记住,采样频率至少是信号最高频率的2倍,实际工程中我建议取5-10倍,留足余量。
4.3 滤波基础:把噪声“滤”出去
信号采回来了,但里面混着噪声。怎么办?滤波。滤波的本质,就是让有用的频率通过,把没用的频率衰减掉。常用的有低通滤波和均值滤波。
4.3.1 低通滤波:让慢信号通过
低通滤波,顾名思义,低频信号能通过,高频信号被衰减。现场最常见的噪声,比如50Hz的工频干扰、电机的高频谐波,都是高频成分。用低通滤波一滤,干净多了。
最简单的低通滤波,就是一阶RC滤波。软件实现也很简单:
// 一阶低通滤波(C语言实现)
float lowPassFilter(float input, float lastOutput, float alpha) {
// alpha = T / (T + RC),T为采样周期,RC为时间常数
// alpha越小,滤波越强,响应越慢
return alpha * input + (1 - alpha) * lastOutput;
}
嗯,这里要注意。alpha值怎么选?我一般先估算信号的频率范围。比如温度信号变化很慢,alpha可以设小一点,比如0.1。如果是压力信号,变化稍快,alpha可以设0.3-0.5。你想想看,alpha越小,对历史值的依赖越大,滤波越平滑,但响应也越迟钝。
我的经验:调试低通滤波时,先设alpha=0.5,看波形。如果噪声还大,就减小alpha。如果响应太慢,就增大alpha。没有万能参数,得根据现场调。
4.3.2 均值滤波:简单粗暴但有效
均值滤波,就是把最近N次采样的值加起来,除以N。说白了,就是取平均。这种方法对随机噪声特别有效,比如传感器本身的噪声。
// 均值滤波(C语言实现)
#define FILTER_SIZE 10
float buffer[FILTER_SIZE] = {0};
int index = 0;
float meanFilter(float input) {
float sum = 0;
buffer[index] = input;
index = (index + 1) % FILTER_SIZE;
for (int i = 0; i < FILTER_SIZE; i++) {
sum += buffer[i];
}
return sum / FILTER_SIZE;
}
均值滤波有个缺点——它需要缓存数据,占用内存。而且N越大,响应越慢。我一般取N=5到20之间。N太小,滤波效果不明显;N太大,信号变化跟不上。
两种滤波对比:
| 特性 | 低通滤波 | 均值滤波 |
|---|---|---|
| 原理 | 加权递推 | 算术平均 |
| 内存占用 | 低(只需1个历史值) | 高(需N个历史值) |
| 响应速度 | 可调(alpha控制) | 固定(N控制) |
| 适用场景 | 缓慢变化的信号(温度、液位) | 随机噪声(传感器噪声) |
我个人习惯,对于温度、液位这种变化慢的信号,用低通滤波。对于压力、流量这种有随机波动的信号,用均值滤波。有时候也会两个一起用——先均值滤波去随机噪声,再低通滤波去高频干扰。
好了,这一章的内容就这些。记住,数据采集和信号处理是力控系统的“眼睛”和“耳朵”。眼睛花了,耳朵聋了,后面的控制做得再好也没用。下一章,咱们聊聊更高级的滤波方法,比如卡尔曼滤波。不过那是后话了,先把今天的基础打牢。