VCU档位管理----档位判断
简介:
VCU作为整车控制的核心,通过汽车总线(如CAN/LIN总线)或硬线连接,实现对电池系统、电驱系统、热管理系统等关键部件的集中控制。它负责多个关键功能,包括档位控制、踏板信号管理、局域网内网络管理、车辆驱动管理、高压系统上下电管理以及整车能量管理等。
本文通过MBD开发的方式,通过SIMULINK对该功能进行建模。
需求分析与模块化建模
1.1 输入输出信号
信号定义:
信号名称 | 信号描述 | 信号类型 |
---|---|---|
HW_b_ShfSW1 | 档位输入SW1 | 硬线信号 |
HW_b_ShfSW2 | 档位输入SW2 | 硬线信号 |
HW_b_ShfSW3 | 档位输入SW3 | 硬线信号 |
HW_b_ShfSW4 | 档位输入SW4 | 硬线信号 |
HW_b_BrkPedSt | 制动开关 | 硬线信号 |
ESC_send_VehicleSpd | 车速 | CAN信号 |
MCU_send_MotorSpdFb | 车速 | CAN信号 |
1.2 功能描述
档位器输出4个硬线开关(SW1 SW2 SW3 SW4),有如下功能组合:
SW1 | SW2 | SW3 | SW4 | |
---|---|---|---|---|
P档 | 0 | 1 | 0 | 1 |
R档 | 1 | 1 | 0 | 0 |
N档 | 1 | 0 | 1 | 0 |
D档 | 0 | 1 | 1 | 0 |
Invalid | q其他组合 |
在SIMULINK界面,创建4个硬线输入信号HW_b_ShfSW1~4。
将4个输入分别根据上表的档位对应的逻辑进行连接,因为每种档位只有唯一的二进制代码,所以用“与”的逻辑进行连接;
为了识别当前档位,我们需要给每个档位定义不同的输出值,比如后面的输出接收到1,那就代表当前的档位为P档。我们利用Enable Subsystem来达到这个效果,Subsystem通过“Enable”来进行触发,其触发的逻辑为:当Enable接收的值为ture时(接收Boolean量),则这个子系统就开始工作了。
最后通过Merge模块,将这几个档位码收集到一块,给到档位输出GEAR。Merge的规则是“喜新厌旧”,他接收当前时刻最新的值。
我们完成了有效档位的搭建,接下来来搭建无效档位模块。
根据挡位逻辑表,因为有效挡位的二进制档位码是唯一的,那么无效挡位是去除掉这些有效挡位的二进制组合。根据前面搭建的模块逻辑,只要挡位是有效的,那他们相与的结果为1,无效则为0。那么将有效挡位PRND相加的结果不为1时,那这个挡位就是无效的。通过Goto模块来引出之前的档位逻辑信号。
通过from模块,来将这4个Condition相加,如果结果≠1,则信号无效;这里还有个data type conversion,因为Add模块只接受非Boolean变量,所以要将Boolean变量转成uint8、uint16、single这些变量。
1.3 挡位切换逻辑
VCU唤醒后的默认状态为P档,上电完成以后直到下电前都会实时读取当前的挡位信息。当挡位信号不是有效值时(非PRND档),如果前一时刻的档位为P档,则系统判断档位仍为P档;若前一时刻档位为其他无效挡位,则系统仲裁为N档;
这里有
一个时序需求:VCU的唤醒后和VCU上电完成后
一个判断需求:当前挡位是有效挡位还是无效挡位。如果是无效挡位还有一个分支,前一时刻的挡位是否有效;
先完成第一个关于时序的需求,假设VCU上电的时间为1s,那么在1s内这段时间可以认为是VCU唤醒之后,也就是VCU上电完成之前;
超过1s的这段时间就是VCU上电完成以后。
我们可以通过累加器的模型来达到这个目的
将系统的定步长调整成0.001s,也就是1ms。那么将本次输入与上次输入的值累加1000次的值再与compare to constant模块进行比较,如果输出为true,那代表时间为1s内,反之输出false,则为1s外。
还是利用Enable system这个模块,来触发1S内应该完成的任务。输出挡位为P,如果是1s外,那就要去读取当前时刻的挡位信息了。
再通过switch模块来判断,当前时刻是1s内还是1s外;
然后我们进行第二个需求设计,判断当前挡位的有效性判断。判断的条件是,挡位是否处于无效挡位状态,如果是GEAR_ERR = 0,代表当前挡位有效,走switch上面的路径,如果GEAR_ERR = 1,代表当前挡位无效,走switch下面的路径。
让我门来验证一下路径,假如当前挡位为无效挡位GEAR_ERR = 1,10?=> 为假,输出0;接着进入switch判断0≠0?= = 为假,走下面。ok;
假如当前挡位为无效挡位GEAR_ERR = 0,0 = 0 ?= => 为真,输出1;接着进入switch判断1≠0?>为真,走上面。ok
第三个需求设计,当挡位是无效的时候,需要结合前一时刻的挡位信息,如果前一时刻是P档,则输出P档;如果前一时刻的挡位是非PRND档,则系统仲裁为N档。
我们需要完成获取前一时刻的挡位信息,那么就使用Uint delay这个模块,把他接到挡位输出的前面。
为什么不从图示位置接出来?因为图示位置包含了上电前后的信息,就是1s内和1s外都包含了。好像也可以,最终可以通过测试来看看能不能满足我们的需求。
接着是无效挡位区分
最后用merge来组合起来,输出GEAR_REF代表实际输出的挡位
最后,其实可以在挡位确定的模块加入滤波消抖的模块,这样我们的模型可以看着更加合理一些
后续更新挡位切换。