ECU- styrning till en VW pumpdysediesel.

Berätta om dina pågående projekt.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Ta mig tusan så hittade jag en felcadning... +5 volt korsade SCK så den kunde inte gå låg när så behövdes.
Men det gjorde ingen skillnad, jag har svårt för att tro att kretsen har gått hädan, det borde vara NANO:n, den som skall göra SCK låg som går först men den är hel. Nu är det arbetsdag i morgon och jobbet väntar så vidare felsökning får bli en annan dag.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Den första NANOMEGA jag byggde ihop svänger oscillatorn på men den går inte. Jag byggde en till, samma sak. Jag fick i dag hem 5 Atmegakretsar (tack Hawkan) och byggde en tredje NANOMEGA och den gick inte heller. Så jag tänkte, jag kan programmera UNO, NANO via ISP så jag letade upp en MEGA och den fungerade också. Jag anslöt nr 2 likadant igen och då funkade det!!! Sen anslöt jag nr 3 men glömde motstånd och kondensator till reset-kretsen, det fungerade ändå nu!!! Jag har ingen aning vad jag har gjort för fel eller vad som gick rätt? Var det städningen innan?
Så jag bestyckade nr 2 med en stympad NANO under och la in ett Arduinoprogram och det fungerar, serial.print() fungerar och alla I/O verkar funka. Nu skall jag göra ett testprogram där man kan se alla I/O och analoga ingångarna samtidigt på skärmen mest för att se så jag gjort rätt hela vägen. När jag skulle cad detta kort första gången så var det lite svårt att utröna vilket som var TX och RX då det stod olika i olika schemor, denna gången gjorde jag som någon här skrev om, satte alternativmotstånd och det blev alt 2 som var rätt.
Elektronik kan vara nyckfullt ibland...
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Nu har jag ju lyckats programmera in bootloadern så i dag anslöt jag en till yttervärlden. Lite suddiga bilder men här syns det hyfsat i alla fall.
IMG_20180411_200156.jpg
Hmm, får nog investera i en bättre kamera, den här mobilkameran är inget vidare.
IMG_20180411_200210.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av KLset »

Vad är det för status på det hela? Hur ser ECU:n ut i nuläget?
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Själva ECU:n fungerar, jag har lagt in några analogt justerbara parametrar (förtändning låga resp. höga varvtal) som jag inte har utprovat än. Vidare har jag gjort ett förbättrat "moderkort" som har effektbegränsning på slutstegen, bättre lösningar på elen, utflyttad atmosfärsgivare och batterikänningskrets. Inget är egentligen testat än... Nu så börjar min arbetssäsong på riktigt så det blir inte så mycket tid över för detta. Den här NANOMEGA är bara grovtestad och den fungerar, det jag inte kollat är om alla I/O har rätt nummer, men det är mest kosmetiskt.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Lång tid sedan sist... Det händer väl egentligen ingenting med projektet, jag laddar inte ens inför det. Jobbet är just nu 24/7 högt och lågt, alla vill ha sina aerodyner flygande. BTW, jag slutar nu snart mitt jobb som flygtekniker och blir gymnasielärare på deltid inom El&Energi och Fordon, börjar den 13 Augusti.
Kanske min blivande flygdieselmotor kan bli ett projekt för eleverna? Det borde inte vara för avancerat då jag tycker alla ungdomar kan dator bättre än mig... Och jag vet ju ungefär hur jag vill ha det rent funktionellt och programmeringsmässigt. Men, detta återstår att se!!
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Läste just igenom tråden för en egen uppdatering, jag får nog hålla med RogerK8, det är en bra logg att gå tillbaka till för jag har glömt av var jag slutade någonstans och får nu en bra uppfräschning/uppdatering inför kommande...
Ev så har jag lite mer tid snart och tänker fortsätta där jag blev avbruten i våras. Sen så skall även motorn dammas av och luftas ur, tankas, få dit ett startbatteri mm. Sen så hade jag ju skaffat en "MO" och en "Ipsy bitsy" som jag fick nåt slags halvliv i utan någon egentlig funktion trots att det borde fungerat, jag får väl ge det lite mer innan jag kastar in handduken... Vissa alster fungerar ju medans andra inte, konstigt!!
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

I dag fanns tiden helt plötsligt för att damma av dieselmotorn, koppla in det oprövade moderkortet, den oprövade ECU-NANO:n och den var stendöd, efter att ha flyttat swap-switchen till andra ECU:n så startade den direkt och gick dessutom bra. Den döda ECU-NANO:n förblev däremot nästan död... Det blir att testa ut och programmera om på kammaren tills man är nöjd och sen ett nytt försök. Jag har bestämt mig för att behålla den ena ECU-NANO:n som en slagt fungerande "master" och sen bara gresa i den andra tills den får rätt och riktig funktion...
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Ja, nu börjar det gå framåt... Jag hittade varför den döda ECU:n var just död, det var kamaxelgivarens ingång som från början var vald LOW men efter ombyggnad på motorn måste väljas HIGH i sketchen. Jag använder analogingång A1 till förtändningsjustering på låga varv och A2 som justering på höga varv. Det finns inget exakt ställe där den ena poten slutar att fungera och nästa tar vid utan dom påverkar varandra lite hela tiden. Men med lågvarvspoten kan jag justera insprutningens början mellan 5 till 12 grader före övre dödpunkt på kolven, någonstans runt 7-8 grader verkar vara ett bra ställe. Högvarvpoten reglerar ca 30- 45 grader före övre dödpunkt men jag är tveksam till om den funktionen fungerar som jag tänkt för motorn går inte bra nån gång hur jag än justerar... Min "master ECU" går bättre från början där. Det värsta är att jag vet inte vilken sketch som ligger inlagd där... Men den är tejpad på kontakten så inte jag av misstag råkar göra nåt obra. Bra i alla all var att det var inte så lång startsträcka för att komma igång igen.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Här kommer en liten video på motorkörningen med två olika program.

Håll till godo.
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av KLset »

Det låter ju riktigt fint det där. :D
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Magnus_K »

Ja riktigt snyggt :tumupp:
Blir alldeles varm av ljudet efter ha tuffat runt i ca 35000 mil med en sån där :wink:
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Tackar! Jag har ett problem med senaste sketchen, ja två tre problem egentligen... 1: Den går ganska ojämnt och lite ryckigt. 2: den blir "döv" på gasen, förmodligen alla analoga blir döva då och då. 3: Jag läser ju av kamaxelgivaren 250 gånger sedan görs stängs ingången av och vevaxelgivaren fortsätter att hålla räkningen och fasläget men om jag väljer den först passiv sedan aktiv så stannar motorn ibland pga att den tappat zync, det är inte bra...
Det blir in på kammaren för felsökning!
Är det någon som vill se senaste sketchen?
ktm_micke
Inlägg: 116
Blev medlem: 24 juni 2009, 09:34:27
Ort: Halmstad

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av ktm_micke »

Vilket jobb du lägger ner helt otroligt och att du skriver utförligt om det. Kul
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Tackar! jag har haft ett problem (ett av flera) som jag inte riktigt fattade vad det var. Det gällde analog read som jag lagt långt ner i koden och som ECU:n skall göra precis när "insprutningsmodulen" är klar. Fenomenet var att gasen hängde sig i sista värdet tex 1500 rpm och gick inte att justera på en stund, rätt som det var så tog den det nya värdet och hängde sig där istället. Felet vara att i sista case 16 så hade jag lagt in en ny underswitch/case fast uppräknaren låg inte i caset utan under så den räknade upp alldeles för ofta så det blev lite av ett lotteri om den läste av gas eller ej...
Egentligen är jag inte nöjd nu heller men jag behöver nog mer tid med motorn körandes samtidigt för att finna ut bästa koden. Här kommer senaste alstret:

Kod: Markera allt

    // inladdad 2018-07-25 som ECU B 
    #include <PureAtmega328.h>
    
            // här är olika justerbara parametrar som påverkar enligt följande:
 // const byte lageffekt = 5;         // effektläge tomgång utan gaspot (5) (nödkörning)
 // const byte marcheffekt = 230;     // effektläge marcheffekt utan gaspot (230)(nödkörning)
 // const byte fulleffekt = 252;      // effektläge fulleffekt utan gaspot (252) (nödkörning)
    const byte totaltid = 14;         // totaltid för case 15: x * motorns duration (14 = 7 tänder + upp till 2 extra = 55 gr)
    const int lagstavarv = 520;       // tomgångsvarvet 580 uS motsvarar ca 800 Rpm (580)
    const byte hogstavarv = 120;      // fullgasvarvet 100 uS motsvarar ca 4200 RPM  (100)(160 = ca 2500 RPM)
    const byte aggrfaktorlag = 20;    // hur mycket spridar PWM skall öka vid belastning mellanvarv (30)
    const byte aggrfaktorhog = 150;   // hur mycket spridar PWM skall öka vid belastning högvarv (150)
    const int minfart = 3300;         // lägsta startvarv för spridarfunktion (3300 uS = 152 RPM)(3300)
    const byte startmangd = 6; //5    // avgör max startmängd 5 = 0,75 vevaxelpulser = 4,5 grader ontid (5) (6 är 1 vevpuls, 6 grader)
    const float maxdeltalag = 9.0;    // max insprutningstid mellanvarv mdutation * 6.0 ger 3 vevaxelpulser = 18 gr ontid (6.0)
    const byte lagmangd = 3;  // ev 3 // max lågvarvsmängd 2 =  1 vevaxelpuls = 6 grader ontid (under tomgångsvarv)(2)(3 är 1,5 vevpuls = 9 grader ontid)
    const int tid1 = 3000;            // tid 1 är för att hitta pulsluckan vid start/lågvarv < 300 RPM (400)                            
    const int tid2 = 900;             // tid 2 är för att hitta pulsluckan i mellanvarv 1100--> (1200)
    const int tid3 = 200;             // tid 3 är för att hitta pulsluckan i alla andra förekommande varv 1100--> (300)
    const int sprtroghet = 200;       // korrektion för den inbyggda påslagströgheten i spridarna
    const byte turbostartregl = 150;  // när tubotrycket börjar avläsas och bli aktivt (150 = uS mduration ca 3200RPM)(150)
    float senasteinsprfordroj;        // senaste insprutningstid (vid tomgång)(12.0 = 6 vevaxelpulser = 36 grader delaytid = 6 grader FÖDP) 8-14
    byte tidigasteinspr;              // kortaste insprutningsfördröjning (vid maxvarv)(60=t19=24grFödp)(30=t20=18grFödp)(27) 18-38
    const int sprdiff1 = 0;           // en ev tidigareläggning av spridare 1 om den avviker i startfördröjning
    const int sprdiff2 = 0;           // en ev tidigareläggning av spridare 2 om den avviker i startfördröjning
    const int sprdiff3 = 0;           // en ev tidigareläggning av spridare 3 om den avviker i startfördröjning
    const int sprdiff4 = 0;     //20  // en ev tidigareläggning av spridare 4 om den avviker i startfördröjning                                   
    const int grundvarde = 330;       // grundtrycksvärde ställs in här, högre tal = mindre tryck (330)                                  
    
   
    int vevpin = 2;                   // vevaxelgivarens ingång, (aktivt hög).
    int kampin = 3;                   // kamaxelgivarens ingång, (aktivt låg). 
    int pulsutpin = 7;                // pulsutgång 2 pulser per varv (kontrollutgång för övervakningen).
    int sprpins [] ={11,10,9,8};      // till spridarna (blir aktivt höga)
    int disable = 12;                 // aktivt hög stoppar utsignalerna till spridarna
    int sprControl = 13;              // kontrollutgång för spridare till övervakningen
    unsigned long delvalue;           // delvärde av pulstid i uS.
    unsigned int ondelay;             // tillslagsfördröjning spridare i uS (mS)(inne i case 15)
    long puls, priv, delta;           // senaste, föregående och delta (totalöppningstid) i uS(mS)
    float error;                      // error = varvfelet i decimalform 
    float starttandf;                 // starttand i decimalform för att få startfördröjningstid 
    float  mduration, bduration;      // varvfelet = motorduration/börduration i decimalform
    byte tand = 0;                    // vevpin räknare 0 till 28, i alla fall till 26
    byte gas;                         // gas 0-255
    byte pekare = 0 ;                 // pekare för att välja rätt spridarutgång, startar på 0 
    byte kamtand = 0;                 // Kamtand för att sluta detektera kamaxelgivaren efter 51 (max 255)tänder, startar på 0
    int fasttid = 200;                // Fasttid = tid,tid2 eller tid3 beroende på varvtal, startar alltid på 200 uS
    int spridardiff;                  // en individuell spridartidskorrigering
    int sprtroghetklar;               // ett klart värde för spridartidskorrigering
    int battVolt;                     // mäter systemspänning till spridare
    int atmtryck = 330;               // mäter atmosfärstrycket
    int ambTemp =300;                 // mäter omgivningstemperaturen
    byte analogval;                   // en switch/case till analogläsningen
    int variabel1;                    // bra att ha variabel 1
    int variabel2;                    // bra att ha variabel 2
    int turbotryck = 0;               // turbotryck
    int turboAirTemp = 300;           // komprimerad turboluft temp
    int sprstartkorr = 50;            // spridarstartkorrigering i uS spänningberoende.
    int engineTemp = 700;             // motortemp.
    
    void setup()                     
 {
 
   pinAsInput(vevpin);               // satt vevpin som ingång (2)                         
   pinAsInputPullUp(kampin);         // satt kampin som ingång (3)
   pinAsOutput(sprpins[pekare]);     // spridarutgångar satta som arrey (11,10,9,8)
   pinAsOutput(sprControl);          // en spridarutgång som blir hög varje gång en spridare öppnas (13)(Övervakningen)
   pinAsInputPullUp (disable);       // ECU väljare Hög = on, Låg = off (12)
   pinAsOutput(pulsutpin);           // satt pulsutpin som utgång (2 pulser per varv)(7)(övervakningen)
   //Serial.begin(250000);
 }
    //______________________________________________________________________
    void loop()
 {
        
                                    //Det får plats ca 1700 klockcykler mellan varje x tal(case) (1 till 17) 
                                    //Det tar lite mer än 100 mikrosek att läsa av en analogingång,
                                    //så ingen analogRead här, skall vara i case 16!
                                    
                                 
     if (digitalRead(disable)==LOW) //Disable låg stänger av ECU:n och gör den passiv
      {  
      puls = 0;                     //Genom att pulstiderna förblir 0.
      pinAsInput(sprpins[pekare]);  //Gör om spridarutgångarna till ingångar för att ej belasta
      pinAsInput(sprControl);       //Gör om spridarcontrollen till ingång för att ej belasta
      }
      
     else 
      {
      pinAsOutput(sprpins[pekare]); //Vid aktiv igen så gäller spridarutgångarna som utgångar igen.
      pinAsOutput(sprControl);      //Vid aktiv så gäller spridarcontrollen som utgång igen
      }                             //*Detta är normalläget, samma som i setup*
        
             
                    // Räknare för kamaxeln, stängs av efter 251 varv (502 motorvarv)
        
      if (kamtand <= 250)             // när tand 251 är räknad slutar den detektera kampin.
       { 
        if (digitalRead(kampin)== HIGH)// varje gång kamaxelns hempuls detekteras så resetas 4 räknaren
         { 
          pekare = 0;                 // resetas till 0. Denna funktion läses utanför switch.
          kamtand ++;                 // räknar upp kamtandräknaren vid varje kampin låg upp till max.
         }
       }
       
     switch (tand)                    // här startar switch och case, tandräknaren stegar fram ett steg (case)
  {
     case 0:          // Detta case ger första pulstid 
          delvalue = priv;            // Första pulstid läggs in som deltid 1
          senasteinsprfordroj = map(variabel1, 0,32 , 7.0,11.0); 
          //Serial.println(senasteinsprfordroj);
     break; 
      
     case 1:          // Detta case ger andra pulstid
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
          tidigasteinspr = map(variabel2,0,128 , 15,26);
          //Serial.println(tidigasteinspr);
     break;
       
     case 2:          // Detta case ger tredje pulstid
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break; 
       
                                     
     case 3:          // Detta case ger fjärde pulstid
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break;                          
       
     case 4:          // Detta case ger femte pulstid
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break;
     
      
     case 5:           // Detta case ger sexte pulstid
           delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop 
     break;          
       
     case 6:           // Detta case ger sjunde pulstid och spridarstartkorrigering     
           delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop (ca 50 uS)
           sprstartkorr =map(battVolt, 600, 1024, 0, 150); // batterispänningen blir spridartidskorrigering
     break;
       
     case 7:          // Detta case ger motorns börvärde från gaspoten som blir lägsta och högsta varvtal
           bduration =map(gas,0, 255, lagstavarv, hogstavarv); // ställs in högst upp 
                      // Och åttonde pulstid
           delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop ( ca 115)
     break;
       
     case 8:          // Detta case ger motorns verkliga fart baserat på dom 9 första tänderna. (660 - 115 uS vid normalvarv ca 800 till 4200 rpm.)
           mduration = delvalue/12;   // Motorns totala pulstid i mikrosek dividerat med 12 ger motorns duration
                      //  Och avgör om tillräcklig fart är uppnådd för motorstart              
           if(mduration >= minfart)  // motorn måste upp i x fart för att få bränsle, ställs högst upp (minfart i uS) 
            {                         
             mduration = 0;           // Om underfart, motorduration resetas
             delta = 0;               // och delta(insprutningstid)resetas ( ca 55 uS)
            }
     break;        
      
     case 9:          // Detta case räknar ut skillnaden mellan är och börvärde - 1 = error
          error = (mduration / bduration)-1; 
       if (error <=0.)                       // om error under noll
        {
         error = 0.;                         // förblir error 0 för att ej få minusvärden
        }
     break;        // error = felet i uS mellan är och börvärde för motorns fart (ca 50 uS)
     
      
     case 10:           // Detta case ger förtändningen
          starttandf = mduration /tidigasteinspr; // starttandf, ett flyt-tal = motorns duration/ minsta duration/max RPM. ställs högst upp
       if (starttandf >= senasteinsprfordroj)         // om fördröjning över målvärdet, som vid tex startvarv (ställs in högst upp)
        {                  
         starttandf = senasteinsprfordroj;            // blir det målvärdet ändå
        }
     break;
      
     case 11:           // Detta case för insprutningsfördröjning i gånger, ställs högst upp
          ondelay = (mduration * starttandf);  // tillslagsfördröjning = motorns duration * starttandsfördröjning (decimaltal)       
     break;                                  // Ondelay uS = mduration uS * starttandf i decimalform 
    
     case 12:          // Detta case ger motorns karaktärstik på arbetsvarv
     if (mduration >=161)                          // "mellanvarv"
      {                                            // Felkorrigeringsvärde som ger spridaröppningstid i uS 
       delta = mduration * error * aggrfaktorlag;  // aggrfaktor låg avgör hur mycket extra ontid spridarna får vid belastning lägre varv
        if (delta >= maxdeltalag * mduration)      // om delta är mer än max tillåten delta x mduration
         {
          delta = maxdeltalag * mduration;         // förblir delta max tillåten
         }                     
      }
     if (mduration <= 160)                        // "högvarv"
      {
       delta = mduration * error * aggrfaktorhog; // Felkorrigeringsvärde som ger spridaröppningstid i uS 
      }                                           // aggrfaktor hög avgör hur mycket extra on tid spridarna får vid belastning högre varv                          
     break;
 
     case 13:         // (används ej) Detta case bestämmer varvtalet när turbon skall börja regleras ner
     if (mduration <= turbostartregl)        
      {                                      // via kortare spridartider, ställs högst upp
       delta = delta - turbotryck + grundvarde - atmtryck + ambTemp - turboAirTemp;// korrigering för måltryck genom att minska öppningstiden i uS ;                        // används ej än så delta förblir delta oförändrat            
    // 1500  =  1500  -     0     +   330      -    330   +   300   -    300 full gas ingen turboladdning
    // 1200  =  1500  -    200    +   330      -    330   +   300   -    400 full gas, turbon laddar, ttemp stiger
    // 1190  =  1500  -    200    +   330      -    280   +   290   -    450 f. g, t. laddar, ttemp stiger, utetryck/temp sjunker 
    //  940  =  1000  -    100    +   330      -    280   +   290   -    300 marcheffekt på höjd en dag...
    //  1500 =  1500  -    (0)    +  (330)     -   (330)  +  (300)  -   (300) 
       if (delta <=0)
        {
         delta = 0;                          // för att undvika minusvärden
        }
      }
                    // och mjukstartsfunktion
     if (mduration >= 700)                   // Vid lite över startfart
      {
       delta = lagmangd * mduration;         // blir det mjukstart som justeras via lågmängd högst upp              
      }
      
                   // och absolut längsta insprutningstid
     if (delta + ondelay >= totaltid * mduration) // om delta och ondelay i uS blir mer än totaltid
      {            // så justeras endast delta ner
       delta = (totaltid * mduration) - ondelay;// Absolut max insprutningstid (delta), ställs högst upp
      }           // denna justering gäller bara på högvarv, hög belastning (< 50 uS)                      
     break;                                                                                 
     
     case 14:   // detta case räknar ut tidsdiff per spridare plus systemspänningsdiff
     sprtroghetklar = sprtroghet + spridardiff - sprstartkorr; // spridartröghet klart värde räknas ut här
               //       450      + (0 till 50) - (0 till 150)
     break;    //       450      +     0       -      50

     case 15:    // Detta case är insprutningsfasen "spridar-on-off-mode"
     if (ondelay >=10000)                     // Om ondelay är mer än 10000 uS. ( < 300RPM )
       {                                      // går tiden över från uS till mS.
        ondelay = ondelay/1000;               // Ondelay uS blir mS.
        delta = delta/1000;                   // Delta uS blir mS.
                // och startmängden vid motorstart
      if ((delta * 2)>= startmangd)           // här ställs startmängden in (högst upp) 
       {
        delta = startmangd;                   // så det blir rätt startmängd/slag (5 = 0,75 tänder = 4,5 vevgrader)
       }
        delay(ondelay);                       // Fördröjer starttiden x antal mS beroende på varvtalet (mdurationen)
        digitalWrite (sprpins[pekare],HIGH);  // Spridarpinne hög,insprutning börjar. sprpins [pekare 8,9,10 eller 11]. 
        digitalWrite(sprControl, HIGH);       // Kontrollpinne som går hög vid varje insprutningstillfälle.
        delay(delta);                         // Här läggs insprutningstiden in som sen fördröjer processorn i delta mS
        digitalWrite (sprpins[pekare],LOW);   // Spridarpinne låg,insprutning avslutad sprpins [pekare 8,9,10 eller 11].
        digitalWrite (sprControl, LOW);       // Kontrollpinne som går låg efter varje insprutningstillfälle.
       }             // Denna del av caset används vid låga farter såsom start/lågvarv < 250 RPM
     
     else                                     // Eller om delay är mindre än 14000 uS. (> 250 RPM, normalfall)
       {
        ondelay = ondelay - sprtroghetklar;       // minskar ondelaytiden med ca 450 uS (kompenserar spridarens tröghet att öppna)
        if (delta > 30)                       // Delta under 30 uS skall inte ha något värde.
         {
         delta = delta + sprtroghetklar;          // Delta över 30 blir x delta + kompensation för spridarens tröghet att öppna
         }
        
        delayMicroseconds(ondelay);           // Fördröjer starttiden i ondelay uS beroende på varvtalet (mdurationen)
        digitalWrite (sprpins[pekare],HIGH);  // Spridarpinne hög,insprutning börjar. sprpins [pekare 11,10,9 eller 8]. 
        digitalWrite(sprControl, HIGH);       // Kontrollpinne som går hög vid varje insprutningstillfälle.
        delayMicroseconds(delta);             // Här läggs insprutningstiden in som sen fördröjer processorn att ha spridare on i x (delta) uS
        digitalWrite (sprpins[pekare],LOW);   // insprutning avslutad sprpins [pekare 8,9,10 eller 11] går låg.
        digitalWrite (sprControl, LOW);       // Kontrollpinne som går låg efter varje insprutningstillfälle.
       }                   // Denna del av caset används vid varv (250 -> RPM = nästan alltid, förutom vid motorstart)
     break;                // Dessa case tar 3 till 10 tänder att genomföra beroende på varvtal och belastning
  
     case 16:                                 // är mellan  tand 19 och 25
          switch (analogval)
      {
       case 0:    
         gas = analogRead(A0)>>2;           // analogingång för gasreglage 0 till 255( skiftad 2 gånger)
        // turbotryck = analogRead(A4);        // analogingång för turbotryck 0 till 1024 
       break;

       case 1:
         variabel1 = analogRead(A1)>>5;        //(enginetmp) 0 till 512 0,1 Volt/10 grad använder LM-35 tempgivare (skiftad 1 gång)
         battVolt = analogRead(A7);
       break;

       case 2:
         gas = analogRead(A0)>>2;           // analogingång för gasreglage 0 till 255( skiftad 2 gånger)
        // turbotryck = analogRead(A4);        // analogingång för turbotryck 0 till 127 (skiftad 3 gånger)ambTemp = analogRead(A3);
       break;

       case 3:
         variabel2 = analogRead(A2)>>3;        // (turboAirTemp) skall vara turboAirTemp,
         //atmtryck = analogRead(A6);          // analogingång för lufttrycket max 255
       break;

       case 4:
         gas = analogRead(A0)>>2;           // analogingång för gasreglage 0 till 255( skiftad 2 gånger)
        // turbotryck = analogRead(A4);        // analogingång för turbotryck 0 till 127 (skiftad 3 gånger)
       break;

       case 5:
       //  variabel1 = analogRead(A5)>>5;        // A7!!
       //  ambTemp = analogRead(A3);
       break;                                
      }
      analogval ++;                             // räkna upp analogval 1 steg   
      if (analogval == 5)
        {
         analogval = 0;
        }   
    break;   // analalogRead tar ca 120 uS att läsa = 1-2 tänder vid fullvarv
                            
                                      
  
     
 }
     //______________________________________________________________________________________________________   
      
      tand  ++ ;                                // räkna upp ett steg efter varje genomfört case, (kommer via pulseIn()funkt)
      priv = puls;                              // lägger in den förra pulstiden "puls" i värdet "priv" (uS)

       if (mduration >1800)                     // Om motorn går på allra lägsta varv (start)
       {
        fasttid = tid1;                         // används tid1 (4000 uS i grundinställning)
       }
       if ((mduration >400)||(mduration <1800)) // Om motorn går mellan lägsta varv upp till ca 1100 RPM
        {
         fasttid = tid2;                        // används tid2 (1200 uS i grundinställning)
        }
       if (mduration <400)                      // Om motorn går över 1100 RPM
        {
         fasttid = tid3;                        // används tid3 (200 uS i grundinställning)
        }
        
    puls = pulseIn(vevpin, LOW, 30000);       // PulseIn ger durationen på varje puls från vevaxelgivare(tand = case).
                                              // vid stillastående motor blir det en timeout 
                                              // efter 0,03 Sek 
                       
      if  (puls > priv + fasttid)             // jämför om ny pulstid i uS är större än föregående
       {
        digitalWrite (pulsutpin, HIGH);       // utpin blir hög när pulsluckan är identifierad
         
         tand = 0;                            // och resetar 0 till 28 räknaren 
         
         pekare = pekare + 1;                 //  och räknar upp spridarpinpekräknare
         
         if (pekare > 3)                      // när fjärde pinnen är nådd börjar den om igen
          {
          pekare = 0;                         // spridarpinne 1 är igång igen (1 = D11)
          }         // Denna if-sats är bara sann varje halv-varv vid luckan 
       }
        
        if (pekare == 0)
        {
         spridardiff = sprdiff4;                
        }

       if (pekare == 1)
        {
         spridardiff = sprdiff2;
        }

       if (pekare == 2)
        {
         spridardiff = sprdiff1;
        }

       if (pekare == 3)
        {
         spridardiff = sprdiff3;
        }              
        
        
        if  (puls < priv - fasttid)           // jämför on ny pulstid är mindre än förgående (luckan)     
         {   
         digitalWrite (pulsutpin, LOW);       // och utpin blir låg igen nästa puls i pulståget.
         }         // Denna if-sats är bara sann efter det att luckan är slut och första pulsen är detekterad

        
 }        
        
                                              // end void loop()
Skriv svar