Add Idle up output (#378)
Implement functionality to allow a defined output pin to toggle (normal or inverted) based on the idle up input pin. Co-authored-by: Josh Stewart <josh@noisymime.org>
This commit is contained in:
parent
60ffb92c45
commit
fe6f0c684a
|
@ -377,18 +377,23 @@ page = 1
|
||||||
;vssPullup = bits, U08, 102, [1:1], "Off", "On"
|
;vssPullup = bits, U08, 102, [1:1], "Off", "On"
|
||||||
vssPin = bits, U08, 102, [2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
|
vssPin = bits, U08, 102, [2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
|
||||||
vssPulsesPerKm= scalar, U16, 103, "pulses" 1.0, 0.0, 0.0, 25500, 0
|
vssPulsesPerKm= scalar, U16, 103, "pulses" 1.0, 0.0, 0.0, 25500, 0
|
||||||
vssSmoothing = scalar, U08, 105, "%", 1.0, 0, 0, 120, 0
|
vssSmoothing = scalar, U08, 105, "%", 1.0, 0, 0, 255, 0
|
||||||
vssRatio1 = scalar, U16, 106, "km/h per 1000rpm", 0.1, 0, 0, 299.9, 1
|
vssRatio1 = scalar, U16, 106, "km/h per 1000rpm", 0.1, 0, 0, 99.9, 1
|
||||||
vssRatio2 = scalar, U16, 108, "km/h per 1000rpm", 0.1, 0, 0, 299.9, 1
|
vssRatio2 = scalar, U16, 108, "km/h per 1000rpm", 0.1, 0, 0, 99.9, 1
|
||||||
vssRatio3 = scalar, U16, 110, "km/h per 1000rpm", 0.1, 0, 0, 299.9, 1
|
vssRatio3 = scalar, U16, 110, "km/h per 1000rpm", 0.1, 0, 0, 99.9, 1
|
||||||
vssRatio4 = scalar, U16, 112, "km/h per 1000rpm", 0.1, 0, 0, 299.9, 1
|
vssRatio4 = scalar, U16, 112, "km/h per 1000rpm", 0.1, 0, 0, 99.9, 1
|
||||||
vssRatio5 = scalar, U16, 114, "km/h per 1000rpm", 0.1, 0, 0, 299.9, 1
|
vssRatio5 = scalar, U16, 114, "km/h per 1000rpm", 0.1, 0, 0, 99.9, 1
|
||||||
vssRatio6 = scalar, U16, 116, "km/h per 1000rpm", 0.1, 0, 0, 299.9, 1
|
vssRatio6 = scalar, U16, 116, "km/h per 1000rpm", 0.1, 0, 0, 99.9, 1
|
||||||
|
|
||||||
|
;Idle up output (AC Fan) seettings
|
||||||
|
idleUpOutputEnabled = bits, U08, 118, [0:0], "Off", "On"
|
||||||
|
idleUpOutputInv = bits, U08, 118, [1:1], "No", "Yes"
|
||||||
|
idleUpOutputPin = bits, U08, 118, [2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
|
||||||
|
|
||||||
|
tachoSweepMaxRPM = scalar, U08, 119, "RPM", 100, 0.0, 100, 10000, 0
|
||||||
|
primingDelay = scalar, U08, 120, "S", 0.1, 0.0, 0.0, 25.5, 1
|
||||||
|
|
||||||
tachoSweepMaxRPM = scalar, U08, 118, "RPM", 100, 0.0, 100, 10000, 0
|
unused2-95 = array, U08, 121, [7], "%", 1.0, 0.0, 0.0, 255, 0
|
||||||
|
|
||||||
unused2-95 = array, U08, 119, [8], "%", 1.0, 0.0, 0.0, 255, 0
|
|
||||||
primingDelay = scalar, U08, 127, "S", 0.1, 0.0, 0.0, 25.5, 1
|
|
||||||
|
|
||||||
;Page 2 is the fuel map and axis bins only
|
;Page 2 is the fuel map and axis bins only
|
||||||
page = 2
|
page = 2
|
||||||
|
@ -1259,6 +1264,7 @@ page = 14
|
||||||
requiresPowerCycle = knock_trigger
|
requiresPowerCycle = knock_trigger
|
||||||
requiresPowerCycle = knock_pullup
|
requiresPowerCycle = knock_pullup
|
||||||
requiresPowerCycle = idleUpEnabled
|
requiresPowerCycle = idleUpEnabled
|
||||||
|
requiresPowerCycle = idleUpOutputEnabled
|
||||||
requiresPowerCycle = CTPSEnabled
|
requiresPowerCycle = CTPSEnabled
|
||||||
requiresPowerCycle = CTPSPin
|
requiresPowerCycle = CTPSPin
|
||||||
requiresPowerCycle = CTPSPolarity
|
requiresPowerCycle = CTPSPolarity
|
||||||
|
@ -1840,7 +1846,6 @@ menuDialog = main
|
||||||
iacChannels = "The number of output channels used for PWM valves. Select 1 for 2-wire valves or 2 for 3-wire valves."
|
iacChannels = "The number of output channels used for PWM valves. Select 1 for 2-wire valves or 2 for 3-wire valves."
|
||||||
iacStepTime = "Duration of each stepping pulse. Values that are too low can cause the motor to behave erratically or not at all. See the manual for suggested step times"
|
iacStepTime = "Duration of each stepping pulse. Values that are too low can cause the motor to behave erratically or not at all. See the manual for suggested step times"
|
||||||
iacCoolTime = "Cool time between each step. Set to zero if you don't want any cooling at all"
|
iacCoolTime = "Cool time between each step. Set to zero if you don't want any cooling at all"
|
||||||
|
|
||||||
iacStepHome = "Homing steps to perform on startup. Must be greater than the fully open steps value"
|
iacStepHome = "Homing steps to perform on startup. Must be greater than the fully open steps value"
|
||||||
iacMaxSteps = "Maximum number of steps the IAC can be moved away from the home position. Should always be less than Homing steps."
|
iacMaxSteps = "Maximum number of steps the IAC can be moved away from the home position. Should always be less than Homing steps."
|
||||||
iacStepHyster = "The minimum number of steps to move in any one go."
|
iacStepHyster = "The minimum number of steps to move in any one go."
|
||||||
|
@ -1850,6 +1855,8 @@ menuDialog = main
|
||||||
iacCLmaxDuty = "When using closed loop idle control, this is the maximum duty cycle that the PID loop will allow. Combined with the minimum value, this specifies the working range of your idle valve"
|
iacCLmaxDuty = "When using closed loop idle control, this is the maximum duty cycle that the PID loop will allow. Combined with the minimum value, this specifies the working range of your idle valve"
|
||||||
iacFastTemp = "Below this temperature, the idle output will be high (On). Above this temperature, it will turn off."
|
iacFastTemp = "Below this temperature, the idle output will be high (On). Above this temperature, it will turn off."
|
||||||
idleUpPolarity = "Normal polarity is a ground switch where an earthed signal activates the Idle Up. The internal pullup will be enabled with Normal polarity. \n Inverted may be used if a 5v signal is used to enable the Idle Up."
|
idleUpPolarity = "Normal polarity is a ground switch where an earthed signal activates the Idle Up. The internal pullup will be enabled with Normal polarity. \n Inverted may be used if a 5v signal is used to enable the Idle Up."
|
||||||
|
idleUpOutputEnabled = "Enable an output that is toggled by the idle up input pin. An example use is driving an AC fan relay."
|
||||||
|
idleUpOutputInv = "No = When the idle up pin is high the output is active (grounding), when the idle up pin is low the output is inactive. Yes = When the idle up pin is high the output is inactive, when the idle up pin is low the output is active (grounding)."
|
||||||
CTPSPolarity = "Normal polarity is a ground switch where an earthed signal activates the closed throttle position. The internal pullup will be enabled with Normal polarity. \n Inverted may be used if a 5v signal is used to enable the closed throttle position."
|
CTPSPolarity = "Normal polarity is a ground switch where an earthed signal activates the closed throttle position. The internal pullup will be enabled with Normal polarity. \n Inverted may be used if a 5v signal is used to enable the closed throttle position."
|
||||||
idleUpAdder = "The amount (In either Duty Cycle % or Steps (Depending on the idle control method in use), that the idle control will increase by when Idle Up is active"
|
idleUpAdder = "The amount (In either Duty Cycle % or Steps (Depending on the idle control method in use), that the idle control will increase by when Idle Up is active"
|
||||||
idleAdvEnabled = "Added setting adds curve values to current spark table values when user defined idle is active. \n Switched setting overrides spark table values and uses curve values for idle ignition timing."
|
idleAdvEnabled = "Added setting adds curve values to current spark table values when user defined idle is active. \n Switched setting overrides spark table values and uses curve values for idle ignition timing."
|
||||||
|
@ -2385,11 +2392,20 @@ menuDialog = main
|
||||||
panel = stepper_idle
|
panel = stepper_idle
|
||||||
panel = closedloop_idle
|
panel = closedloop_idle
|
||||||
|
|
||||||
|
dialog = idleUpInputSettingsPanel, "Idle Up Input Settings", yAxis
|
||||||
|
field = "Idle Up Enabled", idleUpEnabled
|
||||||
|
field = "Idle Up Pin", idleUpPin, { idleUpEnabled }
|
||||||
|
field = "Idle Up Pin Polarity", idleUpPolarity, { idleUpEnabled }
|
||||||
|
field = "Idle Up Amount", idleUpAdder, { idleUpEnabled }
|
||||||
|
|
||||||
|
dialog = idleUpOutputSettingsPanel, "Idle Up Output Settings", yAxis
|
||||||
|
field = "Idle Up Output Enabled", idleUpOutputEnabled, { idleUpEnabled }
|
||||||
|
field = "Idle Up Output Inverted", idleUpOutputInv, { idleUpEnabled && idleUpOutputEnabled
|
||||||
|
field = "Idle Up Output Pin", idleUpOutputPin, { idleUpEnabled && idleUpOutputEnabled }
|
||||||
|
|
||||||
dialog = idleUpSettings, "Idle Up Settings"
|
dialog = idleUpSettings, "Idle Up Settings"
|
||||||
field = "Idle Up Enabled", idleUpEnabled
|
panel = idleUpInputSettingsPanel
|
||||||
field = "Idle Up Pin", idleUpPin, { idleUpEnabled }
|
panel = idleUpOutputSettingsPanel
|
||||||
field = "Idle Up Pin Polarity", idleUpPolarity, { idleUpEnabled }
|
|
||||||
field = "Idle Up Amount", idleUpAdder, { idleUpEnabled }
|
|
||||||
|
|
||||||
dialog = fuelpump, "Fuel pump"
|
dialog = fuelpump, "Fuel pump"
|
||||||
field = "Fuel pump pin", fuelPumpPin
|
field = "Fuel pump pin", fuelPumpPin
|
||||||
|
@ -3480,6 +3496,7 @@ menuDialog = main
|
||||||
displayOnlyField = "fanPin", fanPin, {fanEnable}
|
displayOnlyField = "fanPin", fanPin, {fanEnable}
|
||||||
displayOnlyField = "tachoPin", tachoPin, {tachoDuration}
|
displayOnlyField = "tachoPin", tachoPin, {tachoDuration}
|
||||||
displayOnlyField = "idleUpPin", idleUpPin, {idleUpEnabled}
|
displayOnlyField = "idleUpPin", idleUpPin, {idleUpEnabled}
|
||||||
|
displayOnlyField = "idleUpOutputPin", idleUpOutputPin, {idleUpEnabled && idleUpOutputEnabled}
|
||||||
displayOnlyField = "launchPin", launchPin, {launchEnable}
|
displayOnlyField = "launchPin", launchPin, {launchEnable}
|
||||||
displayOnlyField = "vvt1Pin", vvt1Pin, {vvtEnabled}
|
displayOnlyField = "vvt1Pin", vvt1Pin, {vvtEnabled}
|
||||||
displayOnlyField = "vssPin", vssPin, {vssMode > 1}
|
displayOnlyField = "vssPin", vssPin, {vssMode > 1}
|
||||||
|
|
|
@ -620,6 +620,7 @@ struct statuses {
|
||||||
uint16_t injAngle;
|
uint16_t injAngle;
|
||||||
byte ASEValue;
|
byte ASEValue;
|
||||||
uint16_t vss; /**< Current speed reading. Natively stored in kph and converted to mph in TS if required */
|
uint16_t vss; /**< Current speed reading. Natively stored in kph and converted to mph in TS if required */
|
||||||
|
bool idleUpOutputActive; /**< Whether the idle up output is currently active */
|
||||||
byte gear; /**< Current gear (Calculated from vss) */
|
byte gear; /**< Current gear (Calculated from vss) */
|
||||||
byte fuelPressure; /**< Fuel pressure in PSI */
|
byte fuelPressure; /**< Fuel pressure in PSI */
|
||||||
byte oilPressure; /**< Oil pressure in PSI */
|
byte oilPressure; /**< Oil pressure in PSI */
|
||||||
|
@ -777,8 +778,14 @@ struct config2 {
|
||||||
uint16_t vssRatio5;
|
uint16_t vssRatio5;
|
||||||
uint16_t vssRatio6;
|
uint16_t vssRatio6;
|
||||||
|
|
||||||
byte unused2_95[9];
|
byte idleUpOutputEnabled : 1;
|
||||||
|
byte idleUpOutputInv : 1;
|
||||||
|
byte idleUpOutputPin : 6;
|
||||||
|
|
||||||
|
byte tachoSweepMaxRPM;
|
||||||
byte primingDelay;
|
byte primingDelay;
|
||||||
|
|
||||||
|
byte unused2_95[7];
|
||||||
|
|
||||||
#if defined(CORE_AVR)
|
#if defined(CORE_AVR)
|
||||||
};
|
};
|
||||||
|
@ -1303,6 +1310,7 @@ extern byte pinFuelPump; //Fuel pump on/off
|
||||||
extern byte pinIdle1; //Single wire idle control
|
extern byte pinIdle1; //Single wire idle control
|
||||||
extern byte pinIdle2; //2 wire idle control (Not currently used)
|
extern byte pinIdle2; //2 wire idle control (Not currently used)
|
||||||
extern byte pinIdleUp; //Input for triggering Idle Up
|
extern byte pinIdleUp; //Input for triggering Idle Up
|
||||||
|
extern byte pinIdleUpOutput; //Output that follows (normal or inverted) the idle up pin
|
||||||
extern byte pinCTPS; //Input for triggering closed throttle state
|
extern byte pinCTPS; //Input for triggering closed throttle state
|
||||||
extern byte pinFuel2Input; //Input for switching to the 2nd fuel table
|
extern byte pinFuel2Input; //Input for switching to the 2nd fuel table
|
||||||
extern byte pinSpark2Input; //Input for switching to the 2nd ignition table
|
extern byte pinSpark2Input; //Input for switching to the 2nd ignition table
|
||||||
|
|
|
@ -185,6 +185,7 @@ byte pinFuelPump; //Fuel pump on/off
|
||||||
byte pinIdle1; //Single wire idle control
|
byte pinIdle1; //Single wire idle control
|
||||||
byte pinIdle2; //2 wire idle control (Not currently used)
|
byte pinIdle2; //2 wire idle control (Not currently used)
|
||||||
byte pinIdleUp; //Input for triggering Idle Up
|
byte pinIdleUp; //Input for triggering Idle Up
|
||||||
|
byte pinIdleUpOutput; //Output that follows (normal or inverted) the idle up pin
|
||||||
byte pinCTPS; //Input for triggering closed throttle state
|
byte pinCTPS; //Input for triggering closed throttle state
|
||||||
byte pinFuel2Input; //Input for switching to the 2nd fuel table
|
byte pinFuel2Input; //Input for switching to the 2nd fuel table
|
||||||
byte pinSpark2Input; //Input for switching to the 2nd ignition table
|
byte pinSpark2Input; //Input for switching to the 2nd ignition table
|
||||||
|
|
|
@ -46,6 +46,8 @@ volatile PORT_TYPE *idle_pin_port;
|
||||||
volatile PINMASK_TYPE idle_pin_mask;
|
volatile PINMASK_TYPE idle_pin_mask;
|
||||||
volatile PORT_TYPE *idle2_pin_port;
|
volatile PORT_TYPE *idle2_pin_port;
|
||||||
volatile PINMASK_TYPE idle2_pin_mask;
|
volatile PINMASK_TYPE idle2_pin_mask;
|
||||||
|
volatile PORT_TYPE *idleUpOutput_pin_port;
|
||||||
|
volatile PINMASK_TYPE idleUpOutput_pin_mask;
|
||||||
|
|
||||||
volatile bool idle_pwm_state;
|
volatile bool idle_pwm_state;
|
||||||
unsigned int idle_pwm_max_count; //Used for variable PWM frequency
|
unsigned int idle_pwm_max_count; //Used for variable PWM frequency
|
||||||
|
@ -55,7 +57,11 @@ unsigned long idle_pwm_target_value;
|
||||||
long idle_cl_target_rpm;
|
long idle_cl_target_rpm;
|
||||||
byte idleCounter; //Used for tracking the number of calls to the idle control function
|
byte idleCounter; //Used for tracking the number of calls to the idle control function
|
||||||
|
|
||||||
|
byte idleUpOutputHIGH = HIGH; // Used to invert the idle Up Output
|
||||||
|
byte idleUpOutputLOW = LOW; // Used to invert the idle Up Output
|
||||||
|
|
||||||
void initialiseIdle();
|
void initialiseIdle();
|
||||||
|
void initialiseIdleUpOutput();
|
||||||
static inline void disableIdle();
|
static inline void disableIdle();
|
||||||
static inline void enableIdle();
|
static inline void enableIdle();
|
||||||
static inline byte isStepperHomed();
|
static inline byte isStepperHomed();
|
||||||
|
|
|
@ -172,20 +172,49 @@ void initialiseIdle()
|
||||||
//Well this just shouldn't happen
|
//Well this just shouldn't happen
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initialiseIdleUpOutput();
|
||||||
|
|
||||||
idleInitComplete = configPage6.iacAlgorithm; //Sets which idle method was initialised
|
idleInitComplete = configPage6.iacAlgorithm; //Sets which idle method was initialised
|
||||||
currentStatus.idleLoad = 0;
|
currentStatus.idleLoad = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void initialiseIdleUpOutput()
|
||||||
|
{
|
||||||
|
if (configPage2.idleUpOutputInv == 1) { idleUpOutputHIGH = LOW; idleUpOutputLOW = HIGH; }
|
||||||
|
else { idleUpOutputHIGH = HIGH; idleUpOutputLOW = LOW; }
|
||||||
|
|
||||||
|
digitalWrite(pinIdleUpOutput, idleUpOutputLOW); //Initiallise program with the idle up output in the off state
|
||||||
|
currentStatus.idleUpOutputActive = false;
|
||||||
|
|
||||||
|
idleUpOutput_pin_port = portOutputRegister(digitalPinToPort(pinIdleUpOutput));
|
||||||
|
idleUpOutput_pin_mask = digitalPinToBitMask(pinIdleUpOutput);
|
||||||
|
}
|
||||||
|
|
||||||
void idleControl()
|
void idleControl()
|
||||||
{
|
{
|
||||||
if(idleInitComplete != configPage6.iacAlgorithm) { initialiseIdle(); }
|
if (idleInitComplete != configPage6.iacAlgorithm) { initialiseIdle(); }
|
||||||
if(currentStatus.RPM > 0) { enableIdle(); }
|
if (currentStatus.RPM > 0) { enableIdle(); }
|
||||||
|
|
||||||
//Check whether the idleUp is active
|
//Check whether the idleUp is active
|
||||||
if(configPage2.idleUpEnabled == true)
|
if (configPage2.idleUpEnabled == true)
|
||||||
{
|
{
|
||||||
if(configPage2.idleUpPolarity == 0) { currentStatus.idleUpActive = !digitalRead(pinIdleUp); } //Normal mode (ground switched)
|
if (configPage2.idleUpPolarity == 0) { currentStatus.idleUpActive = !digitalRead(pinIdleUp); } //Normal mode (ground switched)
|
||||||
else { currentStatus.idleUpActive = digitalRead(pinIdleUp); } //Inverted mode (5v activates idleUp)
|
else { currentStatus.idleUpActive = digitalRead(pinIdleUp); } //Inverted mode (5v activates idleUp)
|
||||||
|
|
||||||
|
if (configPage2.idleUpOutputEnabled == true)
|
||||||
|
{
|
||||||
|
if (currentStatus.idleUpActive == true)
|
||||||
|
{
|
||||||
|
digitalWrite(pinIdleUpOutput, idleUpOutputHIGH);
|
||||||
|
currentStatus.idleUpOutputActive = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
digitalWrite(pinIdleUpOutput, idleUpOutputLOW);
|
||||||
|
currentStatus.idleUpOutputActive = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else { currentStatus.idleUpActive = false; }
|
else { currentStatus.idleUpActive = false; }
|
||||||
|
|
||||||
|
|
|
@ -2350,6 +2350,9 @@ void setPinMapping(byte boardID)
|
||||||
//Currently there's no default pin for Idle Up
|
//Currently there's no default pin for Idle Up
|
||||||
pinIdleUp = pinTranslate(configPage2.idleUpPin);
|
pinIdleUp = pinTranslate(configPage2.idleUpPin);
|
||||||
|
|
||||||
|
//Currently there's no default pin for Idle Up Output
|
||||||
|
pinIdleUpOutput = pinTranslate(configPage2.idleUpOutputPin);
|
||||||
|
|
||||||
//Currently there's no default pin for closed throttle position sensor
|
//Currently there's no default pin for closed throttle position sensor
|
||||||
pinCTPS = pinTranslate(configPage2.CTPSPin);
|
pinCTPS = pinTranslate(configPage2.CTPSPin);
|
||||||
|
|
||||||
|
@ -2368,6 +2371,7 @@ void setPinMapping(byte boardID)
|
||||||
pinMode(pinTachOut, OUTPUT);
|
pinMode(pinTachOut, OUTPUT);
|
||||||
pinMode(pinIdle1, OUTPUT);
|
pinMode(pinIdle1, OUTPUT);
|
||||||
pinMode(pinIdle2, OUTPUT);
|
pinMode(pinIdle2, OUTPUT);
|
||||||
|
pinMode(pinIdleUpOutput, OUTPUT);
|
||||||
pinMode(pinFuelPump, OUTPUT);
|
pinMode(pinFuelPump, OUTPUT);
|
||||||
pinMode(pinIgnBypass, OUTPUT);
|
pinMode(pinIgnBypass, OUTPUT);
|
||||||
pinMode(pinFan, OUTPUT);
|
pinMode(pinFan, OUTPUT);
|
||||||
|
|
Loading…
Reference in New Issue