1
0
Fork 0

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.
This commit is contained in:
david 2002-02-08 13:36:46 +00:00
parent e1843e15d4
commit 827e11ff81

View file

@ -213,26 +213,21 @@ void FGPiston::doEngineStartup(void)
} }
//Check mode of engine operation //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) { if (Cranking) {
crank_counter++; crank_counter++;
if (RPM <= 480) { if (RPM <= 480) {
RPM += 100; // Do nothing !! - cranking power output is now handled in the doPower section
if (RPM > 480)
RPM = 480;
} else { } else {
// consider making a horrible noise if the starter is engaged with // consider making a horrible noise if the starter is engaged with
// the engine running // the engine running
} }
// TODO - find a better guess at cranking speed
} }
// if ((!Running) && (spark) && (fuel) && (crank_counter > 120)) { // if ((!Running) && (spark) && (fuel) && (crank_counter > 120)) {
if ((!Running) && (spark) && (fuel)) { if ((!Running) && (spark) && (fuel)) {
// start the engine if revs high enough // 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 // For now just instantaneously start but later we should maybe crank for
// a bit // a bit
Running = true; Running = true;
@ -351,28 +346,32 @@ void FGPiston::doFuelFlow(void)
void FGPiston::doEnginePower(void) void FGPiston::doEnginePower(void)
{ {
ManifoldPressure_inHg *= p_amb / p_amb_sea_level; 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 // FIXME: this needs to be generalized
Percentage_Power = (6e-9 * ManXRPM * ManXRPM) + (8e-4 * ManXRPM) - 1.0; Percentage_Power = (6e-9 * ManXRPM * ManXRPM) + (8e-4 * ManXRPM) - 1.0;
double T_amb_degF = (T_amb * 1.8) - 459.67; double T_amb_degF = (T_amb * 1.8) - 459.67;
double T_amb_sea_lev_degF = (288 * 1.8) - 459.67; double T_amb_sea_lev_degF = (288 * 1.8) - 459.67;
Percentage_Power = Percentage_Power =
Percentage_Power + ((T_amb_sea_lev_degF - T_amb_degF) * 7 /120); Percentage_Power + ((T_amb_sea_lev_degF - T_amb_degF) * 7 /120);
double Percentage_of_best_power_mixture_power = double Percentage_of_best_power_mixture_power =
Power_Mixture_Correlation->GetValue(14.7 / equivalence_ratio); Power_Mixture_Correlation->GetValue(14.7 / equivalence_ratio);
Percentage_Power = Percentage_Power =
Percentage_Power * Percentage_of_best_power_mixture_power / 100.0; Percentage_Power * Percentage_of_best_power_mixture_power / 100.0;
if (Percentage_Power < 0.0) if (Percentage_Power < 0.0)
Percentage_Power = 0.0; Percentage_Power = 0.0;
else if (Percentage_Power > 100.0) else if (Percentage_Power > 100.0)
Percentage_Power = 100.0; Percentage_Power = 100.0;
HP = Percentage_Power * MaxHP / 100.0; HP = Percentage_Power * MaxHP / 100.0;
} else {
//Hack // Power output when the engine is not running
if (!Running) {
if (Cranking) { if (Cranking) {
if (RPM < 480) { if (RPM < 10) {
HP = 3.0 + ((480 - RPM) / 10.0); 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 { } else {
HP = 3.0; HP = 3.0;
} }