第2章 传感器信号采集与调理

各位同学,今天我们来聊聊传感器信号调理。说实话,这是整个发动机电子控制里最容易被忽视、却又最容易出问题的环节。我见过太多项目,算法写得漂漂亮亮,结果一上发动机,信号全是噪声——嗯,问题就出在调理电路上。

2.1 温度传感器:热电偶与热电阻

温度测量在发动机控制里太重要了。排气温度、进气温度、滑油温度,哪个测不准都不行。

2.1.1 热电偶原理与调理

热电偶的原理其实很简单:两种不同金属接触,温度不同就会产生热电势。但这里有个坑——你测到的电压是温差电压,不是绝对温度。

我个人习惯用K型热电偶,因为它线性度好,量程宽(-200℃到1300℃)。但它的输出只有微伏级,必须放大。

典型调理电路设计要点:

  • 冷端补偿:用热敏电阻或DS18B20测冷端温度,软件补偿
  • 放大倍数:K型热电偶约41μV/℃,建议放大200-500倍
  • 低通滤波:截止频率10Hz左右,滤掉工频干扰
// 冷端补偿计算示例(C语言伪代码)
float read_thermocouple() {
    float v_tc = read_adc_voltage();  // 读取热电偶电压
    float t_cj = read_cold_junction(); // 读取冷端温度
    float v_cj = 41e-6 * t_cj;        // 冷端等效电压
    float v_real = v_tc + v_cj;       // 真实热电势
    return v_real / 41e-6;            // 转换为温度
}

我曾经踩过的坑:有一次在台架试验时,热电偶读数一直偏大。查了两天才发现,是冷端补偿用的热敏电阻贴在了PCB上,PCB本身发热导致冷端温度测量不准。后来我把热敏电阻单独引出来,贴在接线端子上,问题就解决了。

2.1.2 热电阻(RTD)原理与调理

热电阻比热电偶稳定得多,但响应慢。我一般用PT100,0℃时100Ω,温度系数约0.385Ω/℃。

热电阻的调理核心是恒流源激励。为什么?因为电阻变化小,用恒压源的话,导线电阻影响太大。

我的建议:用三线制或四线制接法。两线制虽然省线,但导线电阻会引入0.5℃以上的误差——这在发动机控制里是不能接受的。

// 三线制PT100采样算法
float read_pt100() {
    float r_total = (v_meas / i_excite);  // 总电阻
    float r_lead = (v_lead / i_excite);   // 导线电阻
    float r_pt = r_total - 2 * r_lead;    // 真实PT100电阻
    return (r_pt - 100.0) / 0.385;        // 温度值
}

2.2 压力传感器

发动机上的压力传感器,我接触最多的是压阻式和电容式。压阻式便宜,但温漂大;电容式精度高,但调理电路复杂。

2.2.1 压阻式压力传感器

说白了就是个惠斯通电桥。压力变化时,桥臂电阻失衡,输出差分电压。这个电压很小,通常只有几十毫伏。

调理电路设计要点:

  • 仪表放大器:用AD620或INA128,共模抑制比要高
  • 激励电压:恒压源5V或10V,注意不要超过传感器额定值
  • 温漂补偿:软件查表或硬件热敏电阻补偿

我记得有一次做高空台试验,压力传感器读数飘得厉害。后来发现是激励电压不稳——电源纹波直接耦合到了传感器输出。加了个LC滤波后,问题就解决了。

2.2.2 电容式压力传感器

电容式传感器输出的是电容变化,需要转换成电压或频率。我常用的是电容-频率转换电路,用555定时器搭个多谐振荡器。

// 电容-频率转换计算
// f = 1.44 / ((R1 + 2*R2) * C)
// 压力变化 -> 电容变化 -> 频率变化 -> 单片机测频
float read_pressure_capacitive() {
    uint32_t freq = measure_frequency();  // 测频
    float cap = 1.44 / ((R1 + 2*R2) * freq);
    return pressure_lookup(cap);          // 查表转压力
}

2.3 振动传感器

发动机振动监测,我主要用压电式加速度计。它输出的是电荷信号,不是电压——这是个容易忽略的点。

2.3.1 电荷放大器设计

压电传感器内阻极高,必须用电荷放大器。说白了,就是把电荷转换成电压。

注意:电荷放大器的输入偏置电流要极小(pA级),否则电荷会慢慢泄漏,导致低频响应变差。我曾经用普通运放搭过,结果10Hz以下的振动根本测不到——全被偏置电流吃掉了。

// 电荷放大器输出计算
// Vout = -Q / Cf
// Q: 传感器输出电荷(pC)
// Cf: 反馈电容(pF)
// 例:Q=100pC, Cf=10pF -> Vout = -10V

2.3.2 抗混叠滤波

振动信号频率高,采样前必须做抗混叠滤波。我一般用二阶巴特沃斯低通滤波器,截止频率设为采样率的1/3左右。

我的经验:滤波器阶数不是越高越好。高阶滤波器相位延迟大,会影响振动信号的相位分析。对于发动机振动监测,二阶或四阶就够了。

2.4 转速传感器

转速测量,最常用的是磁电式和霍尔式。磁电式不需要供电,但低速信号弱;霍尔式需要供电,但可以测零速。

2.4.1 磁电式转速传感器

磁电式传感器输出的是正弦波,幅值随转速变化。低速时可能只有几十毫伏,高速时能达到几十伏。

调理电路设计:

  • 比较器整形:用LM339将正弦波转成方波
  • 滞回比较:加正反馈,防止噪声引起误触发
  • 限幅保护:高速时电压高,要加钳位二极管

你想想看,如果不用滞回比较,信号在过零点附近抖动一下,单片机就会多计一个脉冲——转速读数就偏了。我刚开始做的时候吃过这个亏。

2.4.2 霍尔式转速传感器

霍尔传感器输出的是数字信号,调理相对简单。但要注意上拉电阻的取值——太小了功耗大,太大了上升沿变缓。

// 转速测量算法(脉冲计数法)
uint32_t calculate_rpm() {
    static uint32_t last_time = 0;
    uint32_t now = get_timer_us();
    uint32_t period = now - last_time;  // 脉冲周期(us)
    last_time = now;
    // 60秒 * 1000000微秒 / 周期(us) / 齿数
    return 60 * 1000000 / period / TOOTH_COUNT;
}

2.5 信号调理的共性问题

讲完各个传感器,我想说说共性问题。这些是我在项目中反复踩过的坑。

2.5.1 接地与屏蔽

发动机环境电磁干扰大,信号调理必须注意接地。我建议用单点接地,模拟地和数字地分开,最后在电源处汇合。

我曾经犯过的错:有一回振动信号一直有50Hz工频干扰,查了三天。最后发现是传感器屏蔽层两端都接地了,形成了地环路。改成单端接地后,干扰立刻消失。

2.5.2 电源去耦

每个运放、每个ADC的电源引脚都要加去耦电容。0.1μF陶瓷电容并联10μF电解电容,这是标准做法。别嫌麻烦,省了这个电容,信号质量会差很多。

2.5.3 ESD保护

传感器接口是暴露在外的,容易受到静电放电冲击。我习惯在接口处加TVS管和串联电阻,保护后级电路。

我的建议:TVS管的钳位电压要选好。选高了保护不了,选低了会影响正常信号。一般选比电源电压高20%左右的型号。

好了,传感器信号调理这部分就讲到这里。下一章我们聊聊执行器驱动——说白了就是怎么让发动机听话。到时候见。