From 366f75c38b74fdde074dda599b76e21d7abbca2b Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Sun, 15 May 2016 19:29:52 +1000 Subject: [PATCH] Option to allow reverse direction for PWM valve --- globals.h | 2 +- idle.ino | 7 ++++--- reference/speeduino.ini | 4 +++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/globals.h b/globals.h index 821b6e18..b0e10665 100644 --- a/globals.h +++ b/globals.h @@ -354,7 +354,7 @@ struct config4 { byte iacAlgorithm : 3; //Valid values are: "None", "On/Off", "PWM", "PWM Closed Loop", "Stepper", "Stepper Closed Loop" byte iacStepTime : 3; //How long to pulse the stepper for to ensure the step completes (ms) byte iacChannels : 1; //How many outputs to use in PWM mode (0 = 1 channel, 1 = 2 channels) - byte unused52 : 1; + byte iacPWMdir : 1; //Directino of the PWM valve. 0 = Normal = Higher RPM with more duty. 1 = Reverse = Lower RPM with more duty byte iacFastTemp; //Fast idle temp when using a simple on/off valve diff --git a/idle.ino b/idle.ino index 1be16735..25088c4c 100644 --- a/idle.ino +++ b/idle.ino @@ -152,7 +152,6 @@ void idleControl() //No cranking specific value for closed loop (yet?) idle_cl_target_rpm = table2D_getValue(&iacClosedLoopTable, currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET) * 10; //All temps are offset by 40 degrees longRPM = currentStatus.RPM; //The PID object needs a long as the RPM input. A separate variable is used for this - idlePID.SetOutputLimits(0, idle_pwm_max_count); idlePID.SetTunings(configPage3.idleKP, configPage3.idleKI, configPage3.idleKD); idlePID.Compute(); @@ -249,7 +248,8 @@ ISR(TIMER4_COMPC_vect) *idle_pin_port &= ~(idle_pin_mask); // Switch pin to low (1 pin mode) if(configPage4.iacChannels) { *idle2_pin_port |= (idle2_pin_mask); } //If 2 idle channels are in use, flip idle2 to be the opposite of idle1 OCR4C = TCNT4 + (idle_pwm_max_count - idle_pwm_cur_value); - idle_pwm_state = false; + if (configPage4.iacPWMdir == 0) { idle_pwm_state = false; } + else { idle_pwm_state = true; } } else { @@ -257,7 +257,8 @@ ISR(TIMER4_COMPC_vect) if(configPage4.iacChannels) { *idle2_pin_port &= ~(idle2_pin_mask); } //If 2 idle channels are in use, flip idle2 to be the opposite of idle1 OCR4C = TCNT4 + idle_pwm_target_value; idle_pwm_cur_value = idle_pwm_target_value; - idle_pwm_state = true; + if (configPage4.iacPWMdir == 0) { idle_pwm_state = true; } + else { idle_pwm_state = false; } } } diff --git a/reference/speeduino.ini b/reference/speeduino.ini index 0750a78e..bafe4e72 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -371,7 +371,7 @@ page = 7 iacAlgorithm = bits , U08, 52, [0:2], "None", "On/Off", "PWM Open loop", "PWM Closed loop", "Stepper", "INVALID", "INVALID", "INVALID" iacStepTime = bits , U08, 52, [3:5], "1", "2", "3", "4", "5", "6" iacChannels = bits, U08, 52, [6:6], "1", "2" - unused7-52f = bits , U08, 52, [7:7], "One", "INVALID" + iacPWMdir = bits , U08, 52, [7:7], "Normal", "Reverse" #if CELSIUS iacFastTemp = scalar, U08, 53, "C", 1.0, -40, -40, 215, 0 @@ -582,6 +582,7 @@ page = 8 iacStepHyster = "The minimum number of steps to move in any one go." iacAlgorithm = "Selects method of idle control.\nNone = no idle control valve.\nOn/Off valve.\nPWM valve (2,3 wire).\nStepper Valve (4,6,8 wire)." + iacPWMdir = "Normal PWM valves increase RPM with higher duty. If RPM decreases with higher duty then select Reverse dfcoRPM = "The RPM above which DFCO will be active. Typically set a few hundred RPM above maximum idle speed" dfcoHyster = "Hysteresis for DFCO RPM. 200-300 RPM is typical for this, however a higher value may be needed if the RPM is fluctuating around the cutout speed" @@ -688,6 +689,7 @@ page = 8 dialog = pwm_idle, "PWM Idle" field = "Number of outputs", iacChannels, { iacAlgorithm == 2 || iacAlgorithm == 3 } field = "Idle valve frequency", idleFreq, { iacAlgorithm == 2 || iacAlgorithm == 3 } + field = "Idle valve direction", iacPWMdir, { iacAlgorithm == 2 || iacAlgorithm == 3 } dialog = closedloop_idle, "Closed loop Idle" field = "P", idleKP, { iacAlgorithm == 3 }