From c638ab7deab39546326cd02c5a5167ab129767e0 Mon Sep 17 00:00:00 2001 From: albyfil88 Date: Sun, 7 Sep 2025 15:24:28 +0200 Subject: [PATCH] Added pop-off and corrected little issues - Corrected streaming data's format in readme file: from this: (mapCorrected,vntTargetPressure,vntPositionRemapped,tpsCorrected,rpmActual,pidOutput,n75precontrol,vntMinDc,vntMaxDc,mode,targetRatioKp,targetRatioKi,targetRatioKd,boostCalculatedP,boostCalculatedI,boostCalculatedD,temp1,auxOutput,millis( / 10)) to this: (mapCorrected,vntTargetPressure,vntPositionRemapped,tpsCorrected,rpmActual,temp1,boostCalculatedP,boostCalculatedI,boostCalculatedD,pidOutput,n75precontrol,vntMinDc,vntMaxDc,rpmCorrected,mode,auxOutput,millis( / 10)) - Added pop-off to sketch: The pop-off follows this logic: when I exceed a certain TPS value, the pop-off system is armed. If I drop below a certain TPS value, within a certain time limit, at a certain minimum MAP value, the pop-off (output #10) is activated for a certain amount of time. All the times and values is configurable in sketch. I tried my best to integrate everything into the code as best as possible. I'm not an Arduino code expert, so I used AI to generate the code and figure out where to insert it best. I'd be very happy if you could check and confirm that everything is OK. You can easily find the parts I added because they are delimited by this: "//POP_OFF". The pop-off in a diesel engine is usually unnecessary, but it could be an interesting addition if you happen to have problems with turbo surging, fluttering, or simply if you want a cool pop-off in your diesel car! --- README | 9 +++++- vnt_lda_myPID.ino | 75 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/README b/README index 26e084a..b8013cc 100644 --- a/README +++ b/README @@ -40,7 +40,7 @@ Logging The system can stream live data via the serial port for logging purposes. Press the '#' key while connected via serial and the system will start streaming data in this format: -mapCorrected,vntTargetPressure,vntPositionRemapped,tpsCorrected,rpmActual,pidOutput,n75precontrol,vntMinDc,vntMaxDc,mode,targetRatioKp,targetRatioKi,targetRatioKd,boostCalculatedP,boostCalculatedI,boostCalculatedD,temp1,auxOutput,millis( / 10) +mapCorrected,vntTargetPressure,vntPositionRemapped,tpsCorrected,rpmActual,temp1,boostCalculatedP,boostCalculatedI,boostCalculatedD,pidOutput,n75precontrol,vntMinDc,vntMaxDc,rpmCorrected,mode,auxOutput,millis( / 10) The output data can be captured with a tool like 'screen' and logged to disk. It can then be opened directly in a spreadsheet program like LibreOffice or Excel for graphing purposes. @@ -66,3 +66,10 @@ To set the baud rate on a fresh serial backpack plug it in via USB. USB doesn't # echo -e "\xFE\x39\x08" > /dev/ttyACM0 The baud rate setting is stored on the LCD's EEPROM and will be briefly displayed at startup allowing you to verify the setting was saved successfully. + +Pop-Off +========= + +The pop-off follows this logic: when I exceed a certain TPS value, the pop-off system is armed. If I drop below a certain TPS value, within a certain time limit, at a certain minimum MAP value, the pop-off (output #10) is activated for a certain amount of time. +All the times and values is configurable in sketch. +The pop-off in a diesel engine is usually unnecessary, but it could be an interesting addition if you happen to have problems with turbo surging, fluttering, or simply if you want a cool pop-off in your diesel car! \ No newline at end of file diff --git a/vnt_lda_myPID.ino b/vnt_lda_myPID.ino index 020b4b0..d0b1f61 100644 --- a/vnt_lda_myPID.ino +++ b/vnt_lda_myPID.ino @@ -32,6 +32,9 @@ const unsigned char versionString[] PROGMEM = "DMN-Vanbcguy Boost Ctrl v3.2.3"; #define PIN_LCD 8 +// POP_OFF Pin +#define PIN_POP_OFF 10 + #define LCD_BAUD_RATE 115200 // Pins for the EGT MAX31855 @@ -43,6 +46,19 @@ ResponsiveAnalogRead map_read(PIN_MAP, false); // no sleep on the MAP read; nee ResponsiveAnalogRead tps_read(PIN_TPS, true); ResponsiveAnalogRead rpm_read(0, true); +// POP_OFF Configuration +#define POP_OFF_ACTIVATION_TPS 800 // TPS must exceed this value to arm pop-off +#define POP_OFF_RELEASE_TPS 400 // TPS must be released below this value to activate pop-off +#define POP_OFF_RELEASE_TIME 1000 // maximum time (ms) to release TPS +#define POP_OFF_BLOW_TIME 300 // pop-off length (ms) +#define POP_OFF_MIN_BOOST 100 // minimum MAP value at which pop-off is permitted + +// POP_OFF Variables +bool popOffArmed = false; +unsigned long tpsReleaseStartTime = 0; +unsigned long popOffStartTime = 0; +bool popOffBlowing = false; + // Set up the LCD pin SoftwareSerial lcd = SoftwareSerial(0, PIN_LCD); @@ -507,6 +523,10 @@ void setup() { digitalWrite(PIN_TPS, LOW); // safety unconnected TPS digitalWrite(PIN_MAP, HIGH); // safety unconnected MAP + // POP_OFF Pin + pinMode(PIN_POP_OFF, OUTPUT); + digitalWrite(PIN_POP_OFF, LOW); + // clear screen lcd.write(0xFE); lcd.write(0x58); @@ -1189,9 +1209,18 @@ unsigned int execTimeRead = 0; unsigned int execTimeAct = 0; unsigned int execTimeLcd = 0; +// streaming data's values void pageDataLogger(char key) { Serial.print(toKpaMAP(controls.mapCorrected), DEC); Serial.print(F(",")); + + + + + + + + Serial.print(toKpaMAP(controls.vntTargetPressure), DEC); Serial.print(F(",")); Serial.print(controls.vntPositionRemapped, DEC); @@ -1894,12 +1923,10 @@ void displayPage(char page, char data) { case 3: pageMapEditor(0, data); visualizeActuator(28); - break; case 4: pageMapEditor(1, data); visualizeActuator(28); - break; case 5: pageMapEditor(2, data); @@ -1938,6 +1965,34 @@ unsigned long mapLoop = 0; void loop() { +//POP-OFF Loop + if (popOffBlowing) { + if (millis() - popOffStartTime >= POP_OFF_BLOW_TIME) { + digitalWrite(PIN_POP_OFF, LOW); + popOffBlowing = false; + } + } else { + if (tps_read.getValue() > POP_OFF_ACTIVATION_TPS) { + popOffArmed = true; + tpsReleaseStartTime = 0; + } + + if (popOffArmed && tps_read.getValue() < POP_OFF_ACTIVATION_TPS && tpsReleaseStartTime == 0) { + tpsReleaseStartTime = millis(); + } + + bool tpsIsReleased = (tps_read.getValue() < POP_OFF_RELEASE_TPS); + bool releaseIsFast = (tpsReleaseStartTime != 0 && (millis() - tpsReleaseStartTime < POP_OFF_RELEASE_TIME)); + bool turboHasBoost = (map_read.getValue() > POP_OFF_MIN_BOOST); + + if (popOffArmed && tpsIsReleased && releaseIsFast && turboHasBoost) { + digitalWrite(PIN_POP_OFF, HIGH); + popOffBlowing = true; + popOffArmed = false; + popOffStartTime = millis(); + } + } + if ((millis() - mapLoop) >= MAP_DELAY) { readValuesMap(); // Read every loop; we're calculating an average to clean up noise. mapLoop = millis(); @@ -2028,18 +2083,4 @@ void loop() { displayLoop = millis(); execTimeLcd = displayLoop - execTimeLcd; } -} - - - - - - - - - - - - - - +} \ No newline at end of file