rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
tc_4.cpp
Go to the documentation of this file.
1#include "pch.h"
2
3#include "tc_4.h"
4
5#if EFI_TCU
7static SimplePwm pcPwm("Pressure Control");
8
22
24 if (gear != getCurrentGear()) {
26 isShifting = true;
27 measureShiftTime(gear);
28 }
29
30 // set torque converter and pressure control state
31 setTccState(gear);
32 setPcState(gear);
33
34 setCurrentGear(gear);
35
37
38 float time = isShiftCompleted();
39 // 0 means shift is not completed
40 if (time != 0) {
41 lastShiftTime = time;
42 isShifting = false;
43 }
44}
45
47 // disable if shifting
48 if (isShifting) {
50 return;
51 }
52
55 if (!tps.Valid || !vss.Valid) {
56 return;
57 }
58 // only enable TC in gear 4
59 if (gear == GEAR_4) {
60 int lockSpeed = interpolate2d(tps.Value, config->tcu_tccTpsBins, config->tcu_tccLockSpeed);
61 int unlockSpeed = interpolate2d(tps.Value, config->tcu_tccTpsBins, config->tcu_tccUnlockSpeed);
62 if (vss.Value > lockSpeed) {
63 // torqueConverterDuty is only used for a gauge
66 } else if (vss.Value < unlockSpeed) {
69 }
70 } else {
73 }
74}
75
77 uint8_t (*pcts)[TCU_TABLE_WIDTH];
78
79 switch (gear) {
80 case REVERSE:
81 pcts = &config->tcu_pcValsR;
82 break;
83 case NEUTRAL:
84 pcts = &config->tcu_pcValsN;
85 break;
86 case GEAR_1:
87 if (isShifting && shiftingFrom == GEAR_2) {
88 pcts = &config->tcu_pcVals21;
89 } else {
90 pcts = &config->tcu_pcVals1;
91 }
92 break;
93 case GEAR_2:
94 if (isShifting && shiftingFrom == GEAR_1) {
95 pcts = &config->tcu_pcVals12;
96 } else if (isShifting && shiftingFrom == GEAR_3) {
97 pcts = &config->tcu_pcVals32;
98 } else {
99 pcts = &config->tcu_pcVals2;
100 }
101 break;
102 case GEAR_3:
103 if (isShifting && shiftingFrom == GEAR_2) {
104 pcts = &config->tcu_pcVals23;
105 } else if (isShifting && shiftingFrom == GEAR_4) {
106 pcts = &config->tcu_pcVals43;
107 } else {
108 pcts = &config->tcu_pcVals3;
109 }
110 break;
111 case GEAR_4:
112 if (isShifting && shiftingFrom == GEAR_3) {
113 pcts = &config->tcu_pcVals34;
114 } else {
115 pcts = &config->tcu_pcVals4;
116 }
117 break;
118 default:
119 break;
120 }
121
122 if (pcts) {
125 }
126}
127
131
132// here we have default 4R70W calibration
134 // TCU Software Config
138
139 // TCU Inputs
140 // Buttonshift
145 // Analog range sensor - used in early 4R70
148 // Two digital for +/- add-on
153 // Range voltages/digital states
154 config->tcu_rangeR[0] = 6072.0;
155 config->tcu_rangeR[1] = 0.0;
156 config->tcu_rangeR[2] = 0.0;
157 config->tcu_rangeP[0] = 18500.0;
158 config->tcu_rangeP[1] = 0.0;
159 config->tcu_rangeP[2] = 0.0;
160 config->tcu_rangeN[0] = 3028.0;
161 config->tcu_rangeN[1] = 0.0;
162 config->tcu_rangeN[2] = 0.0;
163 config->tcu_rangeD[0] = 1645.0;
164 config->tcu_rangeD[1] = 0.0;
165 config->tcu_rangeD[2] = 0.0;
166 config->tcu_rangeM2[0] = 864.0;
167 config->tcu_rangeM2[1] = 0.0;
168 config->tcu_rangeM2[2] = 0.0;
169 config->tcu_rangeM1[0] = 358.0;
170 config->tcu_rangeM1[1] = 0.0;
171 config->tcu_rangeM1[2] = 0.0;
172 config->tcu_rangePlus[0] = 0.0;
173 config->tcu_rangePlus[1] = 1.0;
174 config->tcu_rangePlus[2] = 0.0;
175 config->tcu_rangeMinus[0] = 0.0;
176 config->tcu_rangeMinus[1] = 0.0;
177 config->tcu_rangeMinus[2] = 1.0;
178 // Disable these states
179 config->tcu_rangeM[1] = 3.0;
180 config->tcu_rangeM3[1] = 3.0;
181 config->tcu_rangeLow[1] = 3.0;
182
183 // TCU Outputs
190 engineConfiguration->tcu_solenoid_mode[0] = OM_DEFAULT;
192 engineConfiguration->tcu_solenoid_mode[1] = OM_DEFAULT;
193 // Reverse
194 config->tcuSolenoidTable[0][0] = 1;
195 config->tcuSolenoidTable[1][0] = 0;
196 // Neutral
197 config->tcuSolenoidTable[0][1] = 1;
198 config->tcuSolenoidTable[1][1] = 0;
199 // 1
200 config->tcuSolenoidTable[0][2] = 1;
201 config->tcuSolenoidTable[1][2] = 0;
202 // 2
203 config->tcuSolenoidTable[0][3] = 0;
204 config->tcuSolenoidTable[1][3] = 0;
205 // 3
206 config->tcuSolenoidTable[0][4] = 0;
207 config->tcuSolenoidTable[1][4] = 1;
208 // 4
209 config->tcuSolenoidTable[0][5] = 1;
210 config->tcuSolenoidTable[1][5] = 1;
211
212 // Pressure Control
213 config->tcu_pcAirmassBins[0] = 50.0;
214 config->tcu_pcAirmassBins[1] = 110.0;
215 config->tcu_pcAirmassBins[2] = 220.0;
216 config->tcu_pcAirmassBins[3] = 350.0;
217 config->tcu_pcAirmassBins[4] = 500.0;
218 config->tcu_pcAirmassBins[5] = 750.0;
219 config->tcu_pcAirmassBins[6] = 900.0;
220 config->tcu_pcAirmassBins[7] = 1000.0;
221 config->tcu_pcValsR[0] = 40.0;
222 config->tcu_pcValsR[1] = 35.0;
223 config->tcu_pcValsR[2] = 30.0;
224 config->tcu_pcValsR[3] = 30.0;
225 config->tcu_pcValsR[4] = 30.0;
226 config->tcu_pcValsR[5] = 25.0;
227 config->tcu_pcValsR[6] = 10.0;
228 config->tcu_pcValsR[7] = 10.0;
229 config->tcu_pcValsN[0] = 40.0;
230 config->tcu_pcValsN[1] = 35.0;
231 config->tcu_pcValsN[2] = 30.0;
232 config->tcu_pcValsN[3] = 30.0;
233 config->tcu_pcValsN[4] = 30.0;
234 config->tcu_pcValsN[5] = 25.0;
235 config->tcu_pcValsN[6] = 10.0;
236 config->tcu_pcValsN[7] = 10.0;
237 config->tcu_pcVals1[0] = 40.0;
238 config->tcu_pcVals1[1] = 35.0;
239 config->tcu_pcVals1[2] = 30.0;
240 config->tcu_pcVals1[3] = 30.0;
241 config->tcu_pcVals1[4] = 30.0;
242 config->tcu_pcVals1[5] = 25.0;
243 config->tcu_pcVals1[6] = 10.0;
244 config->tcu_pcVals1[7] = 10.0;
245 config->tcu_pcVals2[0] = 40.0;
246 config->tcu_pcVals2[1] = 35.0;
247 config->tcu_pcVals2[2] = 30.0;
248 config->tcu_pcVals2[3] = 30.0;
249 config->tcu_pcVals2[4] = 30.0;
250 config->tcu_pcVals2[5] = 25.0;
251 config->tcu_pcVals2[6] = 10.0;
252 config->tcu_pcVals2[7] = 10.0;
253 config->tcu_pcVals3[0] = 40.0;
254 config->tcu_pcVals3[1] = 35.0;
255 config->tcu_pcVals3[2] = 30.0;
256 config->tcu_pcVals3[3] = 30.0;
257 config->tcu_pcVals3[4] = 30.0;
258 config->tcu_pcVals3[5] = 25.0;
259 config->tcu_pcVals3[6] = 10.0;
260 config->tcu_pcVals3[7] = 10.0;
261 config->tcu_pcVals4[0] = 40.0;
262 config->tcu_pcVals4[1] = 35.0;
263 config->tcu_pcVals4[2] = 30.0;
264 config->tcu_pcVals4[3] = 30.0;
265 config->tcu_pcVals4[4] = 30.0;
266 config->tcu_pcVals4[5] = 25.0;
267 config->tcu_pcVals4[6] = 10.0;
268 config->tcu_pcVals4[7] = 10.0;
269 config->tcu_pcVals12[0] = 80.0;
270 config->tcu_pcVals12[1] = 60.0;
271 config->tcu_pcVals12[2] = 50.0;
272 config->tcu_pcVals12[3] = 44.0;
273 config->tcu_pcVals12[4] = 40.0;
274 config->tcu_pcVals12[5] = 20.0;
275 config->tcu_pcVals12[6] = 10.0;
276 config->tcu_pcVals12[7] = 10.0;
277 config->tcu_pcVals23[0] = 45.0;
278 config->tcu_pcVals23[1] = 40.0;
279 config->tcu_pcVals23[2] = 35.0;
280 config->tcu_pcVals23[3] = 30.0;
281 config->tcu_pcVals23[4] = 35.0;
282 config->tcu_pcVals23[5] = 15.0;
283 config->tcu_pcVals23[6] = 10.0;
284 config->tcu_pcVals23[7] = 10.0;
285 config->tcu_pcVals34[0] = 35.0;
286 config->tcu_pcVals34[1] = 32.0;
287 config->tcu_pcVals34[2] = 30.0;
288 config->tcu_pcVals34[3] = 38.0;
289 config->tcu_pcVals34[4] = 25.0;
290 config->tcu_pcVals34[5] = 15.0;
291 config->tcu_pcVals34[6] = 10.0;
292 config->tcu_pcVals34[7] = 10.0;
293 config->tcu_pcVals21[0] = 60.0;
294 config->tcu_pcVals21[1] = 55.0;
295 config->tcu_pcVals21[2] = 50.0;
296 config->tcu_pcVals21[3] = 45.0;
297 config->tcu_pcVals21[4] = 40.0;
298 config->tcu_pcVals21[5] = 35.0;
299 config->tcu_pcVals21[6] = 30.0;
300 config->tcu_pcVals21[7] = 30.0;
301 config->tcu_pcVals32[0] = 60.0;
302 config->tcu_pcVals32[1] = 55.0;
303 config->tcu_pcVals32[2] = 50.0;
304 config->tcu_pcVals32[3] = 45.0;
305 config->tcu_pcVals32[4] = 40.0;
306 config->tcu_pcVals32[5] = 35.0;
307 config->tcu_pcVals32[6] = 30.0;
308 config->tcu_pcVals32[7] = 30.0;
309 config->tcu_pcVals43[0] = 60.0;
310 config->tcu_pcVals43[1] = 55.0;
311 config->tcu_pcVals43[2] = 50.0;
312 config->tcu_pcVals43[3] = 45.0;
313 config->tcu_pcVals43[4] = 40.0;
314 config->tcu_pcVals43[5] = 35.0;
315 config->tcu_pcVals43[6] = 30.0;
316 config->tcu_pcVals43[7] = 30.0;
317
318 // TCC Control
319 config->tcu_tccTpsBins[0] = 11.0;
320 config->tcu_tccTpsBins[1] = 22.0;
321 config->tcu_tccTpsBins[2] = 33.0;
322 config->tcu_tccTpsBins[3] = 44.0;
323 config->tcu_tccTpsBins[4] = 55.0;
324 config->tcu_tccTpsBins[5] = 66.0;
325 config->tcu_tccTpsBins[6] = 77.0;
326 config->tcu_tccTpsBins[7] = 88.0;
327 config->tcu_tccLockSpeed[0] = 40.0;
328 config->tcu_tccLockSpeed[1] = 45.0;
329 config->tcu_tccLockSpeed[2] = 52.0;
330 config->tcu_tccLockSpeed[3] = 60.0;
331 config->tcu_tccLockSpeed[4] = 70.0;
332 config->tcu_tccLockSpeed[5] = 83.0;
333 config->tcu_tccLockSpeed[6] = 97.0;
334 config->tcu_tccLockSpeed[7] = 115.0;
335 config->tcu_tccUnlockSpeed[0] = 30.0;
336 config->tcu_tccUnlockSpeed[1] = 35.0;
337 config->tcu_tccUnlockSpeed[2] = 41.0;
338 config->tcu_tccUnlockSpeed[3] = 49.0;
339 config->tcu_tccUnlockSpeed[4] = 53.0;
340 config->tcu_tccUnlockSpeed[5] = 67.0;
341 config->tcu_tccUnlockSpeed[6] = 78.0;
342 config->tcu_tccUnlockSpeed[7] = 93.0;
343
344 // Shift Config
345 config->tcu_shiftTime = 600.0;
346 config->tcu_shiftTpsBins[0] = 11.0;
347 config->tcu_shiftTpsBins[1] = 22.0;
348 config->tcu_shiftTpsBins[2] = 33.0;
349 config->tcu_shiftTpsBins[3] = 44.0;
350 config->tcu_shiftTpsBins[4] = 55.0;
351 config->tcu_shiftTpsBins[5] = 67.0;
352 config->tcu_shiftTpsBins[6] = 76.0;
353 config->tcu_shiftTpsBins[7] = 88.0;
354 config->tcu_shiftSpeed12[0] = 10.0;
355 config->tcu_shiftSpeed12[1] = 12.0;
356 config->tcu_shiftSpeed12[2] = 16.0;
357 config->tcu_shiftSpeed12[3] = 23.0;
358 config->tcu_shiftSpeed12[4] = 28.0;
359 config->tcu_shiftSpeed12[5] = 32.0;
360 config->tcu_shiftSpeed12[6] = 38.0;
361 config->tcu_shiftSpeed12[7] = 42.0;
362 config->tcu_shiftSpeed23[0] = 20.0;
363 config->tcu_shiftSpeed23[1] = 25.0;
364 config->tcu_shiftSpeed23[2] = 31.0;
365 config->tcu_shiftSpeed23[3] = 37.0;
366 config->tcu_shiftSpeed23[4] = 45.0;
367 config->tcu_shiftSpeed23[5] = 55.0;
368 config->tcu_shiftSpeed23[6] = 63.0;
369 config->tcu_shiftSpeed23[7] = 72.0;
370 config->tcu_shiftSpeed34[0] = 35.0;
371 config->tcu_shiftSpeed34[1] = 40.0;
372 config->tcu_shiftSpeed34[2] = 47.0;
373 config->tcu_shiftSpeed34[3] = 55.0;
374 config->tcu_shiftSpeed34[4] = 65.0;
375 config->tcu_shiftSpeed34[5] = 78.0;
376 config->tcu_shiftSpeed34[6] = 92.0;
377 config->tcu_shiftSpeed34[7] = 110.0;
378 config->tcu_shiftSpeed21[0] = 5.0;
379 config->tcu_shiftSpeed21[1] = 7.0;
380 config->tcu_shiftSpeed21[2] = 11.0;
381 config->tcu_shiftSpeed21[3] = 17.0;
382 config->tcu_shiftSpeed21[4] = 20.0;
383 config->tcu_shiftSpeed21[5] = 23.0;
384 config->tcu_shiftSpeed21[6] = 26.0;
385 config->tcu_shiftSpeed21[7] = 32.0;
386 config->tcu_shiftSpeed32[0] = 10.0;
387 config->tcu_shiftSpeed32[1] = 13.0;
388 config->tcu_shiftSpeed32[2] = 21.0;
389 config->tcu_shiftSpeed32[3] = 30.0;
390 config->tcu_shiftSpeed32[4] = 35.0;
391 config->tcu_shiftSpeed32[5] = 45.0;
392 config->tcu_shiftSpeed32[6] = 50.0;
393 config->tcu_shiftSpeed32[7] = 55.0;
394 config->tcu_shiftSpeed43[0] = 25.0;
395 config->tcu_shiftSpeed43[1] = 30.0;
396 config->tcu_shiftSpeed43[2] = 36.0;
397 config->tcu_shiftSpeed43[3] = 44.0;
398 config->tcu_shiftSpeed43[4] = 48.0;
399 config->tcu_shiftSpeed43[5] = 62.0;
400 config->tcu_shiftSpeed43[6] = 73.0;
401 config->tcu_shiftSpeed43[7] = 88.0;
402}
403
404#endif // EFI_TCU
SingleTimerExecutor scheduler
Definition engine.h:271
EngineState engineState
Definition engine.h:344
OutputPin tcuPcSolenoid
Definition efi_gpio.h:135
OutputPin tcuTccOnoffSolenoid
Definition efi_gpio.h:133
float airflowEstimate
void setTccState(gear_e gear)
Definition tc_4.cpp:46
void setPcState(gear_e gear)
Definition tc_4.cpp:76
void initPin(const char *msg, brain_pin_e brainPin, pin_output_mode_e outputMode, bool forceInitWithFatalError=false)
Definition efi_gpio.cpp:711
void setValue(const char *msg, int logicValue, bool isForce=false)
Definition efi_gpio.cpp:604
virtual SensorResult get() const =0
void setSimplePwmDutyCycle(float dutyCycle) override
virtual gear_e getCurrentGear() const
Definition tcu.cpp:26
void measureShiftTime(gear_e)
Definition tcu.cpp:42
virtual gear_e setCurrentGear(gear_e)
Definition tcu.cpp:21
EnginePins enginePins
Definition efi_gpio.cpp:24
static EngineAccessor engine
Definition engine.h:413
static constexpr persistent_config_s * config
static constexpr engine_configuration_s * engineConfiguration
void startSimplePwm(SimplePwm *state, const char *msg, Scheduler *executor, OutputPin *output, float frequency, float dutyCycle, pwm_gen_callback *callback)
gear_e
@ GEAR_2
@ REVERSE
@ GEAR_1
@ GEAR_4
@ NEUTRAL
@ GEAR_3
@ DriverThrottleIntent
scaled_channel< uint8_t, 1, 5 > tcu_pcAirmassBins[TCU_TABLE_WIDTH]
uint8_t tcuSolenoidTable[TCU_SOLENOID_COUNT][TCU_GEAR_COUNT]
scaled_channel< uint8_t, 1, 1 > tcu_shiftTpsBins[TCU_TABLE_WIDTH]
Generic4TransmissionController generic4TransmissionController
Definition tc_4.cpp:6
Generic4TransmissionController * getGeneric4TransmissionController()
Definition tc_4.cpp:128
void configureTcu4R70W()
Definition tc_4.cpp:133
static SimplePwm pcPwm("Pressure Control")