GCC Code Coverage Report


Directory: ./
File: firmware/config/engines/mazda/mazda_miata_vvt.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 66.4% 101 0 152
Functions: 62.5% 5 0 8
Branches: 100.0% 2 0 2
Decisions: 100.0% 2 - 2

Line Branch Decision Exec Source
1 /*
2 * @file mazda_miata_vvt.cpp
3 *
4 * Miata NB2, also known as MX-5 Mk2.5
5 *
6 * Frankenso MAZDA_MIATA_2003
7 * set engine_type 47
8 *
9 * coil1/4 (p1 +5 VP) Gpio::E14
10 * coil2/2 (p1 +5 VP) Gpio::C9
11 * tachometer +5 VP (p3 +12 VP) Gpio::E8
12 * alternator +5 VP (p3 +12 VP) Gpio::E10
13 * ETB PWM Gpio::E6 inverted low-side with pull-up
14 * ETB dir1 Gpio::E12
15 * ETB dir2 Gpio::C7
16 *
17 * COP ion #1 Gpio::D8
18 * COP ion #3 Gpio::D9
19 *
20 * @date Oct 4, 2016
21 * @author Andrey Belomutskiy, (c) 2012-2020
22 * http://rusefi.com/forum/viewtopic.php?f=3&t=1095
23 *
24 *
25 * See also TT_MAZDA_MIATA_VVT_TEST for trigger simulation
26 *
27 * Based on http://rusefi.com/wiki/index.php?title=Manual:Hardware_Frankenso_board#Default_Pinout
28 *
29 * board #70 - red car, hunchback compatible
30 * set engine_type 55
31 *
32 * Crank primary trigger PA5 (3E in Miata board) white
33 * Cam vvt input PC6 (3G in Miata board) blue
34 * Wideband input PA3 (3J in Miata board)
35 *
36 * coil1/4 (p1 +5 VP) Gpio::E14
37 * coil2/2 (p1 +5 VP) Gpio::C7
38 *
39 * tachometer +5 VP (p3 +12 VP) Gpio::E8
40 * alternator +5 VP (p3 +12 VP) Gpio::E10
41 *
42 * VVT solenoid on aux PID#1 Gpio::E3
43 * warning light Gpio::E6
44 *
45 *
46 * idle solenoid PC13 on middle harness plug. diodes seem to be in the harness
47 */
48
49 #include "pch.h"
50
51 #include "mazda_miata_vvt.h"
52 #include "custom_engine.h"
53 #include "mazda_miata_base_maps.h"
54
55
56 #if HW_PROTEUS
57 #include "proteus_meta.h"
58 #endif
59
60 #include "mre_meta.h"
61
62 #if HW_HELLEN
63
64 #if VVT_TABLE_SIZE == 8
65 static const float vvt18RpmBins[VVT_TABLE_SIZE] =
66 {700.0, 1000.0, 2000.0, 3000.0, 3500.0, 4500.0, 5500.0, 6500.0}
67 ;
68
69 static const float vvt18LoadBins[VVT_TABLE_SIZE] =
70 {30.0, 40.0, 50.0, 60.0, 70.0, 75.0, 82.0, 85.0}
71 ;
72
73 static const uint8_t SCRIPT_TABLE_vvt_target[VVT_TABLE_SIZE][VVT_TABLE_SIZE] = {
74 /* Generated by TS2C on Mon Feb 13 19:11:32 EST 2017*/
75 {/* 0 30 *//* 0 700.0*/1, /* 1 1000.0*/3, /* 2 2000.0*/10, /* 3 3000.0*/20, /* 4 3500.0*/27, /* 5 4500.0*/28, /* 6 5500.0*/11, /* 7 6500.0*/5, },
76 {/* 1 40 *//* 0 700.0*/3, /* 1 1000.0*/10, /* 2 2000.0*/19, /* 3 3000.0*/26, /* 4 3500.0*/30, /* 5 4500.0*/28, /* 6 5500.0*/11, /* 7 6500.0*/5, },
77 {/* 2 50 *//* 0 700.0*/7, /* 1 1000.0*/16, /* 2 2000.0*/24, /* 3 3000.0*/28, /* 4 3500.0*/30, /* 5 4500.0*/28, /* 6 5500.0*/11, /* 7 6500.0*/5, },
78 {/* 3 60 *//* 0 700.0*/11, /* 1 1000.0*/20, /* 2 2000.0*/27, /* 3 3000.0*/28, /* 4 3500.0*/30, /* 5 4500.0*/28, /* 6 5500.0*/11, /* 7 6500.0*/5, },
79 {/* 4 70 *//* 0 700.0*/13, /* 1 1000.0*/24, /* 2 2000.0*/31, /* 3 3000.0*/28, /* 4 3500.0*/30, /* 5 4500.0*/28, /* 6 5500.0*/11, /* 7 6500.0*/5, },
80 {/* 5 75 *//* 0 700.0*/15, /* 1 1000.0*/27, /* 2 2000.0*/33, /* 3 3000.0*/28, /* 4 3500.0*/30, /* 5 4500.0*/28, /* 6 5500.0*/11, /* 7 6500.0*/5, },
81 {/* 6 82 *//* 0 700.0*/17, /* 1 1000.0*/28, /* 2 2000.0*/33, /* 3 3000.0*/28, /* 4 3500.0*/30, /* 5 4500.0*/28, /* 6 5500.0*/11, /* 7 6500.0*/5, },
82 {/* 7 85 *//* 0 700.0*/17, /* 1 1000.0*/28, /* 2 2000.0*/33, /* 3 3000.0*/28, /* 4 3500.0*/30, /* 5 4500.0*/28, /* 6 5500.0*/11, /* 7 6500.0*/5, },
83 };
84 #endif
85
86 #if (VE_RPM_COUNT == 16) && (VE_LOAD_COUNT == 16)
87 static const int8_t mapBased18vvtVeTable_NB_fuel_rail[16][16] = {
88 /* Generated by TS2C on Tue Apr 18 21:46:03 EDT 2017*/
89 {/* 0 20 *//* 0 700.0*/35, /* 1 820.0*/36, /* 2 950.0*/37, /* 3 1100.0*/35, /* 4 1300.0*/36, /* 5 1550.0*/37, /* 6 1800.0*/33, /* 7 2150.0*/31, /* 8 2500.0*/25, /* 9 3000.0*/24, /* 10 3500.0*/24, /* 11 4150.0*/25, /* 12 4900.0*/26, /* 13 5800.0*/29, /* 14 6800.0*/33, /* 15 8000.0*/36, },
90 {/* 1 25 *//* 0 700.0*/35, /* 1 820.0*/37, /* 2 950.0*/38, /* 3 1100.0*/37, /* 4 1300.0*/36, /* 5 1550.0*/37, /* 6 1800.0*/41, /* 7 2150.0*/39, /* 8 2500.0*/40, /* 9 3000.0*/37, /* 10 3500.0*/35, /* 11 4150.0*/36, /* 12 4900.0*/37, /* 13 5800.0*/35, /* 14 6800.0*/38, /* 15 8000.0*/40, },
91 {/* 2 30 *//* 0 700.0*/37, /* 1 820.0*/40, /* 2 950.0*/39, /* 3 1100.0*/37, /* 4 1300.0*/38, /* 5 1550.0*/41, /* 6 1800.0*/45, /* 7 2150.0*/47, /* 8 2500.0*/54, /* 9 3000.0*/48, /* 10 3500.0*/47, /* 11 4150.0*/55, /* 12 4900.0*/55, /* 13 5800.0*/49, /* 14 6800.0*/50, /* 15 8000.0*/51, },
92 {/* 3 35 *//* 0 700.0*/39, /* 1 820.0*/44, /* 2 950.0*/42, /* 3 1100.0*/40, /* 4 1300.0*/45, /* 5 1550.0*/48, /* 6 1800.0*/48, /* 7 2150.0*/52, /* 8 2500.0*/56, /* 9 3000.0*/53, /* 10 3500.0*/52, /* 11 4150.0*/58, /* 12 4900.0*/62, /* 13 5800.0*/57, /* 14 6800.0*/58, /* 15 8000.0*/58, },
93 {/* 4 40 *//* 0 700.0*/45, /* 1 820.0*/56, /* 2 950.0*/49, /* 3 1100.0*/45, /* 4 1300.0*/54, /* 5 1550.0*/53, /* 6 1800.0*/55, /* 7 2150.0*/54, /* 8 2500.0*/57, /* 9 3000.0*/55, /* 10 3500.0*/57, /* 11 4150.0*/59, /* 12 4900.0*/62, /* 13 5800.0*/59, /* 14 6800.0*/63, /* 15 8000.0*/62, },
94 {/* 5 46 *//* 0 700.0*/54, /* 1 820.0*/61, /* 2 950.0*/56, /* 3 1100.0*/52, /* 4 1300.0*/53, /* 5 1550.0*/58, /* 6 1800.0*/57, /* 7 2150.0*/59, /* 8 2500.0*/58, /* 9 3000.0*/58, /* 10 3500.0*/60, /* 11 4150.0*/64, /* 12 4900.0*/66, /* 13 5800.0*/64, /* 14 6800.0*/65, /* 15 8000.0*/63, },
95 {/* 6 54 *//* 0 700.0*/60, /* 1 820.0*/67, /* 2 950.0*/66, /* 3 1100.0*/60, /* 4 1300.0*/59, /* 5 1550.0*/59, /* 6 1800.0*/61, /* 7 2150.0*/63, /* 8 2500.0*/63, /* 9 3000.0*/60, /* 10 3500.0*/62, /* 11 4150.0*/69, /* 12 4900.0*/71, /* 13 5800.0*/67, /* 14 6800.0*/65, /* 15 8000.0*/63, },
96 {/* 7 63 *//* 0 700.0*/65, /* 1 820.0*/70, /* 2 950.0*/71, /* 3 1100.0*/67, /* 4 1300.0*/62, /* 5 1550.0*/61, /* 6 1800.0*/65, /* 7 2150.0*/63, /* 8 2500.0*/63, /* 9 3000.0*/64, /* 10 3500.0*/66, /* 11 4150.0*/69, /* 12 4900.0*/73, /* 13 5800.0*/71, /* 14 6800.0*/67, /* 15 8000.0*/65, },
97 {/* 8 73 *//* 0 700.0*/70, /* 1 820.0*/74, /* 2 950.0*/73, /* 3 1100.0*/75, /* 4 1300.0*/71, /* 5 1550.0*/66, /* 6 1800.0*/66, /* 7 2150.0*/65, /* 8 2500.0*/67, /* 9 3000.0*/69, /* 10 3500.0*/68, /* 11 4150.0*/72, /* 12 4900.0*/76, /* 13 5800.0*/75, /* 14 6800.0*/66, /* 15 8000.0*/65, },
98 {/* 9 85 *//* 0 700.0*/71, /* 1 820.0*/75, /* 2 950.0*/76, /* 3 1100.0*/74, /* 4 1300.0*/73, /* 5 1550.0*/72, /* 6 1800.0*/71, /* 7 2150.0*/70, /* 8 2500.0*/72, /* 9 3000.0*/72, /* 10 3500.0*/74, /* 11 4150.0*/76, /* 12 4900.0*/78, /* 13 5800.0*/76, /* 14 6800.0*/68, /* 15 8000.0*/64, },
99 {/* 10 99 *//* 0 700.0*/75, /* 1 820.0*/76, /* 2 950.0*/78, /* 3 1100.0*/76, /* 4 1300.0*/73, /* 5 1550.0*/74, /* 6 1800.0*/74, /* 7 2150.0*/74, /* 8 2500.0*/77, /* 9 3000.0*/76, /* 10 3500.0*/77, /* 11 4150.0*/76, /* 12 4900.0*/77, /* 13 5800.0*/76, /* 14 6800.0*/69, /* 15 8000.0*/65, },
100 {/* 11 116 *//* 0 700.0*/80, /* 1 820.0*/80, /* 2 950.0*/80, /* 3 1100.0*/80, /* 4 1300.0*/80, /* 5 1550.0*/80, /* 6 1800.0*/80, /* 7 2150.0*/80, /* 8 2500.0*/80, /* 9 3000.0*/80, /* 10 3500.0*/80, /* 11 4150.0*/80, /* 12 4900.0*/80, /* 13 5800.0*/80, /* 14 6800.0*/80, /* 15 8000.0*/80, },
101 {/* 12 135 *//* 0 700.0*/80, /* 1 820.0*/80, /* 2 950.0*/80, /* 3 1100.0*/80, /* 4 1300.0*/80, /* 5 1550.0*/80, /* 6 1800.0*/80, /* 7 2150.0*/80, /* 8 2500.0*/80, /* 9 3000.0*/80, /* 10 3500.0*/80, /* 11 4150.0*/80, /* 12 4900.0*/80, /* 13 5800.0*/80, /* 14 6800.0*/80, /* 15 8000.0*/80, },
102 {/* 13 158 *//* 0 700.0*/80, /* 1 820.0*/80, /* 2 950.0*/80, /* 3 1100.0*/80, /* 4 1300.0*/80, /* 5 1550.0*/80, /* 6 1800.0*/80, /* 7 2150.0*/80, /* 8 2500.0*/80, /* 9 3000.0*/80, /* 10 3500.0*/80, /* 11 4150.0*/80, /* 12 4900.0*/80, /* 13 5800.0*/80, /* 14 6800.0*/80, /* 15 8000.0*/80, },
103 {/* 14 185 *//* 0 700.0*/80, /* 1 820.0*/80, /* 2 950.0*/80, /* 3 1100.0*/80, /* 4 1300.0*/80, /* 5 1550.0*/80, /* 6 1800.0*/80, /* 7 2150.0*/80, /* 8 2500.0*/80, /* 9 3000.0*/80, /* 10 3500.0*/80, /* 11 4150.0*/80, /* 12 4900.0*/80, /* 13 5800.0*/80, /* 14 6800.0*/80, /* 15 8000.0*/80, },
104 {/* 15 220 *//* 0 700.0*/80, /* 1 820.0*/80, /* 2 950.0*/80, /* 3 1100.0*/80, /* 4 1300.0*/80, /* 5 1550.0*/80, /* 6 1800.0*/80, /* 7 2150.0*/80, /* 8 2500.0*/80, /* 9 3000.0*/80, /* 10 3500.0*/80, /* 11 4150.0*/80, /* 12 4900.0*/80, /* 13 5800.0*/80, /* 14 6800.0*/80, /* 15 8000.0*/80, },
105 };
106
107 const float mazda_miata_nb2_RpmBins[VE_RPM_COUNT] = {700.0, 820.0, 950.0, 1100.0,
108 1300.0, 1550.0, 1800.0, 2150.0,
109 2500.0, 3000.0, 3500.0, 4150.0,
110 4900.0, 5800.0, 6800.0, 8000.0}
111 ;
112
113 const float mazda_miata_nb2_LoadBins[VE_LOAD_COUNT] = {20.0, 25.0, 30.0, 35.0,
114 40.0, 46.0, 54.0, 63.0,
115 73.0, 85.0, 99.0, 116.0,
116 135.0, 158.0, 185.0, 220.0}
117 ;
118 #endif
119
120 #if (IGN_RPM_COUNT == 16) && (IGN_LOAD_COUNT == 16)
121 static const float ignition18vvtRpmBins[IGN_RPM_COUNT] = {
122 700.0, 850.0 , 943.0 ,
123 1112.0 , 1310.0 , 1545.0 ,
124 1821.0, 2146.0, 2530.0,
125 2982.0, 3515.0 , 4144.0 ,
126 4884.0 , 5757.0 , 6787.0, 8000.0};
127
128 static const float ignition18vvtLoadBins[IGN_LOAD_COUNT] = {
129 25.0 , 29.10009765625 , 34.0 , 39.60009765625 ,
130 46.2001953125 , 53.89990234375 , 62.7998046875 ,
131 73.2001953125 , 85.400390625 , 99.5 , 116.0 ,
132 135.30078125 , 157.69921875 , 183.900390625 , 214.400390625 ,
133 250.0};
134
135 static const uint8_t mapBased18vvtTimingTable[16][16] = {
136 /* Generated by TS2C on Tue Apr 18 21:43:57 EDT 2017*/
137 {/* 0 25 *//* 0 700.0*/14, /* 1 850.0*/13, /* 2 943.0*/13, /* 3 1112.0*/16, /* 4 1310.0*/21, /* 5 1545.0*/25, /* 6 1821.0*/28, /* 7 2146.0*/31, /* 8 2530.0*/34, /* 9 2982.0*/36, /* 10 3515.0*/38, /* 11 4144.0*/39, /* 12 4884.0*/40, /* 13 5757.0*/40, /* 14 6787.0*/40, /* 15 8000.0*/41, },
138 {/* 1 29.100 *//* 0 700.0*/14, /* 1 850.0*/13, /* 2 943.0*/13, /* 3 1112.0*/16, /* 4 1310.0*/21, /* 5 1545.0*/25, /* 6 1821.0*/28, /* 7 2146.0*/31, /* 8 2530.0*/34, /* 9 2982.0*/36, /* 10 3515.0*/38, /* 11 4144.0*/39, /* 12 4884.0*/40, /* 13 5757.0*/40, /* 14 6787.0*/40, /* 15 8000.0*/40, },
139 {/* 2 34 *//* 0 700.0*/14, /* 1 850.0*/13, /* 2 943.0*/13, /* 3 1112.0*/16, /* 4 1310.0*/21, /* 5 1545.0*/24, /* 6 1821.0*/27, /* 7 2146.0*/30, /* 8 2530.0*/33, /* 9 2982.0*/35, /* 10 3515.0*/37, /* 11 4144.0*/38, /* 12 4884.0*/39, /* 13 5757.0*/40, /* 14 6787.0*/40, /* 15 8000.0*/40, },
140 {/* 3 39.600 *//* 0 700.0*/15, /* 1 850.0*/13, /* 2 943.0*/13, /* 3 1112.0*/17, /* 4 1310.0*/21, /* 5 1545.0*/24, /* 6 1821.0*/27, /* 7 2146.0*/30, /* 8 2530.0*/33, /* 9 2982.0*/35, /* 10 3515.0*/36, /* 11 4144.0*/38, /* 12 4884.0*/38, /* 13 5757.0*/39, /* 14 6787.0*/39, /* 15 8000.0*/39, },
141 {/* 4 46.200 *//* 0 700.0*/15, /* 1 850.0*/13, /* 2 943.0*/13, /* 3 1112.0*/18, /* 4 1310.0*/21, /* 5 1545.0*/24, /* 6 1821.0*/26, /* 7 2146.0*/29, /* 8 2530.0*/32, /* 9 2982.0*/33, /* 10 3515.0*/36, /* 11 4144.0*/37, /* 12 4884.0*/38, /* 13 5757.0*/38, /* 14 6787.0*/38, /* 15 8000.0*/39, },
142 {/* 5 53.900 *//* 0 700.0*/15, /* 1 850.0*/14, /* 2 943.0*/14, /* 3 1112.0*/18, /* 4 1310.0*/21, /* 5 1545.0*/24, /* 6 1821.0*/26, /* 7 2146.0*/28, /* 8 2530.0*/30, /* 9 2982.0*/32, /* 10 3515.0*/34, /* 11 4144.0*/36, /* 12 4884.0*/37, /* 13 5757.0*/37, /* 14 6787.0*/38, /* 15 8000.0*/38, },
143 {/* 6 62.800 *//* 0 700.0*/15, /* 1 850.0*/15, /* 2 943.0*/14, /* 3 1112.0*/19, /* 4 1310.0*/21, /* 5 1545.0*/23, /* 6 1821.0*/25, /* 7 2146.0*/27, /* 8 2530.0*/29, /* 9 2982.0*/31, /* 10 3515.0*/33, /* 11 4144.0*/34, /* 12 4884.0*/35, /* 13 5757.0*/36, /* 14 6787.0*/36, /* 15 8000.0*/37, },
144 {/* 7 73.200 *//* 0 700.0*/16, /* 1 850.0*/16, /* 2 943.0*/15, /* 3 1112.0*/19, /* 4 1310.0*/21, /* 5 1545.0*/23, /* 6 1821.0*/24, /* 7 2146.0*/26, /* 8 2530.0*/28, /* 9 2982.0*/30, /* 10 3515.0*/31, /* 11 4144.0*/32, /* 12 4884.0*/33, /* 13 5757.0*/34, /* 14 6787.0*/34, /* 15 8000.0*/35, },
145 {/* 8 85.400 *//* 0 700.0*/16, /* 1 850.0*/17, /* 2 943.0*/16, /* 3 1112.0*/19, /* 4 1310.0*/20, /* 5 1545.0*/22, /* 6 1821.0*/23, /* 7 2146.0*/24, /* 8 2530.0*/26, /* 9 2982.0*/28, /* 10 3515.0*/29, /* 11 4144.0*/31, /* 12 4884.0*/31, /* 13 5757.0*/32, /* 14 6787.0*/33, /* 15 8000.0*/33, },
146 {/* 9 99.500 *//* 0 700.0*/16, /* 1 850.0*/16, /* 2 943.0*/17, /* 3 1112.0*/18, /* 4 1310.0*/19, /* 5 1545.0*/20, /* 6 1821.0*/21, /* 7 2146.0*/22, /* 8 2530.0*/23, /* 9 2982.0*/25, /* 10 3515.0*/26, /* 11 4144.0*/28, /* 12 4884.0*/28, /* 13 5757.0*/29, /* 14 6787.0*/30, /* 15 8000.0*/31, },
147 {/* 10 116 *//* 0 700.0*/15, /* 1 850.0*/15, /* 2 943.0*/16, /* 3 1112.0*/16, /* 4 1310.0*/17, /* 5 1545.0*/18, /* 6 1821.0*/19, /* 7 2146.0*/20, /* 8 2530.0*/21, /* 9 2982.0*/23, /* 10 3515.0*/24, /* 11 4144.0*/25, /* 12 4884.0*/26, /* 13 5757.0*/27, /* 14 6787.0*/28, /* 15 8000.0*/29, },
148 {/* 11 135.301 *//* 0 700.0*/13, /* 1 850.0*/13, /* 2 943.0*/14, /* 3 1112.0*/14, /* 4 1310.0*/15, /* 5 1545.0*/15, /* 6 1821.0*/17, /* 7 2146.0*/17, /* 8 2530.0*/19, /* 9 2982.0*/20, /* 10 3515.0*/22, /* 11 4144.0*/23, /* 12 4884.0*/24, /* 13 5757.0*/25, /* 14 6787.0*/26, /* 15 8000.0*/27, },
149 {/* 12 157.699 *//* 0 700.0*/11, /* 1 850.0*/11, /* 2 943.0*/11, /* 3 1112.0*/12, /* 4 1310.0*/12, /* 5 1545.0*/13, /* 6 1821.0*/14, /* 7 2146.0*/15, /* 8 2530.0*/16, /* 9 2982.0*/17, /* 10 3515.0*/19, /* 11 4144.0*/20, /* 12 4884.0*/21, /* 13 5757.0*/22, /* 14 6787.0*/24, /* 15 8000.0*/25, },
150 {/* 13 183.900 *//* 0 700.0*/8, /* 1 850.0*/8, /* 2 943.0*/9, /* 3 1112.0*/9, /* 4 1310.0*/9, /* 5 1545.0*/10, /* 6 1821.0*/11, /* 7 2146.0*/12, /* 8 2530.0*/13, /* 9 2982.0*/14, /* 10 3515.0*/16, /* 11 4144.0*/17, /* 12 4884.0*/18, /* 13 5757.0*/19, /* 14 6787.0*/21, /* 15 8000.0*/22, },
151 {/* 14 214.400 *//* 0 700.0*/5, /* 1 850.0*/5, /* 2 943.0*/5, /* 3 1112.0*/5, /* 4 1310.0*/6, /* 5 1545.0*/7, /* 6 1821.0*/7, /* 7 2146.0*/8, /* 8 2530.0*/9, /* 9 2982.0*/10, /* 10 3515.0*/12, /* 11 4144.0*/13, /* 12 4884.0*/14, /* 13 5757.0*/16, /* 14 6787.0*/17, /* 15 8000.0*/18, },
152 {/* 15 250 *//* 0 700.0*/1, /* 1 850.0*/1, /* 2 943.0*/1, /* 3 1112.0*/2, /* 4 1310.0*/2, /* 5 1545.0*/3, /* 6 1821.0*/3, /* 7 2146.0*/4, /* 8 2530.0*/5, /* 9 2982.0*/6, /* 10 3515.0*/7, /* 11 4144.0*/9, /* 12 4884.0*/10, /* 13 5757.0*/12, /* 14 6787.0*/13, /* 15 8000.0*/14, },
153 };
154 #endif
155
156
157 /*
158 #define MAF_TRANSFER_SIZE 8
159
160 static const float mafTransferVolts[MAF_TRANSFER_SIZE] = {1.365,
161 1.569,
162 2.028,
163 2.35,
164 2.611,
165 2.959,
166 3.499,
167 4.011,
168 };
169
170
171 according to internet this should be the Miata NB transfer function but in reality it seems off
172 this could be related to us not using proper signal conditioning hardware
173 static const float mafTransferKgH[MAF_TRANSFER_SIZE] = {
174 0,
175 3.9456,
176 18.7308,
177 45.4788,
178 82.278,
179 154.4328,
180 329.8104,
181 594.2772
182 };
183
184
185 */
186
187 #define MAF_TRANSFER_SIZE 10
188
189 // this transfer function somehow works with 1K pull-down
190 static const float mafTransferVolts[MAF_TRANSFER_SIZE] = {
191 0.50,
192 0.87,
193 1.07,
194 1.53,
195 1.85,
196 2.11,
197 2.46,
198 3.00,
199 3.51,
200 4.50
201 };
202
203 static const float mafTransferKgH[MAF_TRANSFER_SIZE] = {
204 0.00,
205 0.00,
206 1.00,
207 3.00,
208 8.00,
209 19.00,
210 45.00,
211 100.00,
212 175.00,
213 350.00
214 };
215
216
217 8 static void setMAFTransferFunction() {
218 8 memcpy(config->mafDecoding, mafTransferKgH, sizeof(mafTransferKgH));
219 8 memcpy(config->mafDecodingBins, mafTransferVolts, sizeof(mafTransferVolts));
220
2/2
✓ Branch 0 taken 176 times.
✓ Branch 1 taken 8 times.
2/2
✓ Decision 'true' taken 176 times.
✓ Decision 'false' taken 8 times.
184 for (int i = MAF_TRANSFER_SIZE;i<MAF_DECODING_COUNT;i++) {
221 176 config->mafDecodingBins[i] = config->mafDecodingBins[MAF_TRANSFER_SIZE - 1] + i * 0.01;
222 176 config->mafDecoding[i] = config->mafDecoding[MAF_TRANSFER_SIZE - 1];
223 }
224 8 }
225
226 8 static void setMazdaMiataNbInjectorLag() {
227 #if VBAT_INJECTOR_CURVE_SIZE == 8
228 static const float injectorLagVbattBins[VBAT_INJECTOR_CURVE_SIZE] = {
229 6.0, 8.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0
230 };
231 8 copyArray(engineConfiguration->injector.battLagCorrBattBins, injectorLagVbattBins);
232 #endif // VBAT_INJECTOR_CURVE_SIZE
233 #if VBAT_INJECTOR_CURVE_PRESSURE_SIZE == 2
234 static const float injectorLagPressureBins[VBAT_INJECTOR_CURVE_PRESSURE_SIZE] = { 300, 600 };
235 8 copyArray(engineConfiguration->injector.battLagCorrPressBins, injectorLagPressureBins);
236 #endif // VBAT_INJECTOR_CURVE_PRESSURE_SIZE
237 #if (VBAT_INJECTOR_CURVE_PRESSURE_SIZE == 2) && (VBAT_INJECTOR_CURVE_SIZE == 8)
238 static const float injectorLagCorrection[VBAT_INJECTOR_CURVE_PRESSURE_SIZE][VBAT_INJECTOR_CURVE_SIZE] = {
239 { 4.0, 3.0, 2.0, 1.7, 1.5, 1.35, 1.25, 1.20 },
240 { 4.0, 3.0, 2.0, 1.7, 1.5, 1.35, 1.25, 1.20 },
241 };
242 8 copyTable(engineConfiguration->injector.battLagCorrTable, injectorLagCorrection);
243 #endif
244 8 }
245
246 /**
247 * stuff common between NB1 and NB2
248 */
249 8 static void setCommonMazdaNB() {
250 // Base engine
251 8 engineConfiguration->displacement = 1.839;
252 8 engineConfiguration->cylindersCount = 4;
253 8 engineConfiguration->firingOrder = FO_1_3_4_2;
254
255 8 engineConfiguration->rpmHardLimit = 7200;
256
257 8 engineConfiguration->cylinderBore = 83;
258 8 strcpy(engineConfiguration->engineMake, ENGINE_MAKE_MAZDA);
259 8 config->dynoCarCarMassKg = 1070;
260
261 8 engineConfiguration->injectionMode = IM_SEQUENTIAL;
262 8 engineConfiguration->ignitionMode = IM_WASTED_SPARK;
263
264 // Trigger
265 8 engineConfiguration->trigger.type = trigger_type_e::TT_MIATA_VVT;
266 8 engineConfiguration->vvtMode[0] = VVT_MIATA_NB;
267 8 engineConfiguration->vvtOffsets[0] = 98;
268
269 // Cranking
270 8 engineConfiguration->ignitionDwellForCrankingMs = 4;
271 8 setTable(config->crankingCycleBaseFuel, 27.5); // this value for return-less NB miata fuel system, higher pressure
272 8 engineConfiguration->cranking.rpm = 400;
273 8 setArrayValues(config->cltCrankingCorr, 60);
274 8 setArrayValues(config->afterCrankingIACtaperDuration, 250);
275
276 // Idle
277 8 engineConfiguration->idleMode = idle_mode_e::IM_AUTO;
278 8 engineConfiguration->iacByTpsTaper = 6;
279 8 engineConfiguration->acIdleExtraOffset = 15;
280
281 8 engineConfiguration->useIdleTimingPidControl = true;
282 8 engineConfiguration->idlePidRpmUpperLimit = 350;
283 8 engineConfiguration->idlePidRpmDeadZone = 100;
284
285 8 engineConfiguration->idleRpmPid.pFactor = 0.0065;
286 8 engineConfiguration->idleRpmPid.iFactor = 0.3;
287 8 engineConfiguration->idleRpmPid.dFactor = 0.002;
288 8 engineConfiguration->idleRpmPid.minValue = -8;
289 8 engineConfiguration->idleRpmPid.maxValue = 10;
290 8 engineConfiguration->idlerpmpid_iTermMin = -15;
291 8 engineConfiguration->idlerpmpid_iTermMax = 30;
292
293 // Fan
294 8 engineConfiguration->enableFan1WithAc = true;
295
296 // Alternator
297 8 engineConfiguration->isAlternatorControlEnabled = true;
298 8 setTable(config->alternatorVoltageTargetTable, 14.0f);
299 8 engineConfiguration->alternatorControl.offset = 20;
300 8 engineConfiguration->alternatorControl.pFactor = 16;
301 8 engineConfiguration->alternatorControl.iFactor = 8;
302 8 engineConfiguration->alternatorControl.dFactor = 0.1;
303 8 engineConfiguration->alternatorControl.periodMs = 10;
304
305 // Tach
306 8 engineConfiguration->tachPulsePerRev = 2;
307
308 #if (VE_RPM_COUNT == 16) && (VE_LOAD_COUNT == 16)
309 // Tables
310 8 copyArray(config->veRpmBins, mazda_miata_nb2_RpmBins);
311 8 copyArray(config->veLoadBins, mazda_miata_nb2_LoadBins);
312 8 copyTable(config->veTable, mapBased18vvtVeTable_NB_fuel_rail);
313 #endif
314
315 #if (IGN_RPM_COUNT == 16) && (IGN_LOAD_COUNT == 16)
316 8 copyArray(config->ignitionRpmBins, ignition18vvtRpmBins);
317 8 copyArray(config->ignitionLoadBins, ignition18vvtLoadBins);
318 8 copyTable(config->ignitionTable, mapBased18vvtTimingTable);
319 #endif
320
321 8 setMazdaMiataNbInjectorLag();
322
323 // Sensors
324
325 // TPS
326 // set tps_min 90
327 8 engineConfiguration->tpsMin = 100; // convert 12to10 bit (ADC/4)
328 // set tps_max 540
329 8 engineConfiguration->tpsMax = 650; // convert 12to10 bit (ADC/4)
330
331 // CLT/IAT
332 8 setCommonNTCSensorParameters(&engineConfiguration->clt);
333 8 setCommonNTCSensorParameters(&engineConfiguration->iat);
334
335 // MAF (todo: do we use this?)
336 8 setMAFTransferFunction();
337
338 8 engineConfiguration->wwaeTau = 0.1;
339
340 8 miataNA_setCltIdleCorrBins();
341 8 miataNA_setCltIdleRpmBins();
342 8 miataNA_setIacCoastingBins();
343
344 // All factory miata setups end up with 1.12 speed sensor turns
345 // per wheel turn, by matching the speedo sensor gear to the
346 // diff ratio
347
348 // - 6 teeth on transmission output shaft
349 // - 23 teeth on speedometer sensor
350 // - 3.909 rear axle ratio
351 // 3.909 * 6 / 21 ~= 1.12
352 8 engineConfiguration->vssGearRatio = 3.909 * 6 / 21;
353 8 engineConfiguration->vssToothCount = 4;
354 8 }
355
356 8 static void setMazdaMiataEngineNB2Defaults() {
357 8 strcpy(engineConfiguration->engineCode, "NB2");
358
359 /**
360 * http://miataturbo.wikidot.com/fuel-injectors
361 * 01-05 (purple) - #195500-4060
362 */
363 8 engineConfiguration->injector.flow = 265;
364 8 engineConfiguration->fuelReferencePressure = 400; // 400 kPa, 58 psi
365 8 engineConfiguration->injectorCompensationMode = ICM_FixedRailPressure;
366
367 8 setCommonMazdaNB();
368
369 #if VVT_TABLE_SIZE == 8
370 8 copyArray(config->vvtTable1RpmBins, vvt18RpmBins);
371 8 copyArray(config->vvtTable1LoadBins, vvt18LoadBins);
372 8 copyTable(config->vvtTable1, SCRIPT_TABLE_vvt_target);
373 #endif // VVT_TABLE_SIZE
374
375 // VVT closed loop
376 8 engineConfiguration->auxPid[0].pFactor = 2;
377 8 engineConfiguration->auxPid[0].iFactor = 0.005;
378 8 engineConfiguration->auxPid[0].dFactor = 0.002;
379 8 engineConfiguration->auxPid[0].offset = 33;
380 8 engineConfiguration->auxPid[0].minValue = 20;
381 8 engineConfiguration->auxPid[0].maxValue = 90;
382
383 // Vehicle speed/gears
384 8 engineConfiguration->totalGearsCount = 6;
385 8 engineConfiguration->gearRatio[0] = 3.760;
386 8 engineConfiguration->gearRatio[1] = 2.269;
387 8 engineConfiguration->gearRatio[2] = 1.646;
388 8 engineConfiguration->gearRatio[3] = 1.257;
389 8 engineConfiguration->gearRatio[4] = 1.000;
390 8 engineConfiguration->gearRatio[5] = 0.843;
391
392 // These may need to change based on your real car
393 8 engineConfiguration->driveWheelRevPerKm = 538;
394 8 engineConfiguration->finalGearRatio = 3.909;
395 8 }
396 #endif // HW_HELLEN
397
398 /**
399 * https://github.com/rusefi/rusefi/wiki/HOWTO-TCU-A42DE-on-Proteus
400 */
401 #if HW_PROTEUS
402 void setMiataNB2_Proteus_TCU() {
403 engineConfiguration->tcuEnabled = true;
404
405 strcpy(engineConfiguration->engineCode, "NB2");
406 strcpy(engineConfiguration->engineMake, ENGINE_MAKE_MAZDA);
407 strcpy(engineConfiguration->vehicleName, "TCU test");
408
409 engineConfiguration->trigger.type = trigger_type_e::TT_TOOTHED_WHEEL;
410 engineConfiguration->trigger.customTotalToothCount = 10;
411 engineConfiguration->trigger.customSkippedToothCount = 0;
412
413
414 engineConfiguration->triggerInputPins[0] = Gpio::Unassigned;
415 engineConfiguration->tcuInputSpeedSensorPin = PROTEUS_VR_1;
416
417 engineConfiguration->vehicleSpeedSensorInputPin = PROTEUS_VR_2;
418
419 engineConfiguration->driveWheelRevPerKm = 544; // 205/50R15
420 engineConfiguration->vssGearRatio = 4.3;
421 engineConfiguration->vssToothCount = 22;
422
423 // "Highside 2"
424 engineConfiguration->tcu_solenoid[0] = Gpio::A8;
425 // "Highside 1"
426 engineConfiguration->tcu_solenoid[1] = Gpio::A9;
427
428 // "Digital 1" green
429 engineConfiguration->tcuUpshiftButtonPin = Gpio::C6;
430 engineConfiguration->tcuUpshiftButtonPinMode = PI_PULLUP;
431 // "Digital 6" white
432 engineConfiguration->tcuDownshiftButtonPin = Gpio::E15;
433 engineConfiguration->tcuDownshiftButtonPinMode = PI_PULLUP;
434
435 // R
436 config->tcuSolenoidTable[0][0] = 1;
437 config->tcuSolenoidTable[0][1] = 0;
438 // P/N
439 config->tcuSolenoidTable[1][0] = 1;
440 config->tcuSolenoidTable[1][1] = 0;
441 // 1
442 config->tcuSolenoidTable[2][0] = 1;
443 config->tcuSolenoidTable[2][1] = 0;
444 // 2
445 config->tcuSolenoidTable[3][0] = 1;
446 config->tcuSolenoidTable[3][1] = 1;
447 // 3
448 config->tcuSolenoidTable[4][0] = 0;
449 config->tcuSolenoidTable[4][1] = 1;
450 // 4
451 config->tcuSolenoidTable[5][0] = 0;
452 config->tcuSolenoidTable[5][1] = 0;
453
454 }
455 #endif // HW_PROTEUS
456
457 #if HW_HELLEN
458 void setMazdaMiataNB1() {
459 setCommonMazdaNB();
460 strcpy(engineConfiguration->engineCode, "NB1");
461
462 engineConfiguration->injector.flow = 256;
463
464 // Vehicle speed/gears
465 engineConfiguration->totalGearsCount = 5;
466 engineConfiguration->gearRatio[0] = 3.136;
467 engineConfiguration->gearRatio[1] = 1.888;
468 engineConfiguration->gearRatio[2] = 1.330;
469 engineConfiguration->gearRatio[3] = 1.000;
470 engineConfiguration->gearRatio[4] = 0.814;
471
472 // These may need to change based on your real car
473 engineConfiguration->driveWheelRevPerKm = 551;
474 engineConfiguration->finalGearRatio = 4.3;
475 }
476
477 8 void setMazdaMiataNB2() {
478 8 setMazdaMiataEngineNB2Defaults();
479 8 strcpy(engineConfiguration->vehicleName, "H72 test");
480
481
482 // set tps_min 90
483 8 engineConfiguration->tpsMin = 110; // convert 12to10 bit (ADC/4)
484
485 8 }
486
487 void setMazdaMiataNB2_36() {
488 setMazdaMiataNB2();
489
490 engineConfiguration->trigger.type = trigger_type_e::TT_TOOTHED_WHEEL_36_1;
491 engineConfiguration->globalTriggerAngleOffset = 76;
492 }
493
494 #endif // HW_HELLEN
495