fome-fw/firmware/controllers/trigger/decoders/trigger_nissan.cpp

257 lines
6.4 KiB
C++
Raw Normal View History

2015-09-19 16:01:46 -07:00
/**
* @file trigger_nissan.cpp
*
2017-12-31 17:13:20 -08:00
* https://rusefi.com/forum/viewtopic.php?f=3&t=1194&start=150#p27784
*
2015-09-19 16:01:46 -07:00
* @date Sep 19, 2015
2020-01-13 18:57:43 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-09-19 16:01:46 -07:00
*/
#include "trigger_nissan.h"
2017-04-02 14:59:01 -07:00
#include "trigger_universal.h"
2015-09-19 16:01:46 -07:00
2017-12-31 17:13:20 -08:00
/**
* 8,2,2,2 Nissan pattern
*/
static void initializeNissanSR20VE_4_optional_360(TriggerWaveform *s, bool with2nd) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
2017-03-18 17:59:52 -07:00
s->gapBothDirections = true;
2017-04-02 14:36:59 -07:00
s->useOnlyPrimaryForSync = true;
2015-09-19 17:01:38 -07:00
2017-03-22 08:39:20 -07:00
s->tdcPosition = 630;
2018-01-01 19:24:33 -08:00
float width = 4;
2017-03-22 04:07:02 -07:00
s->setTriggerSynchronizationGap2(9.67 * 0.75, 16);
2015-09-19 17:01:38 -07:00
2017-04-02 14:59:01 -07:00
float left = 0;
float right;
int total = 360; // 360 on cam, over 720 crank degree
2015-09-19 17:01:38 -07:00
float base = 180;
2018-01-01 19:24:33 -08:00
right = base - 4 * width;
2017-04-02 14:59:01 -07:00
if (with2nd) {
2017-04-02 15:12:51 -07:00
addSkippedToothTriggerEvents(T_SECONDARY, s, total, 0, 0.5, 0, 720,
2018-12-25 16:42:27 -08:00
left, right);
2017-04-02 14:59:01 -07:00
}
2018-12-25 08:51:49 -08:00
s->addEvent720(right, T_PRIMARY, TV_RISE);
2017-04-02 14:59:01 -07:00
2017-04-02 15:12:51 -07:00
left = right;
2017-04-02 14:59:01 -07:00
right = base;
2017-04-02 15:12:51 -07:00
if (with2nd) {
2017-04-02 15:14:30 -07:00
addSkippedToothTriggerEvents(T_SECONDARY, s, total, 0, 0.5, 0, 720,
2018-12-25 16:42:27 -08:00
left, right);
2017-04-02 15:12:51 -07:00
}
2018-12-25 08:51:49 -08:00
s->addEvent720(right, T_PRIMARY, TV_FALL);
2015-09-19 17:01:38 -07:00
2015-12-28 15:01:45 -08:00
// was is the the one with 360 opto sensor?
2015-09-19 17:01:38 -07:00
base += 180;
2017-04-02 15:12:51 -07:00
left = right;
2018-01-01 19:24:33 -08:00
right = base - width;
2017-04-02 15:12:51 -07:00
if (with2nd) {
// addSkippedToothTriggerEvents(T_SECONDARY, s, total, 0, 0.5, 0, 720,
// left, right);
2017-04-02 15:12:51 -07:00
}
2018-12-25 08:51:49 -08:00
s->addEvent720(right, T_PRIMARY, TV_RISE);
2017-04-02 15:12:51 -07:00
left = right;
right = base;
if (with2nd) {
// addSkippedToothTriggerEvents(T_SECONDARY, s, total, 0, 0.5, 0, 720,
// left, right);
2017-04-02 15:12:51 -07:00
}
2018-12-25 08:51:49 -08:00
s->addEvent720(right, T_PRIMARY, TV_FALL);
2017-03-18 17:18:21 -07:00
2015-09-19 17:01:38 -07:00
base += 180;
2017-04-02 15:12:51 -07:00
left = right;
2018-01-01 19:24:33 -08:00
right = base - width;
2017-04-02 15:12:51 -07:00
if (with2nd) {
// addSkippedToothTriggerEvents(T_SECONDARY, s, total, 0, 0.5, 0, 720,
// left, right);
2017-04-02 15:12:51 -07:00
}
2018-12-25 08:51:49 -08:00
s->addEvent720(right, T_PRIMARY, TV_RISE);
2017-04-02 15:12:51 -07:00
left = right;
right = base;
if (with2nd) {
// addSkippedToothTriggerEvents(T_SECONDARY, s, total, 0, 0.5, 0, 720,
// left, right);
2017-04-02 15:12:51 -07:00
}
2018-12-25 08:51:49 -08:00
s->addEvent720(right, T_PRIMARY, TV_FALL);
2015-09-19 17:01:38 -07:00
2017-03-18 17:18:21 -07:00
base += 180;
2017-04-02 15:12:51 -07:00
left = right;
2018-01-01 19:24:33 -08:00
right = base - width;
2017-04-02 14:36:59 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(right, T_PRIMARY, TV_RISE);
2017-04-02 15:12:51 -07:00
left = right;
right = base;
2018-12-25 08:51:49 -08:00
s->addEvent720(right, T_PRIMARY, TV_FALL);
2015-09-19 16:01:46 -07:00
}
2017-03-22 19:53:10 -07:00
2017-04-02 14:36:59 -07:00
/**
* Nissan Primera p11 year 1995-2002
*/
void initializeNissanSR20VE_4(TriggerWaveform *s) {
2018-12-25 17:09:35 -08:00
initializeNissanSR20VE_4_optional_360(s, false);
2017-04-02 14:36:59 -07:00
}
void initializeNissanSR20VE_4_360(TriggerWaveform *s) {
2018-12-25 17:09:35 -08:00
initializeNissanSR20VE_4_optional_360(s, true);
2017-03-22 19:53:10 -07:00
}
2021-07-01 18:48:14 -07:00
static void addPrimaryToothEndingAt(TriggerWaveform *s, float fallAngle) {
int vvtWidth = 20;
s->addEventAngle(fallAngle - vvtWidth, T_PRIMARY, TV_RISE);
s->addEventAngle(fallAngle, T_PRIMARY, TV_FALL);
}
void initializeNissanVQvvt(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
int offset = 720 - 520;
addPrimaryToothEndingAt(s, offset + 40);
addPrimaryToothEndingAt(s, offset + 160);
addPrimaryToothEndingAt(s, offset + 200);
addPrimaryToothEndingAt(s, offset + 280);
2021-07-01 19:10:37 -07:00
addPrimaryToothEndingAt(s, offset + 320);
addPrimaryToothEndingAt(s, offset + 520);
2021-07-01 18:48:14 -07:00
2021-07-01 19:10:37 -07:00
s->setTriggerSynchronizationGap(5);
}
2021-07-01 18:48:14 -07:00
void makeNissanPattern(TriggerWaveform* s, size_t halfCylinderCount, size_t totalWheel, size_t missing) {
2021-07-01 19:10:37 -07:00
s->setTriggerSynchronizationGap(0.33);
2021-07-01 18:48:14 -07:00
auto toothAngle = 360.0f / totalWheel;
2021-07-01 20:53:53 -07:00
auto patternTeeth = totalWheel / halfCylinderCount;
auto toothCount = patternTeeth - missing;
float currentAngle = missing * toothAngle;
for (int i = 0; i < toothCount; i++) {
currentAngle += toothAngle;
2021-07-01 19:10:37 -07:00
s->addEventAngle(currentAngle - 5, T_PRIMARY, TV_RISE);
s->addEventAngle(currentAngle, T_PRIMARY, TV_FALL);
}
2021-07-01 18:48:14 -07:00
}
void initializeNissanVQ35crank(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_THREE_TIMES_CRANK_SENSOR);
s->tdcPosition = 675;
// 6 cylinder = 36 tooth wheel, missing 2 teeth in 3 spots
makeNissanPattern(s, 3, 36, 2);
}
void initializeNissanMR18crank(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR);
s->tdcPosition = 640;
// 4 cylinder = 36 tooth wheel, missing 2 teeth in 2 spots
makeNissanPattern(s, 2, 36, 2);
}
void initializeNissanQR25crank(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR);
s->setTriggerSynchronizationGap(0.33);
s->setSecondTriggerSynchronizationGap(3);
s->tdcPosition = 585;
float currentAngle = 20;
for (int i = 0;i < 16;i++) {
currentAngle += 10;
s->addEventAngle(currentAngle - 5, T_PRIMARY, TV_RISE);
s->addEventAngle(currentAngle, T_PRIMARY, TV_FALL);
}
}
static void addvq30tooth(TriggerWaveform *s, float angle) {
s->addEvent360(angle - 4, T_PRIMARY, TV_RISE);
s->addEvent360(angle, T_PRIMARY, TV_FALL);
}
void initializeNissanVQ30cam(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
s->tdcPosition = 00;
int x = 360 + 52;
addvq30tooth(s, x - (360 - 9 * 0));
addvq30tooth(s, x - (360 - 9 * 1));
addvq30tooth(s, x - (360 - 9 * 2));
addvq30tooth(s, x - (252 + 9 * 5));
addvq30tooth(s, x - (252 + 9 * 4));
addvq30tooth(s, x - (252 + 9 * 3));
addvq30tooth(s, x - (252 + 9 * 2));
addvq30tooth(s, x - (252 + 9 * 1));
addvq30tooth(s, x - (252 + 9 * 0));
addvq30tooth(s, x - (236 ));
addvq30tooth(s, x - (152 + 9 * 3));
addvq30tooth(s, x - (152 + 9 * 2));
addvq30tooth(s, x - (152 + 9 * 1));
addvq30tooth(s, x - (152 + 9 * 0));
addvq30tooth(s, x - (85 + 9 * 4));
addvq30tooth(s, x - (85 + 9 * 3));
addvq30tooth(s, x - (85 + 9 * 2));
addvq30tooth(s, x - (85 + 9 * 1));
addvq30tooth(s, x - (85 + 9 * 0));
addvq30tooth(s, x - (52 + 9 * 1));
addvq30tooth(s, x - (52 + 9 * 0));
s->setTriggerSynchronizationGap3(/*gapIndex*/0, 5.78 * TRIGGER_GAP_DEVIATION_LOW, 5.78 * TRIGGER_GAP_DEVIATION_HIGH);
s->setTriggerSynchronizationGap3(/*gapIndex*/1, 0.38 * TRIGGER_GAP_DEVIATION_LOW, 0.38 * TRIGGER_GAP_DEVIATION_HIGH);
s->setTriggerSynchronizationGap3(/*gapIndex*/2, 2.67 * TRIGGER_GAP_DEVIATION_LOW, 2.67 * TRIGGER_GAP_DEVIATION_HIGH);
}
void initializeNissanMRvvt(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
s->tdcPosition = 0;
int x = 74;
// All "groups" start every 90 degrees of cam rotation
// The groups have 1, 3, 4, 2 teeth each (which is the firing order?)
// Teeth within a group are spaced 16 cam degrees apart
int toothSpacing = 16;
// "1"
addvq30tooth(s, x + 0);
// "3"
addvq30tooth(s, x + 90 + 0 * toothSpacing);
addvq30tooth(s, x + 90 + 1 * toothSpacing);
addvq30tooth(s, x + 90 + 2 * toothSpacing);
// "4"
addvq30tooth(s, x + 180 + 0 * toothSpacing);
addvq30tooth(s, x + 180 + 1 * toothSpacing);
addvq30tooth(s, x + 180 + 2 * toothSpacing);
addvq30tooth(s, x + 180 + 3 * toothSpacing);
// "2"
addvq30tooth(s, x + 270 + 0 * toothSpacing);
addvq30tooth(s, x + 270 + 1 * toothSpacing);
s->setTriggerSynchronizationGap(5.4);
}