第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%左右的型号。
好了,传感器信号调理这部分就讲到这里。下一章我们聊聊执行器驱动——说白了就是怎么让发动机听话。到时候见。