3. 冗余设计基本概念
好,咱们进入传感器冗余设计这一节。说实话,线控转向系统里,传感器就是系统的「眼睛」。眼睛要是瞎了,整个系统就废了。所以冗余设计不是可选项,是必选项。
我个人习惯把传感器冗余分成三个层次来考虑:信号源冗余、信号处理冗余、故障诊断冗余。咱们一个一个来拆解。
3.1 方向盘转角传感器(SAS)双通道设计
方向盘转角传感器,简称 SAS。它的任务就是告诉控制器:「方向盘现在转了多少度,往哪个方向转的。」
为什么需要双通道?很简单——单通道一旦失效,系统就不知道方向盘在什么位置了。这在功能安全里属于 ASIL D 要求,必须做到单点故障覆盖。
3.1.1 双通道架构方案
我见过的主流方案有两种:
| 方案类型 | 实现方式 | 优点 | 缺点 |
|---|---|---|---|
| 独立双芯片 | 两个独立的传感器芯片,各自输出角度值 | 物理隔离好,共因失效风险低 | 成本高,占用空间大 |
| 单芯片双通道 | 一个芯片内部集成两套感应单元 | 体积小,成本低 | 共因失效风险较高 |
我在实际项目中更倾向于独立双芯片方案。为什么?因为有一次在台架测试中,单芯片双通道方案因为芯片内部电源纹波干扰,两个通道同时出现了偏移。虽然概率很低,但一旦发生,系统就失去了冗余的意义。
关键设计原则:
- 两个通道的供电、地线、信号线必须物理隔离
- 两个通道的采样时序可以错开,避免同时受干扰
- 两个通道的量程和分辨率必须一致,方便交叉校验
3.1.2 双通道数据校验逻辑
双通道不是简单地把两个值拿来平均。真正的校验逻辑是这样的:
// 伪代码:SAS 双通道校验
if (abs(ch1_angle - ch2_angle) < THRESHOLD_NORMAL) {
// 正常状态,取平均值或主通道值
output_angle = (ch1_angle + ch2_angle) / 2;
} else if (abs(ch1_angle - ch2_angle) < THRESHOLD_WARNING) {
// 偏差较大,触发警告,但仍可使用
output_angle = ch1_angle; // 主通道优先
set_warning_flag(SAS_DEVIATION);
} else {
// 偏差过大,判定故障
set_fault_flag(SAS_CHANNEL_MISMATCH);
// 进入降级模式或安全状态
}
这里有个细节:阈值怎么定?我建议根据传感器本身的精度和噪声水平来设定。比如传感器精度是 ±0.5°,那阈值可以设在 1.5° 左右。太严容易误报,太松又起不到校验作用。
我的经验:阈值最好做成可标定的参数,不要写死在代码里。因为不同车型、不同传感器的特性不一样,量产阶段可能需要微调。
3.2 扭矩传感器冗余方案
扭矩传感器负责测量驾驶员施加在方向盘上的力矩。这个信号直接决定了系统输出多大的助力——说白了,它就是驾驶意图的「翻译官」。
扭矩传感器的冗余方案,我把它分成两类:同构冗余和异构冗余。
3.2.1 同构冗余方案
同构冗余就是两个一模一样的扭矩传感器,装在同一个位置。这种方案的好处是:
- 硬件设计简单,两个传感器共用接口
- 软件算法一致,容易实现
- 成本相对较低
但问题也很明显:共因失效。比如温度漂移、电磁干扰,两个传感器可能同时出问题。
3.2.2 异构冗余方案
异构冗余是我个人比较推崇的方案。它使用两种不同原理的传感器来测量同一个物理量。比如:
- 主传感器:应变片式扭矩传感器
- 冗余传感器:磁致伸缩式扭矩传感器
这两种传感器的工作原理完全不同,共因失效的概率大大降低。我在一个项目中就遇到过:应变片传感器因为粘接剂老化导致输出漂移,但磁致伸缩传感器完全正常。异构冗余让系统成功识别了故障,没有进入安全停车。
注意:异构冗余虽然可靠性高,但会带来额外的开发工作量。两种传感器的标定、补偿、故障诊断逻辑都不一样,软件复杂度会翻倍。
3.3 冗余传感器故障诊断
有了冗余传感器,还得知道它什么时候坏了。故障诊断就是干这个活的。
我把故障诊断分成三个层级:
- 信号级诊断:检查信号是否在合理范围内
- 通道级诊断:检查两个通道的一致性
- 系统级诊断:结合其他传感器信息进行交叉验证
3.3.1 信号级诊断
这是最基础的诊断。每个传感器信号都要检查:
- 范围检查:信号是否在物理允许的范围内?比如方向盘转角不可能超过 ±720°
- 变化率检查:信号变化速率是否合理?比如 1ms 内转角变化 100° 就不正常
- 通信检查:信号是否在预期的时间窗口内更新?有没有丢帧?
3.3.2 通道级诊断
两个通道的数据要互相校验。我常用的方法是:
// 通道级诊断逻辑
if (ch1_valid && ch2_valid) {
diff = abs(ch1_value - ch2_value);
if (diff > FAULT_THRESHOLD) {
// 两个通道不一致,判定故障
fault_status = SAS_FAULT_CHANNEL_MISMATCH;
} else if (diff > WARNING_THRESHOLD) {
// 偏差较大,但未到故障程度
fault_status = SAS_WARNING_CHANNEL_DEVIATION;
} else {
fault_status = SAS_OK;
}
} else {
// 某个通道失效,直接判定故障
fault_status = SAS_FAULT_CHANNEL_LOSS;
}
3.3.3 系统级诊断
这是最高层级的诊断。它利用系统中其他传感器的信息来验证 SAS 和扭矩传感器的输出是否合理。
举个例子:
- 如果方向盘转角显示车辆在左转,但横摆角速度传感器显示车辆在右转——那肯定有问题
- 如果扭矩传感器显示驾驶员在用力打方向,但车速传感器显示车辆静止——这也值得怀疑
这种跨传感器的逻辑校验,能发现单个传感器无法检测到的故障。
故障诊断的黄金法则:
- 诊断要快——故障发生后必须在安全时间内检测到
- 诊断要准——不能误报,也不能漏报
- 诊断要稳——不能因为噪声或瞬态干扰就触发故障
3.4 传感器冗余架构总览
下面这张图展示了传感器冗余设计的整体架构。你可以看到从信号输入到故障诊断的完整链路。
3.5 避坑指南
最后,分享几个我在项目中踩过的坑:
我曾经犯过的错误:
- 供电隔离没做好:两个通道共用一个 LDO,结果 LDO 失效导致两个通道同时掉电。后来改成独立供电,问题解决。
- 诊断阈值设得太死:量产阶段发现车辆在颠簸路面行驶时,SAS 两个通道的瞬时偏差超过了阈值,导致频繁误报。后来把阈值放宽,并加入了时间滤波。
- 忽略了传感器老化:扭矩传感器的零漂会随着时间慢慢变大。如果不做在线补偿,最终会导致系统误判。我建议加入周期性自校准机制。
嗯,传感器冗余设计这块,核心就是一句话:别让任何一个单点故障,成为系统的致命伤。双通道、异构冗余、三级诊断,这三板斧用好了,系统的可靠性就能上一个台阶。