ECU- styrning till en VW pumpdysediesel.

Berätta om dina pågående projekt.
larky
Inlägg: 1095
Blev medlem: 7 mars 2007, 07:54:18
Ort: Skellefteå
Kontakt:

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av larky »

Kul med framsteg!
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. En ny egenhet är att med den gamla vevaxelgivaren så utgick jag från ÖDP var tand 22:s framkant, all mina insprutningsöppningstider är baserade på detta. Nu när jag bytt givare till en annan typ så blir tand 22 10-12 grader för tidig. Jag har blivit tvungen att ändra insprutningsbörjan 10-12 grader framåt. Men dom gamla spridaröppningstiderna kvar så blir motorn okörbar, inte ens startbar innan jag fick sänkt "tändningen". Detta spelar egentligen ingen roll då jag mjukvaruändrar tills det blir bra igen. Men en undran finns ju, varför blir det på detta viset???
Senast redigerad av Janson1 20 januari 2019, 22:36:13, redigerad totalt 1 gång.
farskost
Inlägg: 454
Blev medlem: 17 april 2006, 19:55:21
Ort: Mölndal

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av farskost »

Kan den nya givaren vara känslig på ett annat område eller helt enkelt inte sitta på samma plats som den tidigare? Eller har den gamla givaren haft något fel som lett till en fördröjning/fasförskjutning i utsignalen? En sista gissning kan vara pulsformen ut, den ena kanske har brantare flanker och därmed når nivån där den detekterad snabbare?
Eller så är det en blandning :)
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, det borde nästan vara en blandning av allt i hopa... Givaren sitter ju fysiskt där den sitter, kan flytta sig 1 mm åt var håll. Eftersom den nya givaren är tvåkanalig så har den två känselkroppar och dom måste sitta förskjutna till varandra. Om man tittar in i hålet så ser man i princip två tänder. Det ända rimliga är att den nya givaren börjar detektera tanden långt innan den är framme men då kommer ju följdfrågan, var detekterar den förra tanden? Det är denna givare : https://se.rs-online.com/web/p/hall-eff ... s/8223747/
Det är inte det bästa databladet och dess länkar funkar inte heller men om man går direkt till Honeywell så finns det mer. Jag kan däremot inte se va själva känselkropparna sitter... Jag har nog gjort en tankevurpa när det gäller min programmering, förtändningen som ökar vid ökat varvtal har nu fått ett knä/knyck så nu minskar förtändningen igen efter ett viss varv och motorn tappar rejält med ork. Jag kan bara inte riktigt hitta varför, men jobbar på det!
farskost
Inlägg: 454
Blev medlem: 17 april 2006, 19:55:21
Ort: Mölndal

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av farskost »

På sidan två, längst ner i mitten, i detta databladet så är det ett diagram som visar skillnaden i utgång från de två utkanalerna. Använder du kanal A eller B?
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 »

Jag kan inte hitta databladet just nu men. Jag har provat först A, men den lämnar för mig fel polaritet vid metall. Sedan så B som för mig lämnar rätt. Då jag nu inte är riktigt säker på vilken som A resp B så är det i alla fall stift 4 som passar mig bäst.
farkost: har du möjlighet att länka rätt sida?
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 "senaste" koden också... Jag tror felet ligger någonstans runt case 11, 12, och nedre delen av 13. Felet uppkommer vid 160 uS vilket är "omslagmellanhogvarv = 160;" Så nåt händer där???

Kod: Markera allt

    // Förändrad 2019-01-04 och inlagd 2019-01-04 förtändningen går åt fel håll på höga varv...
    // max ändrat till strax under 4000 rpm ua. Tändläget verkar ua ochså.
    // nu läser den av alla analogread i följd om 2 och 2 = fungerar
    // batterispänningens inverkan grovjusterad = fungerar
    // en individuell möjlig injustering per spridare finns med. Fungerar
    // ändrad i gasen så analogvärde 20 är tomgång och analogvärde 210 är fullfart Fungerar
    // ändrad till att starta insprutningsmodulen på tand 15 fungerar
    // mjukstarten är förbättrad och går in vid ca 200 RPM och varar till ca 450 RPM fungerar
    // några fler constanter har kommit till bla. gaspotmin, gaspotmax, utanvärde, fungerar
    // En dubbel förtändning har kommit till, en för start och en för drift.
    
            // här är olika justerbara parametrar som påverkar enligt följande:
    const byte totaltid =13;            // totaltid för case 15: x * motorns duration (10)
    const int lagstavarv = 480;         // tomgångsvarvet 500 uS motsvarar ca 800 Rpm (530)
    byte hogstavarv = 110;               // fullgasvarvet 100 uS motsvarar ca 4200 RPM  (90)
    const byte aggrfaktorlag = 3;       // hur mycket spridar PWM skall öka vid belastning mellanvarv (3)
    const byte aggrfaktorhog = 10;       // hur mycket spridar PWM skall öka vid belastning högvarv (7)
    const int minfart = 3800;           // lägsta startvarv för spridarfunktion (3800 = 131 RPM)
    const byte startmangd = 20;         // avgör max startmängd 16  ca 19 grader ontid (16) mellan 131 till 200 RPM (absolut första början)
    const float maxdeltalag = 3.0;      // max insprutningstid mellanvarv mdutation * 3.0 ger 1,5 vevaxelpulser = 9 gr ontid (3.0) max ontid vid 450 till 2000 RPM
    const byte lagmangd = 5;            // max lågvarvsmängd 2 = 1 vevaxelpuls = 6 grader ontid (under tomgångsvarv)(2) 200 till 450 RPM (mjukstartsmängd)
    const int tid1 = 2500;              // tid 1 är för att hitta pulsluckan vid start/lågvarv < 300 RPM (2500)                            
    const int tid2 = 1500;              // tid 2 är för att hitta pulsluckan i mellanvarv 1100--> (1500)
    const int tid3 = 800;              // tid 3 är för att hitta pulsluckan i alla andra förekommande varv 1100--> (1000)
    const int tid4 = 90;               // tid 4 är för att hitta pulsluckan på högsta varvtal (100)
    float senasteinspr = 9.0;           // senaste insprutningstid (vid start upp till tomgång)(6.0 = 3 vevaxelpulser = 18 grader delaytid(6.0) Tomgångsförtändning (högre tal ger senare tändning)
    const float senasteinsprdrift =10.5;// Vid tomgång/drift ges en ny "senasteinsprutningstid" som behålls sedan.
    const byte tidigasteinspr =180;     // kortaste insprutningsfördröjning vid maxvarv, högre tal ger tidigare tändning(110)(max 255)
    const int sprtroghet = 400;         // ett grundvärde för spridarnas påslagsfördröjning i uS. (400)                          
    const int sprdiff1 = 0;             // en ev tidigareläggning av spridare 1 om den avviker i startfördröjning (uS)
    const int sprdiff2 = 0;             // en ev tidigareläggning av spridare 2 om den avviker i startfördröjning (uS)
    const int sprdiff3 = 0;             // en ev tidigareläggning av spridare 3 om den avviker i startfördröjning (uS)
    const int sprdiff4 = 0;             // en ev tidigareläggning av spridare 4 om den avviker i startfördröjning (uS)                                 
    const byte maxstopp = 60;           // en varvtalsbegränsare som + på högstavarv (microsek)(60)
    const int omslagstartdrift = 900;   // Bestämmer när mjukstarten går ur (omslagspunkt) (900 = brytvarv 450 RPM)
    const int omslagmellanhogvarv = 160;// bestämmer omslaget när aggresionsfaktor mellan/hög växlar (ca 2000 RPM)
    const int omslagmillimicro= 13000;  // omslag från milli till micro i case 15 (vid startvarv ca 200 RPM, baseras på ondelay i us)
    const byte utanvarde = 25;          // om delta under vist värde utanvärde, nollas
    const byte gaspotmin = 20;          // gaspotens minsta tillåtna värde
    const byte gaspotmax = 210;         // gaspotens största tillåtna värde
   
    int vevpin = 2;                   // pulsingång vevaxelgivare.
    int kampin = 3;                   // kamaxelgivarens ingång.
    int varvpin = 4;                  // en varvbegränsningspinne  
    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 (mS inne i case 15)
    long puls, priv, delta;           // senaste, föregående och delta (totalöppningstid) i uS(mS)
    float error;                      // error = varvtalsfelet i decimalform 
    float starttandf, finKorr;        // starttand i decimalform för att få startfördröjningstid och finkorrigering av öppninstiden +-.
    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 x tänder (max 255), startar på 0
    int fasttid = 300;                // Fasttid = börjar alltid på 300 för att sedan ställa in mer rätt (tid1 till tid4)
    byte analogval;                   // En switch/case till analogread
    int battVolt = 400;               // mäter systemspänning till spridare grundsatt till 400 för att snabba på start
    int sprstartkorr = 400;           // spridarstartkorregering i uS, spänningsberoende grundsatt till 400 för att snabba på start
    int sprtroghetklar;               // korrektion för den inbyggda påslagströgheten i spridarna
    int spridardiff;                  // en ev. individuell spridartid korrigering (uS)
    int variabel1;

    
    void setup()                     
 {
 
   pinMode(vevpin, INPUT_PULLUP);     // satt vevpin som ingång (2) Testar nu med pullup...                        
   pinMode(kampin, INPUT);            // satt kampin som ingång (3)
   pinMode(sprpins[pekare], OUTPUT);  // spridarutgångar satta som arrey (11,10,9,8)
   pinMode(sprControl, OUTPUT);       // en spridarutgång som blir hög varje gång en spridare öppnas (13)(Övervakningen)
   pinMode(Disable, INPUT_PULLUP);    // ECU väljare Hög = on, Låg = off (12)
   pinMode(pulsutpin, OUTPUT);        // satt pulsutpin som utgång (2 pulser per varv)(7)(övervakningen)
   pinMode(varvpin, INPUT_PULLUP);    // satt varvpin som ingång (4) varvtalsbegränsare
   //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
      {  
      delta = 0;                        // Genom att delta (insprutningstid) förblir 0.
      pinMode(sprpins[pekare], INPUT);  // Gör om spridarutgångarna till ingångar för att ej belasta
      pinMode(sprControl, INPUT);       // Gör om spridarcontrollen till ingång för att ej belasta
      }
      
     else 
      {
      pinMode(sprpins[pekare], OUTPUT); // Vid aktiv igen så gäller spridarutgångarna som utgångar igen.
      pinMode(sprControl, OUTPUT);      // Vid aktiv så gäller spridarcontrollen som utgång igen
      }                            //*Detta är normalläget, samma som i setup*

      if(digitalRead(varvpin)==LOW)  // om varvpin är låg 
      {
        hogstavarv = hogstavarv + maxstopp; // så blir maxvarv tex 2500 Rpm
      }

     else
     {
      // maxvarv blir enligt tidigare
     }
             
 
        
      if (kamtand <= 256)              // när kamtanden är räknad 251 gånger så 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 1:               // Detta case ger första pulstid 
          delvalue = priv;            // Första pulstid läggs in som deltid 1
     break; 
      
     case 2:              // Detta case ger andra pulstid + batterispänningskontroll
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
          sprstartkorr =map(battVolt, 150, 700, 0, 400); // batterispänningen blir spridartidskorrigering
          sprstartkorr = constrain(sprstartkorr,200,400);// för att hålla färdigvärdet inom 200-400
     break;
       
     case 3:             // Detta case ger tredje pulstid
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break; 
       
                                     
     case 4:             // Detta case ger fjärde pulstid
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break;                          
       
     case 5:             // Detta case ger femte pulstid
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break;
     
      
     case 6:              // Detta case ger sexte pulstid
           delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop 
     break;          
       
     case 7:              // Detta case ger sjunde pulstid      
           delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break;
       
     case 8:             // Detta case ger motorns börvärde från gaspoten som blir lägsta och högsta varvtal
                         // och åttonde pulstid
           gas = constrain(gas,gaspotmin, gaspotmax);                         // först skall invärdet vara mellan min och max oavsett gaspotens verkliga värde (om utanför)        
           bduration =map (gas,gaspotmin, gaspotmax, lagstavarv, hogstavarv); // gör om gas analogvärde till lägsta/högsta uS värde 
           delvalue = priv + delvalue;                           // föregående pulstid + föregående deltid läggs ihop
     break;
       
     case 9:            //Detta case ger nionde pulstid
           delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break;
     
     case 10:   // 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
         //               400      + 20/0/0/20   -  (200-400)
                // och ger motorns verkliga fart baserat på dom 11 första tänderna 
       delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop           
       mduration = delvalue/14;   // Motorns totala pulstid i mikrosek dividerat med 14 ger motorns duration vid drift 
      // Serial.println(mduration);      
               // och 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;        // felet i uS mellan är och börvärde för motorns fart 
                        
    
     case 11:           // Detta case för insprutningsfördröjning i gånger, ställs högst upp               
       starttandf = mduration /tidigasteinspr; // starttandf, ett flyt-tal = motorns duration/ minsta duration/max RPM. 
       if (starttandf >= senasteinspr)         // om fördröjning över målvärdet, som vid tex startvarv 
        {                  
         starttandf = senasteinspr;            // blir det målvärdet ändå
        }
     break;
     
 
     case 12:                     // Detta case ger förtändningen 
        ondelay = (mduration * starttandf);  // tillslagsfördröjning = motorns duration * starttandsfördröjning (decimaltal)       
     break;                                  // Ondelay uS = mduration uS * starttandf i decimalform 
                                                               
     case 13:          // Detta case ger motorns karaktärstik på arbetsvarv       Mellan 160 uS och 900 uS
     if ((mduration >=omslagmellanhogvarv)||(mduration <=omslagstartdrift))  // från ca 450 RPM och upp till ca 2000 RPM (mer än 160 men mindre än 900
      {                                            // 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 < omslagmellanhogvarv)                        // "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 14:         // Detta case ger mjukstarten
    
     if (mduration >= omslagstartdrift)          // Vid lite över startfart  mellan 200 RPM till ca 450 RPM
      {
       delta = lagmangd * mduration;            // blir det mjukstart som justeras via lågmängd              
      }
     
                    // 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), 
      }           // denna justering gäller bara på högvarv, hög belastning
     break;
     
     
     case 16:    // Detta case är insprutningsfasen "spridar-on-off-mode"
     if (ondelay >=omslagmillimicro)          // Om ondelay är mer än 13000 uS. (från 131 till 203 RPM räknas alla spridarvärden i mS)13000 = 203 RPM
       {                                      // går tiden över från uS till mS.
        ondelay = ondelay/1000;               // Ondelay uS blir mS.
        delta = delta/1000;                   // Delta uS blir mS.

                       // 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, (minfart i uS) 
        {                         
         delta = 0;                           // vid underfart, delta(insprutningstid)nollas
        }
                // och startmängden vid motorstart
       if ((delta * 4)>= startmangd)          // här ställs startmängden in  
        {
         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. spridare x strömsätts [pekare 8,9,10 eller 11]. 
        digitalWrite(sprControl, HIGH);       // Kontrollpinne som blir 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 spridare x stängs av  [pekare 8,9,10 eller 11].
        digitalWrite (sprControl, LOW);       // Kontrollpinne som går tillbaka till låg efter varje insprutningstillfälle.
       }                        // Detta paket används vid låga farter såsom start/lågvarv < 203 RPM
     
     else                                     // Eller om delay är mindre än 13000 uS. (> 203 RPM)
        {
        if (delta > utanvarde)                       // Delta under utanvärde uS har inget värde
        {
        delta = delta + sprtroghetklar;       // Delta blir  delta + trögheten i spridaren (ca 200-500 uS)som tröghetskompensation
        }
        ondelay = ondelay - sprtroghetklar;   // tidigarelägger insprutningstart med hänsyn till spridartrögheten
        delayMicroseconds(ondelay);           // Fördröjer starttiden i ondelay uS beroende på varvtalet (mdurationen)
        digitalWrite (sprpins[pekare],HIGH);  // Insprutning börjar. spridare x strömsätts [pekare 11,10,9 eller 8]. 
        digitalWrite(sprControl, HIGH);       // Kontrollpinne som blir hög vid varje insprutningstillfälle.
        delayMicroseconds(delta);             // Här läggs insprutningstiden in som sen fördröjer processorn i delta uS
        digitalWrite (sprpins[pekare],LOW);   // Spridarpinne låg,insprutning avslutad spridare x stängs av [pekare 8,9,10 eller 11] 
        digitalWrite (sprControl, LOW);       // Kontrollpinne som går tillbaka till låg efter varje insprutningstillfälle.
       }                                      //Detta paket används vid varv (203 -> RPM = nästan alltid, förutom vid motorstart)
     break;              //Dessa paket tar 1 till 6 tänder att genomföra beroende på varvtal och belastning

     case 17:
         if (mduration < omslagstartdrift)
          {
           senasteinspr = senasteinsprdrift;
          }
        else 
        {
          
        }
     break;
       
     case 18:                       // är mellan  tand 17 och 23
          switch (analogval)
      {
        case 0:   
           gas = analogRead(A0)>>2;           // analogingång för gasreglage 0 till 255( skiftad 2 gånger)
        break;  

        case 1:
           battVolt = analogRead(A7);          // skall vara A7!!
        break;

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

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

        case 5:
           // tom
        break;                                
       }
       analogval ++;                             // räkna upp analogval 1 steg   
      if (analogval > 5)                        // när analogval har blivit 5 så
        {
         analogval = 0;                          // resettas analogval till 0 igen
        }   
    break;   // analalogRead tar ca 120 uS att läsa = 1-2 tänder vid fullvarv
  }
     //______________________________________________________________________________________________________   
        tand  ++ ;                                  // räkna upp ett steg för varje ny puls, kommer via pulseIn()funkt.
        priv = puls;                                // lägger in den förra pulstiden i värdet "priv" (uS)
       
      if (mduration >1800)                          // när motorn går på allra lägsta varv (start)
       {
        fasttid = tid1;                             // används tid1 
       } 
       
      if ((mduration > 1200)|| (mduration < 1800)) // om motorn går lite mer än startvarv
       {
        fasttid = tid2;                            // används tid2
       } 
       
      if ((mduration > 500)||(mduration < 1200))  // Om motorn går under 1100 RPM
       {
       fasttid = tid3;                            // används tid3 
       }
       
      if (mduration <500)                        // Om motorn går över 1100 RPM
       {
       fasttid = tid4;                           // används tid4 (dom flesta driftvarv) 
       }
        
        puls = pulseIn(vevpin, LOW, 30000);   // Detta kommando väntar in nästa puls (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 + fasttid.
       {
        digitalWrite (pulsutpin, HIGH);       // utpin blir hög när pulsluckan återgår till pulser
         
    tand = 0;         // resetar 0 till 28 räknaren som har hunnit räkna mellan 16 och 27 tänder

    pekare ++;                                //  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)                           // om spridarpekaren pekar på 0 (ben D11)
  {
    spridardiff = sprdiff4;                  // skall det individuella värdet för spridare 4 hämtas
  }

  if (pekare == 1)                           // om spridarpekaren pekar på 1 (ben D10)
  {
    spridardiff = sprdiff2;                  // skall det individuella värdet för spridare 2 hämtas
  }

  if (pekare == 2)                           // om osv... upp till 3 (fjärde spridaren)
  {
    spridardiff = sprdiff1;                  // ben D9
  }

  if (pekare == 3)
  {
    spridardiff = sprdiff3;                 // ben D8
  }
   
       if  (puls < priv - fasttid)            // jämför on ny pulstid är mindre än förgående - fasttid.     
         {   
         digitalWrite (pulsutpin, LOW);       // utpin blir låg igen nästa uppgång i pulståget.
         } 
 }        
        
                                              // end void loop()
  
farskost
Inlägg: 454
Blev medlem: 17 april 2006, 19:55:21
Ort: Mölndal

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av farskost »

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 »

Jag ser nu på databladet att A skall komma först och B sedan men min motor går ju åt andra hållet så nu kommer B först. Det kan förklara några grader, men långt ifrån alla 10-12...
Edit: ser nu att även givaren sitter åt andra hållet så min givare är monterad som exemplet och jag använder B-kanalen.
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 »

Det här med Arduino, det är lätt att programmera i men jag vet inte alltid vad den egentligen gör under skalet... Jag har hittat varför förtändningen backar på högre varvtal fast jag programmerat den att tidigarelägga tändningen (insprutningsstart) Varje case tar ju ett visst antal uS, lite olika beroende på hur mycket uträkningar den skall göra. Det verkar som en eller två case tar längre tid än tillgängligt och då hoppar den helt enkelt sonika över en tand eller två och när tand 16 (case 16) är aktivt enligt Arduinon då är den på 17 eller 18 och utgår därifrån och tändningen blir 6-12 grader för sent... Jag har ju börjat programmera med interrupt, kanske blir tvungen att fortsätta på den skapelsen. Sen finns det ju andra sett att få ett program i Atmegan. Men jag ser en ganska stor uppförbacke inför att byta miljö/tänk/IDE, allt utom Atmegan...
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Bosen »

Problemen du har får du inte hjälp med bara för att du byter språk/miljö. Interrupt är rätt väg att gå. Du låser ju dina beräkningar till vissa tillfällen och det är fel, beräkningarna skall göras hela tidrn när det finns tid.
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 »

Jag har börjat med en ny ECU som bygger på interrupt men först vill jag nog få till den gamla ECU:n att fungera, den har ju ändå fungerat förut innan vevaxelgivare 1 gav upp. Jag får inte ur den gamla ECU:n ur skallen innan den funkar bra. Sen kommer jag börja på den nya. Orkar nog inte köra två projekt samtidigt...
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 »

Jag blev tipsad om Arduino due. En 32 bitars processor med av mer allt, den funkar men inte bra. Dels dör den varje gång gasen är lägre än varvtalet. dels måste man starta med reset varje gång, det räcker inte med strömsättning. Att den dör vi 0-gas lite över tomgång kan nog bero på nåt med om man skall välja int eller long osv? Hur behandlar den byte i en 32 bitars processor?
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 lite har hänt sedan sist. Arduino med 32 bitars ARM processor funkar dålig så de har jag lagt åt sidan så länge. Jag fick en ny givare för ett par dagar sedan men den funkar ännu sämre... Nu har jag vevaxelgivaren från Honeywell igen och blir nog tvungen att använda vidare den. Jag har för övrigt hittat felet varför tändningen blev senare igen på högre varv. Vissa uträkningar tar så lång tid att det blir en extra tand i verkligheten som inte programmet hinner med pga för mycket jobb. Ja här skulle interrupt suttit fint? Jag har nu stuva om i programmet där jag trott dom största flaskhalsarna var inom dom olika case:n. Jag passade på at lägga in en markör på dom tyngsta casen. jag skrev helt enkelt in en tänd/släck kommando i slutet på ett par case och tittade sen med skopet var i case:t tänd/släck pulsen hamnade. På låga varv hamnade den alldeles till höger om start på case:t vid +3000 Rpm så låg pulsen lie efter mitten, vid 4000 Rpm låg pulsen på ca 75 % av case:t. alltså var det inte där det sket sig... Kom sedan på att det är ganska många programrader efter pulseIn() och innan första case:t (case 1:) och det var detta som snodde tiden! Nu har jag gjort om lite och nu tror jag det bör räcka till?
En bild på mina "markörer", här på tomgång.
20190107_205908.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
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 har jag fått hyfsad ordning på styreriet (ECU:n) jag är väl uppe i MK-91 minst... Efter en rejäl omstuvning av rader och ändringar så funkar det hyfsat bra. Nu följer den upp till 4500 RPM i alla lägen och max är ju satt till 4000 ev 4200 RPM. Däremot så börjar det metalliska klingande ljudet bli högre? Eller inbillar jag mig bara? Ett stelt och fast svänghjul kommer nog ganska högt på listan.
Kallstart under -5 grader går inte, jag har ganska långa insprutningstider men det räcker ändå inte till... Nästa steg blir att tidigarelägga insprutningsbörjan några grader till och förlänga on tiden ytterligare. Nu har jag monterat en sk "thermostart" (en liten brännare i insugningsröret som är el/dieseldriven). Dom brukar göra underverk på alla andra dieselmotorer utan att skada motorn. Om man kör med eter/startgas som det säljs under så fördärvar man en dieselmotor väldigt lätt... Jag har bestämt mig för att köra vidare med Honeywell-givaren och programmerar vidare utifrån den. Den passar hyfsat rent mekaniskt, den kommer i samma läge varje gång man plockar med den, det är nog det bästa alternativet.
Skriv svar