3、信号调理电路:滤波、放大、隔离、线性化处理

说实话,很多刚入行的工程师容易忽略一个事实:传感器出来的原始信号,基本没法直接用。你想想看,一个热电偶输出才几毫伏,一个4-20mA变送器在长距离传输后可能带了一堆共模干扰。这时候直接往PLC模拟量模块里送?那数据基本没法看。

我做了十几年现场,见过太多因为信号调理没做好导致的奇葩故障。有一次在化工厂,一个压力值跳得像心电图,查了三天,最后发现是信号线跟动力电缆走了同一个桥架,共模干扰直接干翻了整个采集链路。从那以后,我对信号调理电路这块格外上心。

信号调理,说白了就是四个字:滤波、放大、隔离、线性化。咱们一个一个说。

3.1 滤波:把噪声挡在门外

滤波的目的很简单——把有用的信号留下,把没用的噪声滤掉。但实际做起来,门道不少。

低通滤波是最常用的。工业现场50Hz工频干扰无处不在,你采集一个缓慢变化的温度信号,高频噪声基本全是干扰。我习惯在模拟量输入端先加一个一阶RC低通滤波器,截止频率设在10Hz左右。公式很简单:

fc = 1 / (2π × R × C)

举例:R=15kΩ,C=1μF
fc = 1 / (2 × 3.14 × 15000 × 0.000001) ≈ 10.6Hz

嗯,这里要注意:RC滤波会引入相位延迟。如果你做快速响应控制,这个延迟可能会坏事。我在一个伺服压力控制项目里就吃过这个亏——滤波太狠,响应慢了半拍,结果过冲直接超了。

我的经验:温度、液位这类慢变信号,截止频率可以设到1-5Hz。压力、流量这类中等速度信号,10-50Hz比较合适。振动、声音这类快信号,建议用有源滤波器或者干脆在PLC里做数字滤波。

3.2 放大:把小信号变成大信号

传感器输出信号太小,PLC模拟量模块的分辨率再高也白搭。比如一个应变片电桥,满量程输出才20mV,你直接接到0-10V输入的PLC模块上,那精度损失得让人心疼。

放大电路的核心是仪表放大器。我推荐AD620、INA128这类经典芯片,共模抑制比高,温漂小。一个典型电路是这样的:

增益公式:G = 1 + (49.4kΩ / Rg)

想要放大100倍:Rg = 49.4kΩ / (100 - 1) ≈ 499Ω

我在一个称重系统里用过AD620,把0-20mV的信号放大到0-10V,配合24位ADC,分辨率做到了十万分之一。但有个坑——电源纹波。仪表放大器对电源噪声非常敏感,我建议在电源引脚上加10μF电解电容并联0.1μF瓷片电容,能干掉大部分高频噪声。

避坑指南:我曾经在一个项目里直接用运放搭差分放大,结果共模抑制比根本不够,50Hz干扰比信号还大。后来换成专用仪表放大器,问题瞬间解决。记住:不要自己用普通运放搭仪表放大器,除非你真的很懂。

3.3 隔离:保护你的PLC

隔离这件事,很多人觉得可有可无。直到有一次,一个现场工程师把24V电源接到了传感器信号线上,整个模拟量模块直接冒烟。嗯,从那以后,我再也不敢省隔离的钱了。

常用的隔离方式有三种:

隔离方式 原理 适用场景 我推荐
光耦隔离 LED+光敏管 数字信号、低速模拟 HCNR201
磁耦隔离 变压器耦合 高速模拟信号 ISO124
电容隔离 电容耦合 高精度、低功耗 ISO7240

我个人习惯在4-20mA信号回路里用隔离变送器。这东西三端隔离——输入、输出、电源互相隔离,能扛住2500V的共模电压。价格虽然贵点,但想想一块PLC模拟量模块多少钱?值。

关键点:隔离不只是保护设备,更重要的是切断地环路。现场两个设备的地电位可能差好几伏,不隔离的话,这个电位差会直接叠加到信号上,造成测量误差。我见过最夸张的一次,两地电位差12V,信号直接饱和了。

3.4 线性化:让数据说真话

很多传感器的输出和被测物理量不是线性关系。最典型的就是热电偶——温度每升高一度,输出电压的变化量都不一样。如果你直接拿电压值去算温度,那误差能到几十度。

线性化处理有两种做法:

  • 硬件线性化:用模拟电路做非线性补偿。比如热电阻的桥式电路,通过合理选电阻值,可以在一定范围内近似线性。但说实话,现在很少人这么干了——电路复杂,调试麻烦,精度还一般。
  • 软件线性化:在PLC或上位机里用查表法或公式法。这是主流做法。比如热电偶,IEC标准给出了分度表,你直接存一个数组,采集到电压后查表插值就行。

我常用的软件线性化方法:

// 以K型热电偶为例,0-500℃范围
// 使用分段线性插值

float lookup_table[][2] = {
  {0, 0.000},    // 0℃ -> 0mV
  {100, 4.096},  // 100℃ -> 4.096mV
  {200, 8.138},  // 200℃ -> 8.138mV
  {300, 12.209}, // 300℃ -> 12.209mV
  {400, 16.397}, // 400℃ -> 16.397mV
  {500, 20.644}  // 500℃ -> 20.644mV
};

float linearize(float mv) {
  // 找到所在区间,线性插值
  for(int i=0; i<5; i++) {
    if(mv >= lookup_table[i][1] && mv < lookup_table[i+1][1]) {
      float ratio = (mv - lookup_table[i][1]) / 
                    (lookup_table[i+1][1] - lookup_table[i][1]);
      return lookup_table[i][0] + ratio * 
             (lookup_table[i+1][0] - lookup_table[i][0]);
    }
  }
  return -1; // 超出范围
}
我的建议:如果PLC支持,直接用功能块做线性化。西门子的FC105、罗克韦尔的SCP指令都是现成的。但要注意——这些指令内部用的是多项式拟合,精度取决于阶数。我一般用5阶多项式,误差能控制在0.1℃以内。

说到线性化,还有一个容易被忽略的点——冷端补偿。热电偶测量的是热端和冷端的温差,冷端温度一变,测量值就跟着跑。我习惯在接线端子附近装一个NTC或者DS18B20,实时测量冷端温度,然后在程序里做补偿。这个细节,很多新手会忘。

好了,信号调理这块就聊到这儿。总结一下我的经验:滤波要适度,放大要精准,隔离不能省,线性化要细致。这四个环节做好了,你的数据采集系统就成功了一大半。下一章咱们聊聊PLC模拟量模块的选型和配置,到时候再细说。