我的 S62 发动机如何利用 MAF 传感器将电压转换为质量流量?

逆向工程 艾达 拆卸 摩托罗拉
2021-06-27 11:40:18

我们正试图解决一个汽车论坛上关于 BMW S62 发动机如何利用其两个 MAF(空气质量流量)传感器来确定进入发动机的空气质量流量的难题。该传感器对于发动机的正确运行至关重要,人们经常在不知道是否需要更换的情况下更换传感器。通过了解 ECU 如何使用传感器,人们可以设计一个使用万用表的简单测试来确认或反驳是否需要新的传感器。

有人可以访问 ECU(摩托罗拉 M68000)的拆解说明,并分享了他认为与质量空气流量评估相关的两个子程序的屏幕截图。

MAF Curve(这是什么tbls用途):

MAF曲线

sub_12D96:

sub_12D96

sub_1AA3A: sub_1AA3A


关于这里发生的事情,有几种观点:

  1. 正在使用两个 MAF 传感器电压的平均值。我在这组特定的说明中没有看到这一点。

  2. 查找表的结果减半。

  3. 两个结果分别计算,然后加在一起。然而,这与收集的现场数据相冲突。

  4. 只使用了一个传感器(换句话说,S62 检查的意义是相反的,但它在物理上没有意义)


有人可以帮我弄清楚指令在做什么吗?这是我的尝试,我只是无法将其全部“拼凑”来理解它:

sub_12D96:
move.l  a2, -(sp)                  ; Push long value at address a2 to stack
movea.l #SYS_TIMERTICS_COUNTER, a2 ; Move SYS_TIMERTICS_COUNTER address to a2
btst    #7, (PSYNC_ST).l           ; Bit-test on something, not sure how this works
beq.s   loc_12E02                  ; If true, go to loc_12E02, else continue

move.b  (ZUSTAND_MOTOR).l, d0      ; Move a byte from ZUSTAND_MOTOR address to data register d0
andi.b  #$1C, d0                   ; Bitwise-and 0x1C with data register d0
                                   ; [to check if engine is running]
beq.s   loc_12DEE                  ; If binary-equal, go to loc_12DEE, else continue

pea     (1).w                      ; Push effective address onto stack (does this set stack pointer?)
move.w  (HFM1_AD).l, d0            ; Move word value from HFM1_AD to data register d0 (why move.w and not move.l?)
move.l  d0, -(sp)                  ; Push long value to stack
jsr     sub_1AA3A                  ; Jump to subroutine sub_1AA3A
addq.l  #8, sp                     ; Add 8 to stack pointer (move stack pointer address by 8?)
move.b  (K_MOTORTYP).l, d0         ; Move byte from K_MOTORTYP to data register d0
andi.l  $#EF, d0                   ; Bitwise-and 0xEF with data register d0
moveq   #$20, d1                   ; Move 0x20 to data register d1
cmp.l   d0, d1                     ; Compare d0 with d1
bne.s   loc_12DEE                  ; If binary-not-equal, go to loc_12DEE, else continue

pea     (2).w                      ; Push effective address onto stack (does this set stack pointer?)
move.w  (HFM2_AD).l, d0            ; Move word value from HFM2_AD to data register d0 (why move.w and not move.l?)
move.l  d0, -(sp)                  ; Push long value to stack
jsr     sub_1AA3A                  ; Jump to subroutine sub_1AA3A

sub_1AA3A:

arg_2=  6                          ; define constant (arg_2 = 6)
arg_7=  $B                         ; define constant (arg_7 = 11)

clr.l   d0
clr.w   d1
move.w  arg_2(sp), d0              ; move a word 6 places after stack pointer to d0
lsl.w   #3,d0                      ; left-shift the word at d0 by 3 bits (multiply by 8)
tbls.w  (KL_HFM_ML_V_b).l, d0      ; lookup word from KL_HFM_ML_V_b table with d0 as input
0个回答
没有发现任何回复~