Friday 22 June 2012

Gentle run out to check boost

RPM increase at 6-8k was due to a spot of wheel spin.  Boost seems to come in quite nicely.  Note the throttle isn't that wide open (60%) so more to come.

Some ignition triggering problems, but all seems to be working as expected.  Boost leaks fixed (JB weld had been blown out of the holes that need blocking in the TB's.

Thursday 10 May 2012

Is a gsf1250 compatible with a gsxr1100wp?

The question has come up of whether the gsf1250 engine shares components with the gsxr1100wp engine.

Here are some photos. To summarise, the bore spacing is the same and 10 out of 12 headbolts line up, but 2 don't and the barrels are not as tall.

Here are some photos.


Turbo porting, fast and furious

So, I had a problem with my turbo overboosting. Basically this means that even with the wastegate wide open the boost still builds so it is out of control.

This is not a good thing, because too much boost can result in engine damage.

I had temporarily addressed this by installing a exhaust dB killer (a device that reduces the noise a bit by constricting the exhaust at the outlet). This results in slightly higher pressure in the exhaust and it is the pressure difference between the two different sides of the exhaust turbine that provides the drive to the turbo.

Anyway, that was a short-term solution and did work, but it isn't ideal. The whole point of turbos is to get lots of boost and lots of boost when you want it. Decreasing the efficiency of the turbo would (in theory anyway) make boost come in later and generally make things more laggy.

So, I hit the internet and discovered that I needed to make the wastegate more efficient. This is done not by changing the wastegate, but buy making it easier for the gases to whip through the hole. As expected the casting was crude, so my die-grinder, a carbide bit and 20minutes was all that was needed to open up the flow paths so as to allow the gas flow to more easily get through the wastegate (when it is open).

Here are a couple of photos, post port (none before, sorry).


New battery

I got bored of my car not starting so bought a new battery.
This didn't help at all (bit annoying that), but the battery is bigger and seems to make the engine run smoother.  Specifically the voltage is more stable which previously impacted the injection times quite a lot.

The other issue was that turning the lights (HID ones) previously would stop the engine (due to voltage drop) unless the RPM's were up, now the lights or fan have no effect on the engine.

All good stuff.

Battery is a PC680 (with metal jacket), and I have mounted in the passenger footwell, with remote connections in the engine bay.

If only it would stop raining.

2012 Starting again

So, where have I been??

Mostly I have been trying to sort out a garage.  Lots of clearing away shrubs and soil.  Rebuilding walls, planning the building and struggling with the council and their contrived rules.

It looks like the planning permission has gone through so hopefully I should be able to get a garage built before next winter.


Back to my car.
For the longest time I have had problems starting my engine. The issue was that the crank on my engine is lightened to the extreme, and so when cranking the compression effect slows and speeds the cranking rate.  The consequence of this is that the tooth spacings are not equal.  The effect of this when cranking is that the long tooth isn't detected reliably.

The algorithm (in ms2extra) requires the missing tooth (nominally 2x a normal tooth gap) to be 1.5x the tooth before it, and the tooth after the long tooth to be less than 3/4 of the length of the missing tooth.

This is too stringent, which is crap for me.

So, I changed the code slightly.

Now the long tooth has to be >1.5x the tooth before, but the teeth after only have to be 7/8 of the long tooth.  The big risk with this type of code is that if we sync on the wrong tooth then we could end up getting serious detonation and possible engine destruction.

To protect against this I have added additional checks, in this case the 3 teeth after the long tooth all have to be less than 7/8 of the long tooth.


Anyway, here is the code (mostly so I can find it when I next need it!)
ms2_extra_ign_in.c


    /************ missing tooth wheel & missing and 2nd trigger wheel mode *************/
SPKMODE4:
    if ((flash4.spk_config & 0xc) == 0x8) {
        goto SPKMODE4B;
    }
    /* this is the "find missing" step */
    // look for missing tooth (subtract last tooth time from this tooth
    // count taking overflow into account, and then multiply previous
    // tooth time by 1.5 and see


    if (firstsync_iter == 0) {
        /* Here we will look for missing */


        temp1 = tooth_diff_last + (tooth_diff_last >> 1);


        if (tooth_diff_this > temp1) {
            firstsync_iter = 1;
        }
        return;
    } else if (firstsync_iter == 1) {
        /* tooth after what we thought was missing, lets make sure this one is short
         * on the first sync, we miss tooth #1, but that's ok as long as we catch it next time
         * split this into 2 operations so compiler doesn't call subroutine
         */
        temp1 = (tooth_diff_last >> 1); /* 1/2 of last value */
        temp1 = temp1 >> 1; /* 1/4th of last value */
        temp1 = temp1 >> 1; /* 1/8th of last value MDR ADDED */


        //temp1 = tooth_diff_last - temp1; /* 3/4ths of last value */
        temp1 = tooth_diff_last - temp1; /* 7/8ths of last value MDR ADDED */


        if (tooth_diff_this >= temp1) {
            /* this wasn't really the missing tooth... */
            firstsync_iter = 0;
            return;
        }


        firstsync_iter = 2;
        /* flagbyte4 |= flagbyte4_found_miss; DONT THINK WE WANT THIS YET */
        set_count = 1;
    } else if (firstsync_iter == 2) {
/*Check the next tooth as well so as to be sure */
/* tooth after what we thought was missing, lets make sure this one is short
* on the first sync, we miss tooth #1, but that's ok as long as we catch it next time
* split this into 2 operations so compiler doesn't call subroutine
*/
temp1 = (tooth_diff_last_1 >> 1); /* 1/2 of last value */
temp1 = temp1 >> 1; /* 1/4th of last value */
temp1 = temp1 >> 1; /* 1/8th of last value MDR ADDED */


temp1 = tooth_diff_last_1 - temp1; /* 7/8ths of long tooth MDR ADDED */


if (tooth_diff_this >= temp1) {
   /* this wasn't really the missing tooth... */
   firstsync_iter = 0;
   return;
}


firstsync_iter = 3;
/* flagbyte4 |= flagbyte4_found_miss; */
        set_count = 2;  /* Guessed that this should be 2,  needs checking */
   } else if (firstsync_iter == 3) {
/*Check the next tooth as well so as to be sure */
/* tooth after what we thought was missing, lets make sure this one is short
    * on the first sync, we miss tooth #1, but that's ok as long as we catch it next time
* split this into 2 operations so compiler doesn't call subroutine
*/
temp1 = (tooth_diff_last_2 >> 1); /* 1/2 of last value */
temp1 = temp1 >> 1; /* 1/4th of last value */
temp1 = temp1 >> 1; /* 1/8th of last value MDR ADDED */


temp1 = tooth_diff_last_2 - temp1; /* 7/8ths of long tooth MDR ADDED */


if (tooth_diff_this >= temp1) {
  /* this wasn't really the missing tooth... */
  firstsync_iter = 0;
  return;
}


  firstsync_iter = 4;
  flagbyte4 |= flagbyte4_found_miss;
       set_count = 3;  /* Guessed that this should be 3,  needs checking */
    } else if (firstsync_iter == 4) {
        if (tooth_no == 0) { // this should not happen, so reset
            outpc.syncreason = 1;
            ign_reset();  // note that this sequence of setting reason, resetting ign and incrementing counter is
            return;
    }




            if ((tooth_no == last_tooth) ||
                (((flash4.spk_config & 0xc) == 0xc) && (tooth_no == mid_last_tooth))) {
                /* this means we should have the last tooth here, so check for missing */
                temp1 = tooth_diff_last + (tooth_diff_last >> 1); /* 1.5 * last tooth */


                if (tooth_diff_this <= temp1) {
               firstsync_iter = 0;
                    flagbyte4 &= ~flagbyte4_found_miss;
                    outpc.syncreason = 2;
                    ign_reset();
                    return;
                }


                flagbyte4 |= flagbyte4_found_miss;
                set_count = 0;
            }
        }


        if (tooth_no == 1) {
            /* check to make sure this tooth is < 3/4th's of last tooth*/
            temp1 = (tooth_diff_last >> 1);
            temp1 = temp1 >> 1;
            temp1 = temp1 >> 1; /* Make it 7/8th's not 3/4 MDR ADDED */
            temp1 = tooth_diff_last - temp1;
            if (tooth_diff_this >= temp1) {
                /* lost sync */
                firstsync_iter = 0;
                outpc.syncreason = 5;  /* First tooth failure labelled as 5 */
                ign_reset();
                return;
            }
        }


        if (tooth_no == 2) {
           /* check to make sure this tooth is < 3/4th's of last tooth */
           temp1 = (tooth_diff_last_1 >> 1);
           temp1 = temp1 >> 1;
           temp1 = temp1 >> 1; /* Make it 7/8th's not 3/4 MDR ADDED */
           temp1 = tooth_diff_last_1 - temp1;
           if (tooth_diff_this >= temp1) {
               /* lost sync */
               firstsync_iter = 0;
               outpc.syncreason = 6; /* Check this and label as 6 MDR ADDED */
               ign_reset();
               return;
           }
        }


        if (tooth_no == 3) {
           /* check to make sure this tooth is < 7/8th's of last tooth  */
           temp1 = (tooth_diff_last_2 >> 1);
           temp1 = temp1 >> 1;
           temp1 = temp1 >> 1; /* Make it 7/8th's not 3/4 MDR ADDED */
           temp1 = tooth_diff_last_2 - temp1;
           if (tooth_diff_this >= temp1) {
               /* lost sync */
               firstsync_iter = 0;
               outpc.syncreason = 7; /* Check this and label as 6 MDR ADDED */
               ign_reset();
               return;
           }
        }


    if (flagbyte4 & flagbyte4_found_miss) {


        flagbyte4 &= ~flagbyte4_found_miss;


// found the missing tooth
if ((flash4.spk_config & 0xc) == 0xc) {
   if (!(flagbyte1 & flagbyte1_trig2active) && !(synch & SYNC_SYNCED)) {
goto common_wheel;
   }
}


        synch |= SYNC_SYNCED;


        if (synch & SYNC_FIRST) {
            syncfirst();
        }


        outpc.status1 |= status1_syncok; /* have sync */


if ((flash4.spk_config & 0xc) != 0xc) {
   tooth_no = set_count;
} else {
   if (flagbyte1 & flagbyte1_trig2active) {
tooth_no = set_count;
flagbyte1 &= ~flagbyte1_trig2active;
   } else {
tooth_no += flash4.No_Miss_Teeth;
   }
}
    }
    goto common_wheel;
 
The great thing is that the engine now start "on the button", first time everytime.  I am very excited as it takes my car from being a liability to an actual car.