From 827e11ff8174d354e690f55b2205468f17db9d3e Mon Sep 17 00:00:00 2001 From: david Date: Fri, 8 Feb 2002 13:36:46 +0000 Subject: [PATCH] JSBSim change from Dave Luff: Attached is a fix to add a short period of cranking time required before the engine fires. I've also added a little hack to limit the torque applied by the starter motor when the rpm is less than 10 in order to avoid the rpm overshooting idle in the first time step when the prop is producing very little resistance due to the low rpm. --- src/FDM/JSBSim/FGPiston.cpp | 53 ++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/FDM/JSBSim/FGPiston.cpp b/src/FDM/JSBSim/FGPiston.cpp index b8eb6a5ef..ea54f7c20 100644 --- a/src/FDM/JSBSim/FGPiston.cpp +++ b/src/FDM/JSBSim/FGPiston.cpp @@ -213,26 +213,21 @@ void FGPiston::doEngineStartup(void) } //Check mode of engine operation - // ACK - unfortunately this hack doesn't work in JSBSim since the RPM is reset - // each iteration by the propeller :-( if (Cranking) { crank_counter++; if (RPM <= 480) { - RPM += 100; - if (RPM > 480) - RPM = 480; + // Do nothing !! - cranking power output is now handled in the doPower section } else { // consider making a horrible noise if the starter is engaged with // the engine running } - // TODO - find a better guess at cranking speed } // if ((!Running) && (spark) && (fuel) && (crank_counter > 120)) { if ((!Running) && (spark) && (fuel)) { // start the engine if revs high enough - if (RPM > 450) { + if ((RPM > 450) && (crank_counter > 175)) { // For now just instantaneously start but later we should maybe crank for // a bit Running = true; @@ -351,28 +346,32 @@ void FGPiston::doFuelFlow(void) void FGPiston::doEnginePower(void) { ManifoldPressure_inHg *= p_amb / p_amb_sea_level; - double ManXRPM = ManifoldPressure_inHg * RPM; + if(Running) { + double ManXRPM = ManifoldPressure_inHg * RPM; // FIXME: this needs to be generalized - Percentage_Power = (6e-9 * ManXRPM * ManXRPM) + (8e-4 * ManXRPM) - 1.0; - double T_amb_degF = (T_amb * 1.8) - 459.67; - double T_amb_sea_lev_degF = (288 * 1.8) - 459.67; - Percentage_Power = - Percentage_Power + ((T_amb_sea_lev_degF - T_amb_degF) * 7 /120); - double Percentage_of_best_power_mixture_power = - Power_Mixture_Correlation->GetValue(14.7 / equivalence_ratio); - Percentage_Power = - Percentage_Power * Percentage_of_best_power_mixture_power / 100.0; - if (Percentage_Power < 0.0) - Percentage_Power = 0.0; - else if (Percentage_Power > 100.0) - Percentage_Power = 100.0; - HP = Percentage_Power * MaxHP / 100.0; - - //Hack - if (!Running) { + Percentage_Power = (6e-9 * ManXRPM * ManXRPM) + (8e-4 * ManXRPM) - 1.0; + double T_amb_degF = (T_amb * 1.8) - 459.67; + double T_amb_sea_lev_degF = (288 * 1.8) - 459.67; + Percentage_Power = + Percentage_Power + ((T_amb_sea_lev_degF - T_amb_degF) * 7 /120); + double Percentage_of_best_power_mixture_power = + Power_Mixture_Correlation->GetValue(14.7 / equivalence_ratio); + Percentage_Power = + Percentage_Power * Percentage_of_best_power_mixture_power / 100.0; + if (Percentage_Power < 0.0) + Percentage_Power = 0.0; + else if (Percentage_Power > 100.0) + Percentage_Power = 100.0; + HP = Percentage_Power * MaxHP / 100.0; + } else { + // Power output when the engine is not running if (Cranking) { - if (RPM < 480) { - HP = 3.0 + ((480 - RPM) / 10.0); + if (RPM < 10) { + HP = 3.0; // This is a hack to prevent overshooting the idle rpm in the first time step + // It may possibly need to be changed if the prop model is changed. + } else if (RPM < 480) { + HP = 3.0 + ((480 - RPM) / 10.0); + // This is a guess - would be nice to find a proper starter moter torque curve } else { HP = 3.0; }