3、扭矩安全监控与故障处理

各位同学,咱们今天聊点硬核的——扭矩安全。说实话,做VCU这么多年,我最怕的就是扭矩失控。你想想看,一个几百牛米的扭矩突然不受控,那可不是闹着玩的。我有个朋友在主机厂,就因为扭矩监控没做好,路试时差点出了大事。从那以后,我对这块就特别较真。

3.1 扭矩安全概念

扭矩安全,说白了就是保证电机输出的扭矩,跟咱们VCU算出来的目标扭矩一致。不能多,更不能少。多了车会窜,少了车不走,这都还好。最怕的是该刹车时它还在加速,或者该加速时它突然给你来个急刹。

我习惯把扭矩安全分成三个层面:

  • 信号层安全:传感器信号、CAN信号不能出错
  • 计算层安全:算法逻辑不能有bug,数值不能溢出
  • 执行层安全:电机控制器要听话,不能乱来

这三个层面,任何一个出问题,都可能引发安全事故。所以咱们做VCU的,脑子里得时刻绷着这根弦。

3.2 ASIL等级介绍

说到安全,就绕不开ASIL。ISO 26262里定义的ASIL等级,从A到D,D是最严格的。咱们VCU的扭矩控制,一般要求ASIL C或D。

ASIL等级 安全目标 典型应用
ASIL A 轻微伤害 车窗控制
ASIL B 中等伤害 雨刮控制
ASIL C 严重伤害 部分制动系统
ASIL D 致命伤害 转向、扭矩控制

我刚开始做VCU时,觉得ASIL D太夸张了。直到有一次,我在台架上测试,发现扭矩输出有5%的偏差。当时我就想,如果这是在高速上,5%的偏差可能就够要命的了。嗯,从那以后,我再也不敢小看ASIL等级了。

关键点:ASIL等级不是越高越好,它意味着更高的开发成本和更复杂的验证流程。但扭矩安全这块,没得选,必须上ASIL D。

3.3 扭矩监控策略

扭矩监控,我习惯用「三权分立」的思路。什么意思?就是三个独立的模块互相监督:

  1. 主控制器:算目标扭矩
  2. 监控器:独立计算,跟主控制器对比
  3. 看门狗:监控整个系统的运行状态

这三个模块,硬件上要独立,软件上要隔离。我曾经见过一个项目,主控制器和监控器共用了一个ADC通道,结果一个故障把两个都带偏了。你说这监控还有啥意义?

具体的监控策略,我给大家列一下:

  • 扭矩偏差监控:目标扭矩 vs 实际扭矩,偏差超过阈值就报警
  • 扭矩变化率监控:扭矩变化太快,可能是传感器故障
  • 信号合理性监控:油门、刹车信号不能同时有效
  • 通信超时监控:CAN报文超时,立即降级

这里我画了一张图,帮大家理解整个监控架构:

主控制器 计算目标扭矩 监控器 独立计算+对比 看门狗 系统运行监控 故障处理模块 接收故障信号 → 执行降级策略 安全扭矩输出

这张图展示的就是我常用的三层监控架构。主控制器算扭矩,监控器独立算一遍,看门狗盯着整个系统。三个模块互相独立,任何一个出问题,都能被另外两个发现。

3.4 故障降级处理

故障降级,说白了就是「出事了怎么办」。我见过很多新手,只想着怎么不出事,从来没想过出事了怎么收场。这不行,做VCU的,得把最坏的情况都想到。

我习惯把故障分成三个等级:

  • 一级故障:轻微异常,比如传感器信号有点抖。降级策略:限功率运行,同时报警。
  • 二级故障:明显异常,比如扭矩偏差超过10%。降级策略:立即切断动力,进入跛行模式。
  • 三级故障:严重异常,比如通信完全中断。降级策略:立即切断高压,安全停车。

我的经验:降级策略不是越激进越好。我曾经见过一个项目,一有故障就切断高压,结果在高速上直接失去动力,反而更危险。降级要「软硬结合」,该软的时候软,该硬的时候硬。

这里我给大家一个实际的故障处理代码框架:

/* 故障降级处理示例 */
void TorqueSafety_FaultHandler(uint8_t faultLevel)
{
    switch(faultLevel)
    {
        case FAULT_LEVEL_1:
            // 限功率运行,最大扭矩限制为50%
            TorqueLimit_SetMax(0.5f);
            FaultIndicator_SetWarning();
            break;
            
        case FAULT_LEVEL_2:
            // 进入跛行模式,最大扭矩限制为20%
            TorqueLimit_SetMax(0.2f);
            VehicleMode_SetLimpHome();
            FaultIndicator_SetUrgent();
            break;
            
        case FAULT_LEVEL_3:
            // 立即切断高压,安全停车
            HV_Disconnect();
            Brake_ApplyEmergency();
            FaultIndicator_SetCritical();
            break;
            
        default:
            // 安全起见,默认按三级故障处理
            HV_Disconnect();
            break;
    }
}

这个代码看着简单,但实际项目中要考虑的东西很多。比如,故障等级怎么判断?阈值设多少?降级后怎么恢复?这些都是细节。

注意:故障恢复比故障处理更难。我见过一个项目,故障恢复逻辑没写好,结果车辆在跛行模式和正常模式之间来回切换,比直接故障还危险。所以,故障恢复一定要加「防抖」逻辑,比如连续3秒没有故障信号,才能恢复。

最后,我想说一句。扭矩安全这块,没有捷径。我做了十几年VCU,每次看到新的安全标准出来,都得重新学习。但有一点是不变的:安全第一,功能第二。你想想看,一个功能再牛,如果安全没做好,那就是定时炸弹。

好了,今天就聊到这儿。记住,做VCU的,心里要时刻装着安全。


公众号:蓝海资料掘金营,微信deep3321