Svenska ElektronikForumet
https://elektronikforumet.com/forum/

ECU- styrning till en VW pumpdysediesel.
https://elektronikforumet.com/forum/viewtopic.php?f=3&t=85073

Författare:  Janson1 [ 09.26 2016-12-01 ]
Inläggsrubrik:  ECU- styrning till en VW pumpdysediesel.

Hej alla. Jag är helt ny på detta forum och jag har ett projekt sedan flera år tillbaka, att bygga en egen ECU till en VW dieselmotor med separata pumpelement per cylinder (4 st). 2002 byggde jag en hårdvara för detta och tilltänkt processor var PIC16F877 i PLCC 44 utförande. Hela projektet har gått i stå pga att jag inte kunde och kan inte i dag heller programmera kretsen...
Nu har det kommit Arduino och jag kar köpt ett kit och faktiskt fått igång programmering på 0 nivå, med hjälp av boken och div färdiga projekt kan jag i alla fall få in dom i min processor och det funkar men till ingen nytta.
Vidare ritade jag ganska mycket mönsterkort några år i början på detta årtusende. Jag hade ett program som hette Protel EDA client 3,5
och som tyvärr har kommit bort med alla datorbyten mm, så det önskar jag hitta igen. I dag har jag ett halvt gratisprogram från Eagle och jag kan inte ens hitta ett footprint.bibliotek...
Jag har kort och gott kört fast och behöver nog nya upplägg och nya infallsvinklar...

Författare:  tecno [ 09.36 2016-12-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ta en titt på http://www.diptrace.com/ istället.

Författare:  Janson1 [ 10.37 2016-12-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Tack tecno, det här programmet kommer jag igång med direkt, det är ganska likt mitt gamla.

Författare:  Janson1 [ 20.46 2016-12-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ingen som har grejat med sånt här förut?

Författare:  Janson1 [ 07.20 2016-12-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ok, här är lite data och "kravbild" vad som krävs och vad som behövs.
Analoga insignaler: Gaspot, vattentemp, turbotrycksgivare, atmosfärsgivare, oljetemp? Oljetryck?
Digitala insignaler: Vevaxelgivare, kamaxelgivare.
Digitala utgångar: 4 st spridare (elektromagneterna) en varvräknarutgång av något slag, frekvens eller PWM.
Gärna en display och knappar så man kan göra små justeringar av tex. öpnningstiden av spridarna, detta kopplat till ett litet seriellt minne som förändringsdatan hamnar.
Själva motorns utsignaler är väl beskrivet i VW:s manual SSP 209 som finns på nätet, bara att söka på detta.
Maxvarv sätter jag till 4200 rpm vilket ger 70 rps= 0,014 sek/varv
Vid max varv och nästan ingen belastning uppskattar jag spridartiden till 5 grader
5 grader av 360 grader får jag till 0,19 millisekunder om jag fått nollorna rätt??
Detta måste tilltänkt krets (Arduino?) klara.
Det första man skall fokusera på är nog att ta hand om vevaxelpulserna, det kommer 28 st sedan ett uppehåll sedan 28 till. Det är dom som skall styra hela förloppet men först måste Arduinon hitta luckan mellan två 28 pulståg.
Hur kommer man igång? Hur skall man tänka?

Författare:  Magnus_K [ 11.02 2016-12-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hej Janson1!

När det kommer till pulståget (bild nedan) så går det lösa på flera sätt.
Spontant tänker jag på att låta en timer snurra på i Arduinon och låta denna nollas vid varje puls, skulle timern "slå i taket" så innebär det ett glapp mellan pulserna, dvs mellanrummet.
Problemet blir dock det varierande varvtalet som då även påverkar tiden mellan pulserna. Det kan man nog lösa genom att låta tiden mellan glappen avgöra hur högt till tak pulstimern ska ha.
Du kan nog få mycket bättre lösningar från andra här på forumet, men för att ge dig en idé.

Angående CAD-program så kika runt lite på forumet under FAQ och Mjukvaru-kategorierna.Ämnet har diskuterats mycket :) . Dom som oftas brukar komma på tal tror jag är KiCAD, Eagle, Diptrace och en till som jag inte minns namnet på nu.

Bilaga:
Vevpulser.JPG

Författare:  stenD [ 16.41 2016-12-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

kan inte detta vara nått? http://megasquirt.info/

Författare:  Janson1 [ 22.14 2016-12-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ang kretskortscad så har det löst sig, det blev diptrace och det skall jag försöka lära mig så gott det går.
Jag har faktiskt blivit föreslagen en timer som skall nollas vid varje puls, jag tror 500 khz skulle funka från lägsta till högsta varv.
Däremot kommer jag inte att kunna programmera detta helt själv så där behöver jag hjälp för att komma igång.
Jag har nyligen köpt mitt Arduinokit och är väl bara i startgroparna...
Jag läser på om programmering på kvällarna när tid finns och jag gör även små projekt som jag sen försöker bygga om och få annan funktion, ibland lyckas jag, ibland inte.
Först måste timern aktiveras och rätt delning (prescaler) företagas med 16 Mhz som grundfrekvens.
Sedan skall ingående pulser räknas och luckan identifieras och där skall en total nollning göras för att sen räknas upp till tex 20, där skall nästa funktion träda in (spridare x öppna).

Författare:  kodar-holger [ 22.36 2016-12-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Måste du verkligen hitta luckan baserat på bara luckan?

Jag tolkar diagrammet ovan som att det skulle gå att använda kamaxelgivaren för att synka på.

Räkna vevaxelpulser när dom kommer. Varje gång det kommer en puls från kamaxelgivaren kan du veta hur många vevaxelpulser som kommit sen sist.

~2 = Vi är i cylinder 3.
~4 = Vi är i cylinder 2.
~6 = Vi är i cylinder 1.
~28-6 = Just kommit till cylinder 3
~28-4 = Just kommit till cylinder 1.
~28-2 = Just kommit till cylinder 4.
28 = Just kommit till cylinder 2.

Jag orkade inte räkna pulserna på det "ultralilla" diagrammet (jag ser helt enkelt för dåligt) så det var ungefär.

Sen älskar jag tillståndsmaskiner så en med 7 tillstånd som beskriver de olika faserna skulle förmodligen kännas rätt. När man kommer till ett av cylinderstart-tillstånden kan man ju räkna ut hur länge det var sen sist och därmed räkna ut hastigheten.

Timrar för styrningen av exaktare tider och naturligtvis interuptstyrt så blir det en massa tid över till din display och knappsats. Om du verkligen vill blanda den koden på samma processor....

Författare:  Janson1 [ 07.54 2016-12-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja som första programmering så kan man ju ta med både vev och kamaxelgivare men min tanke är att (våldsam överkurs) om kamaxelgivaren går sönder skall motorn gå vidare, däremot behöver den inte kunna starta igen. Det viktigaste är att den inte stannar om den givaren ger upp, sen är det önskvärt att motorn kan gå på begränsad effekt om vevgivaren ger upp men kamgivaren finns kvar.

Författare:  baron3d [ 14.42 2016-12-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bäst vore väl att ha 4st kamaxelgivare, en för varje burk.
Vid start utgår man endast från kamaxelgivarna.
Det är också lätt att få motorn att gå bra även utan någon givare.

Författare:  kodar-holger [ 23.01 2016-12-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det går ju också att göra en "fri" räknare som delar 2 varv i ett antal delar. Periodiskt ökar man räknaren med ett värde x som beror på aktuellt varvtal. Det måste förmodligen ske väldigt ofta. Typ > 20ggr frekvensen på vevaxelpulserna. Med hjälp av pulserna från respektive givare justerar du sen x. Kommer pulsen innan den borde, höj X, kommer den för sent, sänk x. En slags digital PLL helt enkelt. För att du inte skall få köra startmotorn i en kvart innan den synkat in får man väl ha något initieringsförfarande som gissar att båda sensorerna fungerar perfekt.

Men jag tror du får ta dig en funderare på hur du skall hantera krånglande sensorer. Det är lätt att tänka att först fungerar den och sen lägger den helt av. Men en sensor som lägger av kan säkert glappa och ge underliga värden som något slags mellanting mellan funkar perfekt och helt död.

Och vilka krav har du på upplösning? Du skrev något om en spridartid, men hur noga skall du styra den relativt något annat. 1 radian, 1 grad, 1 milliradian?

Kalmanfilter någon?
Partikelfilter (Alltså datorsorten, inte det man sätter i avgasröret på en diesel) skulle nog gå, men lär få svårt att synka in i starten och är sen overkill.

Författare:  Janson1 [ 13.15 2016-12-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det finns många aspekter att ta hänsyn till ang givare som är hela eller trasiga och dessutom kan vara någonstans mittemellan...
En annan tanke jag haft är att ha en givare som först känner en tand som ligger 45 grader innan ödp och en tand som ligger på ödp och låta första tanden styra spridare på med en tidsförskjutning som motsvarar varvtalet (vid lågt varv skall insprutningens början vara bara några grader innan ödp och vid fullvarv skall insprutningen börja mycket tidigare pga att det tar tid för bränslet att beredas/förgasas/tändas) och sen låta tand 2 vara absolut sista avstängningstid för spridaren och sen låta kamaxelgivaren bara indikera cyl 1 eller 4 resp 2 eller 3 i tändföljd. Men detta kräver ombyggnad av motorn och det vill jag helst slippa. Spridarens ontid bestäms av motorns varvtal.
Jag vill helst ha en potentiometer som ger tex 0,8 v till 4,2 volt vilket skall motsvara 800 till 4200 rpm. Det som kommer att styra när spridaren skall öppna blir varvtalet och när spridaren skall stänga blir reglerat av målvarvet, ställer man den på 4000 rpm ökar och minskar pulsbrädden på spridaren allt eftersom belastningen varierar. Sedan skall ju turbotrycket avläsas också, blir det för högt turbotryck skall pulsbrädden minskas i första hand och sen låta varvet gå ner om den belastas mera än vad turbotrycket tillåter. (det finns ingen wastegate ventil).
Jag gissar på att regleringen ligger betydligt inom 1 grad för att få jämnt varv.

Författare:  Janson1 [ 07.26 2016-12-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har löst första delen nu, detektering av luckan som blir där det saknas två tänder på vevaxelgivaren (det tog 3% av kodutrymme). Nästa problem blir att räkna till tand 20 där insprutningen skall börja vid start och lågvarv.

Författare:  svanted [ 12.59 2016-12-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

ingen wastegate?
inte en vnt turbo heller?

Författare:  Janson1 [ 22.02 2016-12-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Från början en VNT men den kommer jag att låsa i yttersta läget då jag inte behöver några lågvarvsegenskaper.

Författare:  Janson1 [ 18.15 2017-03-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Här är mitt alster, vissa delar fungerar och vissa delar fungerar ej. Jag får inte till det. Allt code är skriven i Arduinospråk, tror jag.
Och: jag är ny på detta, började i slutet av oktober -16, jag har aldrig programmerat någonting med nån reda förut. Så därför ser det nog bonnit alltihopa. Men, håll till godo!
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
    int kampin7 = 7; //kamaxelgivarens ingång, (aktivt låg). används ej än...
    int vevpin2 = 2; // pulsingång vevaxelgivare, (aktivt hög).
    int utpin3 = 3; // pulsutgång 2 pulser per varv (kontrollutgång)
    int sprpin1 = 8; // till spridare 1 (blir aktivt hög)
    int sprpin2 = 9; // 2 används ej än
    int sprpin3 = 10; // 3 -:-
    int sprpin4 = 11; // 4 -:-
    long puls, priv; // här läggs den senaste och föregående pulstiden in i microsekunder
    long starttid, stopptid, sluttid, delta; // starttid, stopptid, sluttid och delta i microsek.
    float error, mduration, bduration; // = varvfelet = motorduration/börduration i decimalform
    byte x = 0; // vevpin2 räknare 0 till 28
    byte starttand, gas, turbo, vtemp;  //starttand = vilken tand där spridaren skall öppna.
      // och gas 0-255, turbo 0-127, vtemp 0-127         
    //________________________________________________________________________________________________

    void setup()
    {
      pinMode(vevpin2, INPUT); //sätt vevpin2 som ingång                           
     
      pinMode(sprpin1, OUTPUT);   // spridarutgång 1  ben 8                                                                 
      pinMode(sprpin2, OUTPUT);  //                2  ben 9                                                                                                                             
      pinMode(sprpin3, OUTPUT);   //               3  ben 10                                               
      pinMode(sprpin4, OUTPUT); //                 4  ben 11                                                           
      pinMode(utpin3,  OUTPUT); // sätt utpin3 som utgång
      Serial.begin(250000);    // bra att ha
     
    }
    //_________________________________________________________________________________________________________

    void loop()
    {
       
          // Det får plats ca 1700 klockcykler mellan varje x tal (1 till 27)  Det tar ca 100 mikrosek att läsa av en analogingång, så max en per lucka.                         
     
       
                                             
       if (digitalRead(utpin3)== HIGH)// när utpin3 går hög startar 0-25 räknaren
        {
         x = 0; // säkerställer att vevpin2 räknaren börjar på 0
        }
     
         x  ++ ; //räkna upp ett steg för varje ny puls Fungerar

       
     
       if (x == 1) // Vid första vevpinpuls Gör:
       {
        gas = analogRead(A1)>>2;   // analogingång 0 till 255( skiftad 2 gånger)Fungerar
       }
       
       if (x == 2) // Vid andra vevpinpuls Gör:
       {
       // turbo = analogRead(A0)>>3; // analogingång för turbotryck 0 till 127 (skiftad 3 gånger)
       }
       
       if (x == 3) // Vid tredje vevinpuls Gör: osv
       {
       // ledigt
       }

       if (x == 4)
       {
        bduration =map(gas,0, 255, 660, 115); // motorns börvärde från gaspoten. 660 mS =tomgång, 115 mS = fullvarv. (ca 750 rpm till ca 4500 rpm)
       }// 660 - 115 mS = 750 till 4500 rpm Fungerar

       if (x == 5)
       {
       // ledigt
       }

       if (x == 6)
       {
        mduration = priv; // motorns pulstid i mikrosek ger motorns fart. 660 - 115 mS
       } // 660 - 115 = 660 - 115 mS Fungerar
       
       if (x == 7)
       {
        error = (mduration / bduration); // felet i mikrosekunder mellan är och börvärde för motorns fart baserat på pulslängderna.
       } // 0.0 - 6.0 Fungerar
       
       if (x ==8)
       {
       // ledigt
       }
       
       if (x == 9)
       {
       // ledigt
       }

       if (x==10)
       {
       // ledigt
       }
       
       if (x ==11)
       {
       // ledigt   
       }
       
     
       
       if (x==12)
       {
       starttand = map(priv,1300, 130, 21, 18);   // y1 = spridarstart från tand 21 vid tomgång till tand 18 vid fullvarv, ca  6-36 grader FÖDP
       }// förtändningen i 4 fasta steg, fungerar

       if(x == 13)
       {
       // ledigt   
       }
     
     

       if (x == 14)
       {
       // ledigt
       }
       
       
       if (x ==15)
       {
       // ledigt
       }
     
       if (x == starttand)  // när rätt puls är räknad, sätt sprpin1 hög, (tand 21 till 18)
       {
       starttid = micros(); // här vill jag ha en markör som signalerar i micros() att sprpin1 går hög. -------<<<<<<<<<--------Kolla
       digitalWrite (sprpin1,HIGH); //spridarpinne hög, insprutning börjar. pin 8   Fungerar 
       } // alternatit att micros() nollställs när sprpin går hög?? ------------------------------------------<<<<<<<<<<--------Kolla
     
       delta = mduration * error ; // felkorrigeringsvärde Fungerar
       sluttid = starttid + delta; // själva uträknaren fungerar
       if (delta, micros() >= sluttid, micros() ) // Detta fungerar nog inte!!!   --------------------------------<<<<<<<<<-------Kolla
       {
      digitalWrite (sprpin1,LOW); //spridarpinne låg, insprutning avslutad pin 8 denna fungerar nog inte heller ----------<<<<<-Kolla
       } // Antingen stänger den av direkt, det blir bara en spik eller stänger den inte av alls. ---------------<<<<<<<<-------Kolla
       
      Serial.print(starttid);
      Serial.print(" ");
      Serial.print(delta);
      Serial.print(" ");
      Serial.println(sluttid); // Hela serialpaketet fungerar men stör övriga funktioner vid lite högre farter, så bara för test.
     
     
     
       

       if (x == 26 || x < starttand)
       {
      digitalWrite (sprpin1, LOW); // För att säkerställa att spridaren stängs av senast 18 grader efter ödp (tand 26)
       }// Denna funktion tar över när tidsfunktionen inte går           Fungerar
       if (x == 26)
       {
 
       }
 
       if (x >= 27) // efter 28 pulser sätt x till 0
       {
       x = 0; //reseta 0-28 räknaren Fungerar
       }
     
        priv = puls;  // gämför ny pulstid med föregående pulstid
        puls = pulseIn(vevpin2, LOW); //Triggar på nersidan

       if  (puls > priv+25) // jämför om ny pulstid i mikrosekunder är större än föregående + 25 mikrosek.
        {
         digitalWrite (utpin3, HIGH);  // utpin_ blir hög när pulsluckan återgår till pulser
        }

       if  (puls < priv-25) // jämför on ny pulstid är mindre än förgående - 25 mikrosek.     
        {   
         digitalWrite (utpin3, LOW); // utpin_ blir låg igen nästa uppgång i pulståget.
        }
    }
    // end void loop()

    //________Hela detta paketet från: if (x == 27) Fungerar________________________________________________________________________________________________







Författare:  Sigue [ 20.26 2017-11-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Lite nyfiken på hur det har gått för dig Jansson1? har du fått igång motorn med din arduino? Mvh

Författare:  Janson1 [ 08.34 2017-11-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hej, vad roligt att nån läser, ännu roligare om någon frågar också. Jo, en liten resumé. Det har hänt en del sen sist, jag är med ett annat maskinforum som jag har bollat problemen med och med lite hjälp av det forumet och väldigt mycket jävlar anamma har jag fått till ett första (på labb-bänken) fungerande alster. Den senaste svåraste utmaningen var att få till variabel avstängningstid av spridarna, ett måste för att det överhuvudtaget skall vara lönt att fortsätta. I dag har jag fått till det och jag är även inne på att få till en finjustering av insprutningens början men är inte riktigt nöjd där än, jag kommer inte att lägga så mycket krut på det än då det kanske inte ens behövs. Förövrigt har jag gjort lite omändringar här och var i programmet för att (inbillar jag mig) göra det lite mer motorvänligt. Jag har även hunnit med att få till en övervakningsArduino som ligger ganska parallellt med ECUerna, jag har två separata ECU, A och B som jag sen kan välja vilken som skall vara aktiv. ÖvervakningsArduinon har en display (4 x 20) som visar dom viktigaste värden såsom varv, gasläge (effekt) temp. mm. Sen kan man ansluta datorn och se mer värden, förutom ovanstående så kan man se när spridaren öppnar och hur länge plus lite fördjupningar av div värden. Jag har nu byggt hela alstret på en experimentplatta bestående av 3 st Arduino NANO, 3 st spänningsregulatorer, 4 st transistorslutsteg för att kunna driva spridarna och plintar till alla upptänkliga kablar.
Och testat det statiskt mot scopet och datorn och det verkar funka fullt ut. Jag skaffade även mönsterkortsprogram från Dip Trace så nu har det även vuxit fram ett dubbelsidigt mönsterkort. Problem kvar att lösa är kretsen som gör om vevaxelgivarens sinussignal till användbart pulståg så Arduinon blir nöjd. Jag har i dag en krets som heter MAX 9926 som skall kunna lösa detta, väntar på en liten adapterplatta så jag kan ansluta den till yttervärlden. Om intresse finns så kan jag lägga ut sketchen i senaste fung. upplaga. Och även övervakningssketchen.
Edit: felstafat...

Författare:  Sigue [ 20.35 2017-11-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vad kul att du har fått igång motorn, jag har följt din tråd och det låter som du verkligen har avancerat och lärt dig endel på vägen. :) Jag skulle gärna vilja se din sketch :) Jag är ganska ny på Arduino och har ett liknande projekt jag tänkt på länge och det skulle va kul att se din sketch i läro syfte:)

Författare:  Janson1 [ 21.38 2017-11-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Så att inga fel uppstår, jag har inte ens försökt få igång motorn ännu. Allt är på skrivbordet hemma. Min "motor" är en simulator Arduino som efterliknar pulserna från vev och kamaxelgivare i farter från ca 400 till 4500 RPM.
Men min sketch ser ut så här, senaste fungerande versionen...
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
int kampin7 = 7; //kamaxelgivarens ingång, (aktivt låg)
    int vevpin2 = 2; // pulsingång vevaxelgivare, (aktivt hög).
    int utpin3 = 3; // pulsutgång 2 pulser per varv (kontrollutgång)
    int sprpins [] ={8,9,10,11}; // till spridarna (blir aktivt hög)
    int sprControl = 13;// kontrollutgång för spridare till övervakningen.
    int turbokorr; // utgående felkorrigeringsvärde från turbogivare
    int disable = 12;// aktivt hög stoppar utsignalerna till spridarna
    long puls, priv, delta, starttid, sluttid, turbovalue, delvalue; // senaste och föregående pulstiden in och start,slut i microsekunder,+ klart turbovärde.
    float error; // error = varvfelet i decimalform
    float starttandf; // starttand i decimalform.
    float  mduration, bduration; //  varvfelet = motorduration/börduration i decimalform
    byte x = 0; // vevpin2 räknare 0 till 28
    byte  gas, turbo, pekare, starttand;  //starttand = vilken tand där spridaren skall öppna.
      // och gas 0-255, turbo 0-127, tmp för att välja rätt spridarutgång         
    //________________________________________________________________________________________________

    void setup()
    {
      pinMode(vevpin2, INPUT); //satt vevpin2 som ingång                           
      pinMode(kampin7, INPUT_PULLUP);// satt kampin som ingång .
      pinMode(sprpins[pekare],OUTPUT);  // 8,9,10,11 satta som utgånsarrey
      pinMode(sprControl, OUTPUT);// en spridarutgång som blir hög varje gång en spridare öppnas.
      pinMode(disable, INPUT_PULLUP);// ECU väljare Hög = on, Låg = off.
                                                                                                                                                pinMode(utpin3,  OUTPUT); // sätt utpin3 som utgång
      Serial.begin(250000);    // bra att ha vid tester, skall var bortkopplat vid högre farter.(stör)
     
    }
    //_________________________________________________________________________________________________________

    void loop()
    {
       
          // Det får plats ca 1700 klockcykler mellan varje x tal (1 till 27)  Det tar ca 100 mikrosek att läsa av en analogingång, så max en per lucka.                         
     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.
      pinMode(sprpins[pekare],INPUT); // gör om spridarutgångarna till ingångar.
      pinMode(sprControl, INPUT); // gör om spridarcontrollen till ingång.
     }
    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
     }
       
        x  ++ ; //räkna upp ett steg för varje ny puls, kommer från pulseIn()funktionen,  Fungerar
       
       if (digitalRead(kampin7)== LOW) { // varje gång kamaxelns hempuls detekteras så resetas 4 räknaren
        pekare = 0; // resetas till 0
       }
     
       if (x == 1) // Vid första vevpinpuls Gör:
       {
        gas = analogRead(A1)>>2;// analogingång 0 till 255( skiftad 2 gånger)Fungerar
        delvalue = priv;// föregående pulstid läggs in som deltid 1
       }
       
       if (x == 2) // Vid andra vevpinpuls Gör:
       {//0,034 v/steg
        turbo = analogRead(A0)>>3; // analogingång för turbotryck 0 till 127 (skiftad 3 gånger)
        delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
       }// atm = 1 volt, fullt turbotryck = 2,4 volt (1,4 bar över atm)>> A0 = 29 =atm, A0 = 70 = fullt turbotryck
       
       if (x == 3) // Vid tredje vevinpuls Gör: osv
       {
      turbokorr = map(turbo, 0, 127, 100, 300); // här matas in 0 till 80 som max. invärdet bör bli 70, omgjort till korrfaktor 10
      delvalue = priv + delvalue;// föregående pulstid + föregående deltid läggs ihop
      if (turbokorr <=0)
          {
           turbokorr = 1;  // för att undvika minusvärden
          }
       } //0 till 127 =  100 till 300

       if (x == 4)
       {
        bduration =map(gas,0, 255, 660, 115); // motorns börvärde från gaspoten. 660 mS =tomgång, 115 mS = fullvarv. (ca 750 rpm till ca 4500 rpm)1250
       delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
       }// 660 - 115 mS = 750 till 4500 rpm Fungerar

       if (x == 5)
       {
        turbovalue = (mduration * turbokorr); // detta värde minskar spridarens ontid när värdet blir högre än faktor 1
        delvalue = priv + delvalue;// föregående pulstid + föregående deltid läggs ihop
       }
     
       

       if (x == 6)
       {
        mduration = delvalue/9; // motorns totala pulstid i mikrosek dividerat med 9 (4x2+1)  ger motorns fart. 660 - 115 mS
       }  // 660 - 115 = 660 - 115 mS Fungerar
       
       if (x == 7)
       {
        error = (mduration / bduration); // felet i mikrosekunder mellan är och börvärde för motorns fart baserat på pulslängderna.
       } // 0.0 - 6.0 Fungerar
       
       if (x == 8)
       {
       //error = error - 1;
       if (error <=0)
         {
          error = 0;// för att ej få minusvärden
         
         }
       }
       if (x == 9){
        if (error >=6){
          error = 6;// för att få max 6.0 som error
        }
       }
       
       
     

       if (x== 10)
       {
        //ledigt
       }
       
       
       
       if (x == 11)
       {
        // ledigt 
       }
       
       if (x==12)
       {
        // ledigt
       }
     
       
       if(x == 13)
       {
        // ledigt   
       }
     
       if (x == 14)
       {
        // ledigt
       }
       
       if (x ==15)
        {
        starttandf = (mduration-130.0)*(22.0-17.0)/(1300.0-130.0);// +18 
        if ((starttandf >= 1)|| (starttandf <=1)){ // en test för att få variabel tillslagstid av spridare
          starttandf = 0;
        }
        starttand = map(mduration,1300.0, 130.0, 22.0, 17.0);   //  spridarstart från tand 21 vid tomgång till tand 18 vid fullvarv, ca  6-36 grader FÖDP
        //starttandf = starttandf -
        if (starttand >= 22.0)
          {
           starttand = 22.0;
          }
        }   // förtändningen i 4 fasta steg, fungerar   Tand 23 är TDC
       
       
       

       if (x ==16)
       {
        delta = (mduration * error) - turbokorr ; // felkorrigeringsvärde Fungerar
       if (delta <=0)
         {
          delta = 0;// för att ej få minusvärden.
         }
         Serial.print(starttand);
         Serial.print(" ");
         Serial.println(starttandf);
       }
     
       
       if (x == starttand)  // när rätt puls är räknad, sätt sprpin1 hög, (tand 22 till 17)
       {
        starttid = micros(); //Den sätter en markör vid spridarstart.
        digitalWrite (sprpins[pekare],HIGH);//spridarpinne hög, insprutning börjar. pin tmp 8,9,10 eller 11
        digitalWrite(sprControl, HIGH);
        delayMicroseconds(delta); // Nyaste tankesättet, skiter i pulseIn() och väntar istället på offtiden
       }
   
        sluttid = micros(); // håller reda på när sluttiden skall vara
       
       if ((delta <= sluttid - starttid)|| (delta <=delvalue /2)) //
       {
        digitalWrite (sprpins[pekare],LOW); //spridarpinne låg, insprutning avslutad pin tmp 8,9,10 eller 11
        digitalWrite (sprControl, LOW);
       }

     
  //_________________________________________________________________________________________________________________________________________________________   
        priv = puls;  // lägger in den förra pulstiden i värdet "priv"
        puls = pulseIn(vevpin2, LOW, 20000); // Ett färdigt kommando som väntar in nästa puls, mäter offtiden, low
        // vid stillastående motor blir det en timeout var 0,2 sekund.
       if  (puls > priv+25) // jämför om ny pulstid i mikrosekunder är större än föregående + 25 mikrosek.
        {
         digitalWrite (utpin3, HIGH);  // utpin3 blir hög när pulsluckan återgår till pulser
         x = 0; // resetar 0 till 28 räknaren
         pekare=pekare+1;// räknar upp spridarpinnerä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
          }
        }
       
       if  (puls < priv-25) // jämför on ny pulstid är mindre än förgående - 25 mikrosek.     
        {   
         digitalWrite (utpin3, LOW); // utpin_ blir låg igen nästa uppgång i pulståget.
        }
    }
   
    // end void loop()

    //________Hela detta paketet Fungerar________________________________________________________________________________________________




Och övervaknings-sketchen
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
 #include <LiquidCrystal.h>
    char x;
    int ecuAktiv = 2; // pulsingång vevaxelgivare, (aktivt hög).
    int inpin3 = 3; // pulsingång 2 pulser per varv till beräkning av motor/propvarv.
    int motorvarvut = 9; // till motorns varvräknare PWM
    int propvarvut = 10; // till propellervarvräknare PWM
    int gasvalue; // gasvärde från poten 0-1023
    int turbovalue;// turbovärde från tryckgivaren 0-1023
    int sprSignalin = 8;// ansluts till valfri spridarutgång eller sprcontrol, valfritt
    float sprTid; // spridaröppningstid i % av halvt motorvarv
    float liter;  // liter/timma
    int rs=4, en=5, d4=6, d5=11, d6=12, d7=13;// till displayanslutningar
    LiquidCrystal lcd(rs,en,d4,d5,d6,d7);// till display
    long varvtalprop; // värde i microsek
    long puls, varvtalmotor;// värde i mikrosek
    int readECUAvoltage;
    int readECUBvoltage;
    int readbattVoltage;
    int engineTemp;
    int turboAirTemp;
    int ambientTemp;
    int atmTryck;//
    float ECUAvoltage;
    float ECUBvoltage;
void setup() {
      pinMode(ecuAktiv, INPUT_PULLUP); //satt vevpin2 som ingång                           
      pinMode(motorvarvut, OUTPUT);   // till motorvarvräknare PWM                                                             
      pinMode(propvarvut, OUTPUT);  // till propvarvräknare  PWM                                                                                                                         
      pinMode(sprSignalin, INPUT);   // från en valfri spridare                                                                                                     
      pinMode(inpin3,  INPUT); // ingång för att beräkna motor/propvarvtal 
      lcd.begin(20,4);
      lcd.setCursor(0,0);
      lcd.print("Diesel ECU ver.1.0");// visar versionsnummer
     
      lcd.setCursor(0,1);
      lcd.print("Byggd av J Berglund");//
     
      lcd.setCursor(0,2);
      lcd.print("Motor VW PD 135 hp");//
     
      lcd.setCursor(0,3);
      lcd.print("Mjukvara 1.0 rev 0");//
      Serial.begin(250000);    // serial utgång till datorn
      delay(5000);
}

void loop() {
  gasvalue = analogRead(A0);
  turbovalue = analogRead(A1);
  atmTryck = analogRead(A2);
  readECUAvoltage = analogRead(A3);
  readECUBvoltage = analogRead(A4);
  engineTemp = (5.0* analogRead(A5)*100.)/1024;// använder LM-35 tempgivare
  turboAirTemp = (5.0* analogRead(A6)*100.)/1024;// använder LM-35 tempgivare
  ambientTemp = analogRead(A7);
 
  gasvalue = map(gasvalue,0,1023,0,100);// 0 till 100 % effekt börvärde
  turbovalue = map(turbovalue,0,1023,400,4000);// 400 till 4000 mBar
  atmTryck = atmTryck *4;//  absoluttryck i mBar.
  ECUAvoltage = readECUAvoltage *(6.0/1023.0); // ECU A drivspänning till 6 volt
  ECUBvoltage = readECUBvoltage *(6.0/1023.); // ECU B drivspänning till 6 volt
  ambientTemp =map(ambientTemp,0,1023,-20,60);// omgivningstemperatur -20 till 60 G c med en NTC
 
  sprTid = pulseIn(sprSignalin, HIGH); // mäter in valfri spridares ontid
  sprTid = sprTid/puls*100.;// gör om ontiden från microsek till procent
  liter = sprTid * varvtalmotor /150;//: /150 skall provas ut...

  if (digitalRead(ecuAktiv)== HIGH){
    x =  'A';
  }
  else {
    x =  'B';
  }
 
  lcd.setCursor(0,0);
  lcd.print("Propeller ");
  lcd.print(varvtalprop);
 
 lcd.setCursor(0,15);
  lcd.print("     ");     
  lcd.print("  RPM");
 
  lcd.setCursor(0,1);
  lcd.print("EFFEKTSETTING ");
  lcd.print(gasvalue);
  lcd.print(" %");
 
  lcd.setCursor(0,2);
  lcd.print("Motortemp ");
  lcd.print(engineTemp);
  lcd.print(" gr. C.");
 
  lcd.setCursor(0,3);
  lcd.print("FUELFLOW ");
  lcd.print(liter);
  lcd.print(" L/h");
 
  Serial.print("Gasvalue ");// skriver ut div realtidsvärden
  Serial.print(gasvalue);
  Serial.print("% ");
  Serial.print("Turbovalue ");
  Serial.print(turbovalue);
  Serial.print(" Bar  ");
  Serial.print("Turbo Air Temp ");
  Serial.print(turboAirTemp);
  Serial.println(" Grader C.");
  Serial.print("Absoluttryck  ");
  Serial.print(atmTryck);
  Serial.print(" mBAR  ");
  Serial.print("ECU A ");
  Serial.print(ECUAvoltage);
  Serial.print(" Volt  ");
  Serial.print("ECU B ");
  Serial.print(ECUBvoltage);
  Serial.println(" Volt");
  Serial.print("Engine Temp ");
  Serial.print(engineTemp);
  Serial.print(" Grader C. ");
  Serial.print("Ambient Temp ");
  Serial.print(ambientTemp);
  Serial.print(" Grader C.");
  Serial.print(" ECU ");
  Serial.print(x);
  Serial.println(" Aktiv");
  Serial.print("Motor ");
  Serial.print(varvtalmotor);
  Serial.print(" RPM");
  Serial.print("  Propeller ");
  Serial.print(varvtalprop);
  Serial.print(" RPM");
  Serial.print(" Pulswidth ");
 
  if (varvtalmotor >=5100){// max pulslängd tomgång, < 5000 mikrosek
    varvtalmotor = 0; // om stillastående/startmotorvarv så blir motorvarvet noll till ev varvräknare
  }
  varvtalmotor = map(varvtalmotor,0,5000,0,255);// 0 till 5000 mikrosek görs om till 0 till 255
  analogWrite(motorvarvut,varvtalmotor); // ger ut en pwm signal 0 till 255 beroende på motorns varvtal
  analogWrite(propvarvut,varvtalmotor * 0.625);// ger ut en pwm signal som är konverterad för att passa propellervarvet
  Serial.print(varvtalmotor);// fortsättning div realtidsvärden
  Serial.print(" spridare ");
  Serial.print(sprTid);
  Serial.println(" % open");
  delay(100);
        puls = pulseIn(inpin3, LOW); // väntar in nästa puls, Triggar på nersidan
        // vid stillastående motor blir det en timeout varje sekund.
      varvtalmotor = (1000000/puls)*30.06;// pulsbrädden görs om till RPM motor
      varvtalprop = varvtalmotor *0.625;// RPM motor görs om till RPM propeller
     
     
}

Nu vet jag inte om jag ändrat på något då jag i princip kontinuerligt förändrar/förbättrar/försämrar sketcherna.

Författare:  basshead [ 22.26 2017-11-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hej och kul projekt Janson! =)

Jag programmerar maskinkod och assembler på Mitsubishis äldre styrboxar. Har även programmerat massor med LH 2.4 bla Volvo, Porsche, BMW, osv.

Håller med om att Arduinoprylarna är kul att pilla med. Tyvärr är dom hopplöst svajiga med att hålla takten. Jitter ligger på ca 6 usec med portmanipulering.
Ser på din kod att du inte använder interrupt. Stämmer det?

Mvh. Kim.

Författare:  Janson1 [ 06.46 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Stämmer, använder inga interrupt, mest för att jag aldrig fått till det. Jag kan faktiskt se att på scopet att det är inte exakt stabilt, trodde mest det var mätfel men det kan ju vara som du skriver med jittret. Nu har jag aldrig programmerat förr och har inget att jämföra med. Men, kan du utveckla det här med svajighet och jitter?

Författare:  Janson1 [ 07.00 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Skall väl tillägga att det finns ett annat sätt att anropa pinMode och digitalWrite som ger betydligt snabbare responstid, alltså många mindre cycler för att tex sätta spridare hög och låg, jag har funderingar på att prova detta, jag kanske tom. blir tvungen då jag börjar närma mig taket av vad sketchen klarar av, nu har jag ju satt maxvarvet till 4500 rpm men vid stressskörning börjar något hända vid 6-7 tusen rpm. Jag tror i och för sig aldrig det stannar helt utan det börjar fungera igen så fort varvet minskas under kritiskt varv.

Författare:  basshead [ 07.46 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Själva svajet dvs jittret kommer just ifrån att Arduinokodning är baserat på en main loop. Kallas ibland för sekventiell exekvering. Tanken med just detta är att det blir enkelt att skriva kod och låta processorn sköta allt annat som matematik och beräkningar. Allt ok så här långt.

Men när man kliver in och skall styra tidskritiska saker, tex köra en motor så räcker det inte till längre.
En motor på tomgång är inte så störd av lite fördröjningar. Inte heller på högre varv utan last.
Men den dagen du lägger last på motor och koden sitter och sover när det behövs bränsle då blir inte motorn gammal. Tänk dig själv att endast andas med näsan. En slapp kväll framför TVn eller kort promenad störs knappt av att nån nyper ihop näsborrarna på dig då och då.
Men skulle detta ske under en sprint på löpbandet, en brant uppförsbacke eller maratonlopp så skulle vi garanterat få hjärtstillestånd.
Samma sak händer när motor inte styrs tidskritiskt. Kritiskt i detta fall betyder viktigt samt prioriterat. Inget annat.

Så till interrupt. På Arduino har dom gjort det görenkelt att använda interrupt. Man ansluter en bit kod till en händelse. Tex öka en räknare varje gång man passerar en tand på triggerplattan. Här kan du använda alla sorters triggerkod precis som på oscilloskopet. Rising, falling, change.
Man lagrar därefter in detta i säg 4 olika variabler. Vi kallar dom cylinder cycles.
Nu har du en annan interruptkod som triggas av en sanningstabell som visar vart i cykeln motorn befinner sig.
Denna är livsviktig för motorn behöver olika mycket bränsle och tändvinkel beroende av varv och last. Tänk på det som en PWM-signal med både varierande frekvens och pulsbredd. I Arduinon så regleras endast pulsbredden men frekvensen är statisk. Detta måste göras om. Men det är också döenkelt med ett interrupt och counter.

Summa på vilka interrupt som man kan behöva så här i början är;
1. master counter. Dvs godtyckligt räknare för hela 720 graders otto cykeln.
2. Trigger interrupt.
3. Scheduler. Dvs schemaläggare. Detta är din sanningstabell.
4. Ny PWM-styrning för bla spridare.

För om du räknar på 1/4500 varv får du 222 microsekunder. Det blir värre, tro mig. Om vi då redan har 6 usec jitter åt båda håll. Dvs 12/222 ger 5,5% konstant fel per varv! Detta är enormt i motorsammanhang. Dvs 720*0,055 är 39,6 grader i båda riktningarna dvs både innan och efter dödläge. Ifall vi nu räknar med det som vår referens. Men det är detsamma vilken del av cykeln vi använder.

Med interrupt försvinner dessa problem nästan helt. Inte till 100% men bra nära.

Hoppas denna infon var till hjälp. =) Kan nog slänga ihop lite bilder och kod från oscilloskop och Arduino åt dig så du får testa själv.

Mvh. Kim.

Författare:  tecno [ 09.48 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Mycket bra förklaring :tumupp:

Författare:  Janson1 [ 17.28 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag håller med, en bra förklaring. Jag har ju inte kört mot en riktig motor men det är fullt möjligt att det inte kommer att funka alls. Däremot använder jag inte den inbyggda PWM regleringen för spridarna utan använder några fasta påslagstider och helt variabel fråntid beräknat på motorns fart. Däremot uppfattar jag inte felet så högt som upp till +-40 grader, utan bara någon grad om ens det, men det är som sagt var när jag kör mot en "Arduinomotor"
Det verkar som att du Kim har den kunskapen som jag söker för att ev lyckas...
Så, har du möjlighet att "slänga ihop" nåt så vore jag tacksam!

Författare:  basshead [ 20.30 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Tack Tecno & Janson!

Du skall veta en sak Janson; det projekt du valt kommer ge dig massor med insikter om programmering, matematik, mätmetoder, mekanik, osv.
Att driva just en "levande" mekanisk maskin är väldigt svårt, men och mycket givande. Och man lär sig massor.
Det finns inget rätt eller fel i just denna kategorin av projekt. Varför säger jag så? Jo för att motorn som vi känner den är ca 150 år gammal. Och fortfarande finns
det massor av olika bil- och motortillverkare. Det visar och har bevisats gång på gång att revolutionerna sker inte i dom stora forskningslabben. Dom sker i folks garage.
Sedan köper dom stora tillverkarna kunskapen, eller helt enkelt en prototyp av den uppfinnaren. Svårt att tro. Men kolla bara på Svenska Christian von Koenigsegg och
hans bidrag till motorvärlden. En av dom senare uppfinningarna löser massor med problem, den steglösa växellådan. Visst har såna funnits i massor förr, men inte en som
funkar med stort kraftuttag och hög hastighet. Och dessutom innehåller så få rörliga delar som möjligt och nästan är passiv i drift.

Så fortsätt med det du gör. Uppfinn dina egna mätmetoder, skriv dina egna loggerprogram och analysverktyg, och viktigaste av allt, våga ta steget till att testa den på en
riktig motor. Du kommer se att den enkla best vi tar för givet under huven är nåt helt annat när man bryter ner dess cykel under endast ett varv, eller en sekund, osv.
Vibrationer från motorfästen syns i dina loggar, du tvivlar. Undrar vad det är. Du ser vad som ser ut som en impulssignal på loggade värden från hastighetsmätarn, inser att
det är hastighetsmätarvajern som resonerar vid växlingar. Och så vidare.

Lycka till! Och låt ingen säga till dig hur saker och ting skall göras. Men undvik också att uppfinna hjulet igen. =)

Mvh. Kim.

Författare:  Janson1 [ 20.43 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bilaga:
IMG_20171123_201442.jpg
Jodå, jag insåg ganska tidigt att det är nog ett av dom större projekt man kan krama ut av en Arduino och en som aldrig programmerat förut. Så jag ger mig inte så lätt... Var skall motorn användas till då? Ett flygplan om jag kommer så långt nån gång... Så jag kräver ganska mycket, dubbelt där det går och så mycket felsäkert som möjligt.
Jag har nu fått en MAX9926 krets som skall göra om sinusen från vevgivaren till pulser som Arduinon kan läsa, första försöket och jag tappar första pulsen efter luckan varje gång. Så det blir till att byta inkoppling och prova igen.
På bilden ett 32 tänders drev som tappat 2 tänder...

Författare:  basshead [ 21.26 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ah. Ser att du leker med en induktiv givare. Dom är av sk zero crossing typ. Dvs du mäter inte kanterna eller tänderna på signalen. Man mäter istället när pulsen svänger över från positiv spänning till negativ, och vice versa. Här kan du ha nytta av att fördröja din avläsning baserat på tid. Då slipper du sampla falska positiva signaler.

Hade du valt en optisk givare så hade du läst av kanterna på din signal istället.
Induktiv givare = billig och driftsäker. Men jobbig signal pga sin magnetiska princip. Den har med andra ord inbyggd fördröjning pga fysikens tröghetslagar.
Optisk givare = dyrare och driftsäker. Fyrkantssignal. Lätt att jobba med.

Författare:  basshead [ 21.30 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Glömde ju nämna;
Man placerar aldrig själva gapet på plattan rakt upp. Detta för att motorns kompression stör signalen med att sträcka ut den. Motorn går alltså en aning långsammare när kolven närmar sig övre dödläge. Detta sker 2 gånger på en cykel.
Man vrider oftast triggern 90* motsols. Alltså gapet kommer först i tid, sedan övre dödläge.

Författare:  Janson1 [ 21.55 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Optisk givare verkar ju intressant. Jag googlade på det men hittade inte det jag sökte. Finns det optiska givare som passar rakt av i samma hål där den induktiva givaren satt?
Själva givarens läge kan jag egentligen inte påverka och förutsätter att den sitter optimalt från början.
Vidare så har jag i sketchen lagt in så hastighetsavläsningen görs över flera tänder för att få ett så bra medel som möjligt.

Författare:  basshead [ 22.32 2017-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ok sitter givaren redan på motorn så sitter den optimalt. Tänkte att du använder borrmaskinen som referens.
Nej tyvärr så kan man oftast inte ersätta induktivt med optisk givare. Den optiska kräver att en skiva roterar mellan sändare/läsare. Kör vidare med din induktiva.
Hur filtrerar du din signal in i Arduinon? MAX9926? Den ICn funkar kanon. Koppla dock aldrig en induktiv givare direkt till Arduinon, utan motstånd mellan. Den givaren kan ha
en EMF kick på flera volt och kan skada Arduinon.

Här ser du skillnad på de två olika givarnas signal, din till höger. Med MAX9926 så kommer den se ut som den till vänster:
Bild

Perfekt att du läser av hastigheten. Plotta den i Excel så ser du ditt delta, dvs skillnad. Detta kan du ta som ditt ingångsjitter. Fast det är inte samma sak som internt jitter i Arduinon. Men ändå intressant att se. Excel är din bästa vän.

Författare:  Janson1 [ 07.18 2017-11-24 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det här med excel fattar jag inte riktigt... Men nu gäller det att hitta rätt inkopplingsalternativ för MAX9926. Att inte koppla in den magnetiska givaren direkt på Arduinon, det förstår jag nog att det inte slutar gott. Jag kommer dessutom att skydda alla in/utgångar med både motstånd och något slags filter (Murata 3 ben?) och kanske lite skyddsdioder? Jag har egentligen inte bestämt mig än för hur skydden skall se ut.

Författare:  Janson1 [ 18.06 2017-11-24 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Att få MAX 9926 att fungera som det är tänkt verkar vara svårt. Jag har nu provat alla utom en koppling och det blir i princip lika dant. Det saknas första pulsen efter luckan, varje gång upp till ca motsvarande 1800 rpm. Är det någon som är slängd i engelska och kan luska ut vilken koppling som passar best?

Författare:  basshead [ 06.57 2017-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Misstänker att den missar första tanden för att den har inte "laddat upp" sitt register för att kunna omvandla pulserna. Själva tanken med chippet är att ladda upp det med signal och sedan tömma det som fyrkantsvåg. Tand för tand. Såg att den har en watchdog på ca 65 & 85 ms. Men den borde inte kicka in när du roterar över 700 & 920 varv/min.

Testa att lägga till en fejk tand i din kod efter att sista tanden detekterats. Då har du samma summa tänder i varje fall.
Bara för att prova.

Jo varför jag nämnde MS Excel förut är att det är ett väldigt kraftfullt verktyg att importera loggar i direkt från din Arduino. Kopiera/klista, visa graf. I Excel kan du grafa baserat på tid, men också
baserat på frekvens med FFT. Mycket kraftfullt.

Fortsätter att fundera i samma svar;
En MAX9926 är onekligen snabb nog att fånga första flanken som kommer in. Så felet ligger i antingen för stora kondingar som inte hinner ladda ur i din krets, eller din kods
sätt att göra ett genomsnitt på flera pulser. Det räcker med ett genomsnitt på 3 pulser så missar du första pulsen. Säg att du har satt det till 3 fulla tänder, ja då har du ett genomsnitt på 6 pulser. Det betyder att din kod måste laddas upp med 6 pulser innan du ser ett resultat.
Verifiera detta genom att rotera triggerplattan för hand och se när du får ditt första resultat. Gissar på att du får X-1 här.
Skulle det vara så att MAXen inte hinner ladda upp så använder du helt enkelt en skruvmejsel i järn/stål och drar fram och tillbaks framför din VR-givare. Då hinner den ladda upp sig.

Mycket flum i ett svar. Men här ser du tankebanan.

Författare:  Janson1 [ 08.32 2017-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En hint pm hur pulseriet ser ut direkt efter VR-givaren.
Bilaga:
IMG_20171124_190629.jpg

Det är den lite högre första sinusdelen som MAX- kretsen ratar...
Jag skall faktiskt försöka köra med en schmittrigger och testa eller kanske bara en NPN transistor och några motstånd?

Författare:  Janson1 [ 08.35 2017-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Skall väl tillägga att är det nu så att denna första tand alltid kommer att saknas så kan jag göra om sketchen så första tanden blir 2 istället men då måste MAX kretsen ALLTID ta bort tand 1 över hela varvregistret.

Författare:  Janson1 [ 08.44 2017-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Sitter och analyserad ditt svar basshead och du skriver om ev för stor kondensator. I schemat står mellan 0,1 till 10 uf. Jag började med 0,33 polyester och gick sen ner till 0,1 elyt, (det var vad jag hade på skrivbordet) utan nån skillnad. Det är klart man kan prova ytterligheterna för att se om det blir bättre. Vidare så har jag inte inkopplat Arduinon utan bara scopet direkt på utgången via pålappmotstånd. Först vill jag ha fint in för att få fint ut, tvärtemot skit in- skit ut...

Författare:  Janson1 [ 13.20 2017-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag gjorde det enklaste och satte en NPN transistor framför och fick exakt samma pulsform som med MAX-kretsen...

Författare:  Janson1 [ 22.34 2017-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har hitten hallgivare som bör passa rent elektriskt http://www.produktinfo.conrad.com/daten ... 0_02_A.pdf
Då slipper jag alla problem med pulsomvandling mm. Däremot så passar den inte rakt av mekaniskt, den är lite för kort så en smärre ombyggnad krävs...

Författare:  Janson1 [ 10.49 2017-12-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja nu är allt i grundsketchen löst, variabel tändförställning, när spridaren skall börja öppna. Variabel avstängning, när spridaren skall stänga. Alla dessa data baseras på varvtal, belastning, turbotryck, motortemp, omgivningstemp, turboluft-temp, lufttryck och börgasläget. Jag tror jag har fått till alla nödvändiga parametrar för att kunna köra motorn IRL.
Sen får finjusteringsvärdena komma senare. Just nu väntar jag på vevaxelgivare av halleffekt-typ som skall klara av att läsa tänderna. När den kommer hem så skall det testas ut.

Författare:  Janson1 [ 22.17 2017-12-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ett problem jag behöver fixa på ett eller annat sett... Kommandot delayMicroseconds() klarar "bara" 16383 uS.
Kan man komma åt "baksidan", dvs. koden på detta kommando? Nu har jag fixat det med att anropa delay() och sen göra om tiderna till mS (us/1000=mS) och det går ju alldeles utmärkt det med, men...

Författare:  Janson1 [ 22.33 2017-12-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En bild på vad? högst upp i bild en Arduino UNO som agerar motor, med poten kan man ställa 150 till 5200 RPM
Bilaga:
IMG_20171203_120303.jpg


Och nästa UNO är själva ECU:n med en pot för gasreglage börvärde och en pot för turbotrycket och en pot för div. temp. mm Sen är det några lysdioder som symboliserar spridare, kontrollutgång mm. och sen lite anslutningar till scopet förstås.

Författare:  Janson1 [ 23.01 2017-12-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Med den nya vevaxelgivaren modell hallgivare blev det bra direkt fast signalen blir aktivt låg istället.
Bilaga:
IMG_20171206_172503.jpg


Men med ett par tryck i Arduinocoden och det funkar det med.
Nu är ju undran om enhetsinjektorerna skall ha 12 volt eller mer? Original sluttransistorer tål 55 Volt /28 Amp
Det sitter nåt som skulle kunna vara en step-up converter jämte slutstegen men det finns ingen fysisk koppling mellan grejerna. Själva drosseln saknas i alla fall i den gamla ECU:n, så om det finns en drossel så sitter den någon annan stans...

Författare:  Janson1 [ 21.54 2017-12-20 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det sitter ingen step-up converter utan spridarspolarna går direkt på 12 volt minus en diod och två mos-transistorer. Jag har nu även cadat ett mönsterkort och skickat iväg en gerberfil för tillverkning i Kina. 34 dollar inkl frakt för 5 st, vad lever dom på? Det sen färdiga kretskortet har plats för 3 st Arduino NANO, 4 st MOS-slutsteg, 3 st spänningsregulatorer, 1 st atmosfärsgivare och alla erfoderliga kontakter, jag kör med D-sub rakt av ( 2 st 15 pol, 1 st 9 pol, 1 st 3 pol högström i 15 pols storlek och en 5 polig högström i 25 pols storlek) och Muratas avstörningsfilter, motstånd och skyddsdioder på ingångarna. Vidare så kommer alla kablar att vara skärmade så långt det bara går. Störningar som kan bli är dels mobilstörningar och dels rent statiska urladdningar. Sen kan det bli jordströmmar om det är förjordat så där måste man passa sig lite med...

Författare:  KLset [ 07.59 2017-12-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hej Janson1! Såg din post i senaste-kretskortet-tråden. Vilket spännande projekt. Ser fram emot en rapport från första testet med en riktig motor.

Författare:  Janson1 [ 08.28 2017-12-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jodå, jag lovar att skriva när det är dags. Jag tror mig fått till alla givare från motorn att lämna ut rätt signaler så det finns ett hopp. Det är väl en del grejer kvar inför, bla få dit vattenkyl, avgassystem och all sladdragning. Men, jag har aldrig varit så nära...

Författare:  Janson1 [ 00.22 2018-01-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu är ECU:n inkopplad till motorn. Den har inga planer på att starta... än. Jag hittade bränsleläckage, den drog tjuvluft i bränslesystemet mm som nu är åtgärdat. Jag tror den fasar in rätt spridare direkt i alla fall. Däremot verkar spridartiderna vara superkorta, jag anslöt en lysdiod över en spridare och den bara blinkar till ytterst kort. I morgon skall jag göra en seriös felsökning!

Författare:  Janson1 [ 22.25 2018-01-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Några fel... Elektroniken hade svårt att detektera pulsluckan pga väldigt ojämn gång på startern. Jag bytte lite värden på tider och nu följer ECU:n motorn slaviskt som den skall. I och med att pulsluckan detekteras rätt så blir även spridartiderna rätt lite per automatik. Den tänder nu på en cylinder men orkar inte gå för egen maskin. Jag tog isär matarpumpen och en av spridarna men kunde egentligen inte hitta nåt fel som skulle hindra den från att vara nästan stendöd. I morgon skall jag göra ett seriöst försök att lufta ur systemet riktigt grundligt, jag tror faktiskt inte det är nåt annat.
Bilaga:
IMG_20180106_204547.jpg
Bilaga:
IMG_20180106_201543.jpg

närmsta bilden är själva matarpumpen, den är driven av kamaxeln.översta bilden är själva spridaren, den trycksätts via en extra nock på kamaxeln och startar förloppet när den strömsätts.

Författare:  Magnus_K [ 00.56 2018-01-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Håller med KLset!
Ska bli spännande att se hur det går, och tappa inte sugen för att det är lite dålig respons här ibland.
Vi är nog rätt många som följer dig i tillfällig tysthet :)

Författare:  Janson1 [ 09.19 2018-01-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Får väl hoppas det. Basshead, var tog du vägen? Jag tror du har mycket att tillföra vid problem.

Författare:  Oskar [ 10.25 2018-01-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Läser med spänning :)
Har hela tiden varit nyfiken på benämningen på motorn, "pumpsydiesel". Varför heter den så?

Författare:  Joe [ 11.19 2018-01-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

"Insprutningspumpen" sitter i spridaren (düse på tyska) och drivs av kamaxeln

Författare:  Oskar [ 11.45 2018-01-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Intressant, jag läste inte ens tråd rubriken så, gjorde inte den kopplingen till tyskans "dyse". Så spridaren påverkas mekaniskt av kamaxeln och trycker byggs upp så, sedan öppnar en magnet som finns i spridaren och släpper in bränslet?

Arrangemanget liknar ju lite BMs första en och tvåcylindriga dieslar. Den tvåcylindriga som satt i Volvos "Victor" traktor bla. Den har om jag inte mins fel ingen riktig separat dieselpump utanför blocket utan två kolvar som påverkas av kamaxeln som bygger upp trycket.

Författare:  Janson1 [ 11.52 2018-01-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Victorn hade nog mer integrerad insprutningspump med ledningar fram till spridarna.
Annars så stämmer benämningen på PD diesel "Pump Dyse", enhetsinjektor som är mekaniskt driven och elektriskt styrd.

Författare:  Janson1 [ 20.41 2018-01-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har kört fast... Provat hela ECU-programmet inne på "konstruktionsavdelningen" Kört från nästan nollfart upp till tomgångsvarv ca 850 RPM och den gör som den bör. Men motorn orkar inte gå, bara småtända på en cylinder.
Där står jag nu... Det lutar åt att det faktiskt är nåt vajsing med motorn nu 16 år senare när jag äntligen skall ha den.

Författare:  mrfrenzy [ 21.11 2018-01-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kan ju vara flera saker.

Börja med att mäta kompression så vet du om motorn är frisk.

Sen kolla att alla spridare ger bränsle.
Isåfall måste det vara något med timingen mellan vevaxel och kamaxel eller timing av spridarna.

Författare:  Janson1 [ 22.30 2018-01-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kompressionen är inte mätt och jag har ej denna utrustning heller men från början saknades lite av kompet på en cylinder men det har hämtat sig. Den har glödning men det gör ingen skillnad så förmodligen får en cylinder soppa men inte dom andra tre? Jag har byggt en liten "spridartestare" där man kan köra spolarna i olika fart och pulsbredd.
Den spridaren som fungerar är lite tystare i nålen än dom övriga tre ej fungerande. Jag tror det beror på att dieseln är framme rätt på den som funkar medans dom andra är torra. Sen om dom behöver luftas eller är allmänt dåliga är svårt att gissa. Nu 16 år senare så kan ju vad som helst obra ha hänt? Men vad jag kan se så är timingen rätt...

Författare:  mrfrenzy [ 00.14 2018-01-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Leta reda på servicemanual till bilen och kolla hur man luftar. Sedan när man vet att luften är borta kan man ju prova skifta spridare om inte alla ger flöde.

Glödning behövs inte vid plusgrader.

En kompressionsprovare kostar 199kr på Biltema.

Författare:  mrfrenzy [ 00.34 2018-01-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Steg 1, lufta matningen
Citera:
If you put an unfilled filter on it, and didn't draw fuel up from the tank, then you've got air in the loop from filter through the head and back to the filter. Use a hair drier to warm the thermostatic T on the filter. Don't melt it. Once it is warm (greater than 120F), turn the key on while the lift pump runs, off for 10 seconds, on again while the lift pump runs, and repeat several times. You might want to keep the hair dryer warming (but not melting) the T. This will allow the lift pump to push fuel up and the air to get pushed back to the tank. Some intermittent cranking is allowed to have tandem pump push fuel through the head. 



Steg 2, lufta spridarna
Citera:
Remove the glow plugs. Have an assistant turn the ignition key to operate the starter. The engine will run much faster without engine compression and any air in the fuel system will more quickly purge. Run the starter for 15 second intervals. Cycle the key between start cycles to help prime the fuel into the filter and fuel lines. After 3-4 attempts, you will notice fuel mist coming from the glow plug holes. When each glow plug hole has an equal amount of diesel mist coming out, reinstall the g.p.'s and the engine will start.

Författare:  Janson1 [ 00.49 2018-01-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har försökt hitta en manual men har väl inte lyckats nåt vidare än. Jag har kollat igenom Youtubeklipp om detta men ingen har nämnt nåt om urluftning, jag har läst någonstans att dom är självluftande men är en av alla dom små kanalerna i spridarens urluftningssystem täta så hjälper väl inget? Vid plusgrader så används väl glöden bara för att hålla avgasvärdena i schack. Men jag har provat både med och utan, det den gör med glöd gör den lika bra utan.
Spridarna är ganska pöliga att byta plats på bara för testandets skull, där sitter en koppar bricka som tätning mot förbränningsgaser som inte får läcka något alls då förbränningsgaserna går rakt in i spridarens bränsletillopp. En dålig konstruktion helt enkelt... Men jag är berädd på att köpa nya packningar och verkligen kolla/prova spridarna på nåt bra sett.
En 199 kr komptestare skulle nog inte funka, det är mer än 20 bar i tryck, kanske uppåt 30 bar?
Biltema har för dieslar med, men 3000 spänn är väl i högsta laget. Skall kolla om det är någon som har en.
Nu tror jag inte det är kompfel ändå...
Edit: ang denna luftning så har jag väl i princip gjort exakt så, nu har jag inte motorn i nån bil men jag har handpumpat fram till matarpumpen. Det går inte att pumpa förbi matarpumpen utan den måste snurra samtidigt = köra på starten. Nu har jag inte haft ur glödpluggarna vid dom sista tillfällena så det skall testas, man borde helt klart se dimman när den far upp.

Författare:  mrfrenzy [ 01.26 2018-01-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ok såg inte att den hade så lågt tryck.

Här finns för 499kr
https://www.vidaxl.se/e/8718475816232/k ... are-diesel

Återkom med resultatet av luftningen.

Författare:  Janson1 [ 07.41 2018-01-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Tackar för länken! det blev en komptestare och en verktygsvagnslåda också...

Författare:  Janson1 [ 15.33 2018-01-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har jag lyckats lufta ur 3 st spridare, den fjärde går i gång men stannar igen efter en stund. Jag tror den läcker in förbränningsgaser då jag inte bytt kopparbrickan längst ner. Men det är inte det största problemet just nu...
När den tänder några gånger och är på väg att starta så tappar ECU:n tandpositionen och motorn stannar/fortsätter på starten tills nästa vända likadant. Jag skall försöka programmera insprutningsmängden mindre aggressivt och försöka få tandräknaren mer immun mot stora plötsliga hastighetsskillnader. I dag mäter jag tiden per tand och jämför mot föregående tands tid. Om ny tid är ca 3 gånger längre än föregående är vi på tandluckan, sen jämför vi tandluckstiden med nästa nya och när den nya tiden bara är ca en tredjedel av den förra är vi förbi luckan och på tand 1 (0). När motorn helt plötslig tänder ett par tre gånger får tandräknaren för sig att vi är på luckan och nästa insprutningstillfälle blir helt bywest.

Författare:  Joe [ 17.21 2018-01-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Har du koll på fly-back (back emf) från spridarna så det inte stör µC'n?

Författare:  Janson1 [ 17.46 2018-01-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har gjort så gott jag kan för att undvika detta och har aldrig haft några problem hittills.

Författare:  Janson1 [ 12.28 2018-01-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Den har startat och jag har kört den en stund, fast den är bara trecylindrig... Den blev fyrcylindrig en kort stund sen dog den och blev omöjlig att få igång igen. Jag tror den putter upp förbränningsgaser i bränslet via den beg. kopparbrickan, så en ny kopparbricka sen påt igen...

Författare:  milsson [ 19.42 2018-01-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hejja hejja!!

Författare:  hcb [ 20.04 2018-01-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag håller med! Tyvärr kan jag inte tillföra något, men jag uppskattar alla uppdateringar.

Författare:  Janson1 [ 07.15 2018-01-11 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Tackar!
Delar beställda! Nu skall jag jobba ett par dar för brödfödan men sen...

Författare:  GFEF [ 09.28 2018-01-11 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

>koppar bricka som tätning mot förbränningsgaser som inte får läcka något alls
> då förbränningsgaserna går rakt in i spridarens bränsletillopp.
>En dålig konstruktion helt enkelt...

En mjuk glödgad koppar bricka är ingen dålig tätning på heta ställen.

Men koppar hårdnar vid kallformning som åtdragning av koppar tätning.

Går att i flesta fall att mjuk glödgad igen....

http://www.classicmotor.se/artiklar/exp ... aluminium/

Författare:  Janson1 [ 20.43 2018-01-11 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En kopparbricka är jättebra som tätning men resten av konstruktionen gör systemet väldigt känsligt för allra minsta läckage. Jag håller på med andra dieselmotorer som merca har byggt från början, dom har common rail och där kan jag se att det kommer upp klegg mellan spridarna och topplocken på en cylinder av fyra inom 500 timmar. Om det nu är likadant i denna PD-diesel så hamnar ju den skiten direkt i spridarens sil, och allra minsta luftläckage slår ut en eller flera spridare direkt. Silen är integrerad i hylsan bestående av flera hundra hål som inte syns för blotta ögat, men finns där ändå. Dieseln mer blöder igen denna sil och det är ganska svårt att få rent den om så behövs.
Jag hade lite fundering på att glödga om brickan men den hade några ränder som kanske ger läckage igen och nu vill jag inte chansa på "målsnöret"

Författare:  Joe [ 21.11 2018-01-11 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Har en V70 D5 som har samma problem att det sätter igen mellan spridare och hylsa.
Däremot så på mina traktorer sitter det också kopparbrickor och där har det inte blivit läckage på 40-50år.
Skillnaden är aluminium mot gjutjärn (och förbränningstrycket)

Författare:  Janson1 [ 19.43 2018-01-12 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Lite inte elektronik... Det är skitviktigt att spridaren sitter 100 % centrerat och 110 % viktigt att den pressas med samma tryck från bultarna om det är en på varje sida. Den måste sitta helt i mitten när slutdragningen är gjord, läcker den fortfarande är det nog nåt med sätet eller spridaren.

Författare:  Janson1 [ 12.56 2018-01-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En liten resumé: Nu startar motorn och går som den skall. Spridarfelen och trecylindrigheten får nog tillskrivas mest luft i dieselsystemet. Men en trolig orsak har också varit hallgivaren som känner kamaxelns läge. Vid startvarv utan glödstiften monterade så har den lämnat aktivt låga pulser, vid startvarv med glödstiften monterade (lite långsammare och ryckigare gång) har den lämnat aktivt höga pulser och om den ändå till sist har startat så har antingen min kamräknare stängt av kamaxelingångens pulser (blivit döv för dom) eller så har den startat ändå och blivit resetad till första cylindern (cyl 4) i arrayen varje gång en felpuls kommit. Jag ryckte kamgivaren och körde utan, den startar ju ändå på några försök (teoretiskt var fjärde gång). Som åtgärd fick jag göra två saker, dels flytta kamgivaren fysiskt mer ifrån tanden och dels byta i sketchen från LOW till HIGH då givaren behagade att lämna ut bara aktivt höga pulser från lägsta startvarv till, ja i alla fall 3000 RPM för min programmering är mjukvarustoppad där än så länge.
Komp.testutrustning har kommit och jag gjorde ett test, fast först fick jag svarva teströret koniskt för att inte fördärva glödstiftkonan i topplocket, ja, man kan inte få allt färdigt... Kompet var ganska exakt 27 Bar på alla cylindrar trots lång slang på mätutrustningen, detta är fullgott. Det statiska kompressionsförhållandet är nog minst 18:1 eller nåt sånt?
Så, nu startar den på mellan ett halv varv till två varv varje gång, har i och för sig bara testat 10-15 gånger hittills...

Författare:  Oskar [ 14.59 2018-01-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Underbart! Vi som följt ditt projekt hoppas snart få se och höra motorn :tumupp:

Författare:  hcb [ 15.10 2018-01-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, bilder, snälla!

Författare:  Janson1 [ 20.19 2018-01-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bilder ja... Här kommer ett par bilder, kanske lite intetsägande.
Första bilden är den nyinköpta komptestaren, själva röret behövde ju konas lite innan användning, se ner till vänster.
Bilaga:
IMG_20180116_141301.jpg


Nästa bild är testbrädan DeLuxe i plywood. Förutom kortet finns 4 lysdioder till spridarstegen, x antal potar som skall simulera div temperaturer, tryck och egna påhittade värden. Tex har jag gjort så man kan ställa tidigaste insprutningstart på maxvarv och senaste insprutningsstart vid tomgång via två av potarna och man kan då samtidigt höra/lukta/se hur motorn beter sig med olika förtändningar vid olika varvtal
Bilaga:
IMG_20180115_124846.jpg


Jag funderar på att anlita min son till att göra ett youtubeklipp och lägga ut...

Författare:  Oskar [ 20.39 2018-01-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Fundera inte, gör det bara!!

Gillar testuppställningen skarpt! :tumupp:

Författare:  Janson1 [ 20.53 2018-01-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Lite mer bilder... Först själva ECU:n uppspikad bakom "instrumentbrädan" med betoning på brädan.
Bilaga:
IMG_20180118_203446.jpg


Nästa vy instrumentbrädan och motorn
Bilaga:
IMG_20180118_203429.jpg


Tredje vyn själva moroten.
Bilaga:
IMG_20180118_203411.jpg


Om jag skall hålla på och prova vidare behöver jag ett riktigt avgassystem och kanske en "testcell"??
Nästa del förutom mera provkörningar är att bygga en växellåda. Nu är ju detta ett elektronikforum med vad jag förstår tonvikt på just elektronik, men om intresse finns så kan jag ju fota och skriva om växellådetillverkningen också??
Är det någon som har intresse och undringar, bara fråga!
PS: Finns det någon annan som håller på med att programmera antingen PD-diesel eller common Rail diesel? DS.

Författare:  Oskar [ 22.05 2018-01-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Måste ställa frågan då jag antingen missat något inlägg i tråden eller så har det bara inte framkommit. Skall motorn sedan hamna i något fordon eller annat projekt?

Författare:  Janson1 [ 22.35 2018-01-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En bra fråga faktiskt... Jo, från början så var det tänkt till ett flygplan. Jag har programmerat hela sketchen för det avseende varvtal effektpuckel mm. Jag har under åren som gått själv tvivlat lite men nu med förnyad energi och att jag faktiskt kan se ett ljus i mörkret så blir det nog till ett fpl ändå. Jag tror jag skrivit detta förut men det är en gammal dröm från början av detta årtusende att konvertera en dieselmotor till flyget. Nu har ju ett par aktörer hunnit före mig med detta men jag antar att det beror på mer pengar? Thielert från Tyskland bla annat har gjort ungefär som jag tänkte från början och även Austro Engine har hakat på. Min största utmaning förutom programmeringen av ECU:n är nog vikten, en flygmotor bör vara så lätt som möjligt. Med ett motorblock av gjutgods och mycket stål så måste vikten motsvara många hästar. Ju starkare jag kan få motorn desto lättare blir det att räkna hem kalkylen hkr/vikt. Nästa del i projektet är ju en växellåda, det blir en tandremsväxel med utväxling 1,6:1 dvs motorn gör 1,6 varv per 1 propellervarv. Själva remen är 100 mm bred med 12 mm tandavstångd, har jag för mig. Då den skall sitta i ett fpl så behövs ingen koppling. Men däremot kan man få problem med ryckningar och självsvängningar i drivlinan som överstiger max moment som motsvarar faktisk effekt. Som första åtgärd tänkte jag behålla dubbelmass-svänghjulet, det är ändå testat och välutprovat i en bil. Men den dagen den sorgen...

Författare:  Hedis [ 00.12 2018-01-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har inte mycket annat att tillföra än Heja Heja!!! :)
Riktigt kul att du fått snurr på den.
Jag följer tråden med spänning.

Författare:  Oskar [ 08.56 2018-01-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vilken spännande applikation! Jag antar att du därmed måste fundera en och två gånger extra på att designa in redundans. Motorn får ju absolut inte stanna. Det finns ju en anledning till att man på små flygplansmotorer använder riktigt ålderdomliga motordesigner som är beprövade och magnettändning (dubbla, visst?) och så vidare.

Har du flygplanet redan, eller planerar du inför något byggsatsprojekt?

Författare:  Janson1 [ 17.36 2018-01-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, egentligen hade jag två franska kandidater, en Socata Rallye MS880 B och en Robin (uttalas Robäng) HR 2110 men båda är av olika anledningar sålda... Den ena som flygplan och den andra som "renoveringsobjekt". I dag om det blir aktuellt så skulle jag nog välja en (om nu inte Rallye) Cessna 172 av i princip vilken årsmodell som helst. C172 är en lättflugen kärra och har bra möjlighet vikt och balansmässigt att släpa omkring på denna dieselpjäs utan några större problem. Och om motorn stannar så är en C172 eller en gammal Rallye ett av dom bättre planen att sitta i just vid motorstopp, för det måste nog kalkyleras in i kråksången?
Redundansen blir dubbla oberoende spänningskällor, dubbla ECU (A och B), dubbla vevaxelgivare, dubbla gaspotar som dessutom har microswitchar så det finns tre grundlägen utan gaspot, (om nu bägge skulle ge upp) tomgång, marcheffekt och full effekt. I princip skulle man klara sig med dessa tre grundlägen. Men hur man än vrider och vänder på det så är det bara en motor, en växellåda, ett bränslesystem, ett oljesystem. Det ända som är riktigt positivt är att den har 4 av varandra nästan oberoende spridare, så länge dom sitter fast i topplocket ordentligt så kan motorn bli både trecylindrig och tvåcylindrig innan det blir superkris.

Författare:  Janson1 [ 22.58 2018-01-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ni nu som kan Arduinoprogrammering som rinnande vatten. Jag tror jag fått in antingen virus eller fått nåt vajsing på en fil som jag tror sen smittat vidare? Det började med att jag använde ett litet hjälp-program, en headerfil, PureAtmega328.h istället för pinMode() då det enligt uppgift skall vara lite snabbare och ta lite mindre bitar också. Rätt som det var började ett av mina alster "hänga sig", en spridarutgång gick hög och man blev tvungen att hårdvarureseta den varje gång. Jag felsökte mycket men det ända som det blev bättre av var att byta tillbaka till pinMode() igen. Några dagar senare så klonade jag den genom att ge den ett nytt namn och fortsatte arbeta med kopian. När jag sen skulle testa nya funktioner så hade allt ballat ur, det var ingen reda med några tider, uppräkningar, det var allmänt kaos i funktionerna. Jag backade tillbaka steg för steg tills den blev som originalet men den fungerade inte ändå, jag hade tom lika många bytes (6099 tror jag) på bägge filerna men den ena gick, den andra kass. Vad kan ha gått snett? Egentligen skiter jag i vilket, det skulle bara vara roligt att veta så man inte gör om misstaget om det nu går att fredja sig från det. Hur beter sig en Arduino som man programmerat "slut"? Orkar man det? Jag tror själva sketchen verifieras efter programmering så det borde borga för att det blir rätt varje gång? Normalt sett så använder jag Kinakloner både som Uno, Nano och Mega men jag har ett original av Uno och Nano som jag tar fram och jämför vid tveksamheter, hittills har det aldrig varit någon skillnad mellan exemplaren...
Så era åsikter om detta önskas.

Författare:  Klas-Kenny [ 07.42 2018-01-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Virus i en Arduino låter osannolikt. :humm:
Men den där headerfilen, varifrån kommer den? En sökning på Google gav inget annat än din tråd på Maskinisten...

Om man skriver för många gånger till ett flash-minne (som programminnet är) så tappar det skrivförmågan och blir i princip read-only. I och med verifiering så ska programmering bara misslyckas, utan att kunna bli fel.
Och de brukar ju tåla i storleksordningen 100k skrivningar, svårt att tro att du uppnått det.

Även kina-kloner brukar ju ha genuina processorer, bara mönsterkort och kringkomponenter som skiljer. Så det ska inte kunna orsaka ett sånt här problem.

Men exakt vad som faktiskt händer, kan i alla fall inte jag sia om. :)
För jag antar att du testat mer än en Arduino med samma program..? För det är klart att de kan ju gå sönder på konstiga sätt av tex. ESD och liknande. Eller någon oscillator eller liknande som ballat ur.

Författare:  hawkan [ 10.12 2018-01-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Låter som en traditionell bugg tycker jag.
Om du får fel med den specifika include-filen får man misstänka den, och antingen skärskåda den så den verkligen är rätt eller gå runt den med annan kod.
Att programmet skulle flashas fel, nä inte om det görs en verifiering som det brukar göras efter skrivning. Har för övrigt aldrig varit med om felaktig flashning men det kan ju hända antar jag.

En approach är "divide-and-conquer" dvs söndra och härska (det är nog egenpåhittat namn för det finns en rekursiv algoritm som kallas så men det är inte det jag menar). Dela upp koden i mindre och mindre delar tills du har kontroll på att saker verkligen går rätt. Och sedan gradvis återställ koden tills det blir fel och felet kan isoleras.

Men som sagt, låter som en vanlig bugg.

Författare:  Janson1 [ 22.34 2018-01-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har fortsatt att använda samma exemplar om och om igen och dom funkar vidare så någon skada på hårdvaran eller bootloadern har det inte blivit. Men som sagt, jag har kastat den trasiga filen och även den som ev är upphovet till problemet? PureAtmega328.h fick en annan Maskinist nys om och jag har använt den en del när det är tidskritiskt, den gör inga underverk i min sketch då jag kan se ungefärlig skillnad i anropstid på scopet, det tar mellan 12-15 uS att sätta en utgång från låg till hög och tillbaka till låg, egentligen skulle utgången varit låg hela tiden men det är tidsåtgången för Arduinon att komma på att utgången kunde varit låg hela tiden då hög är 0 uS. Om jag använder pinMode istället så tar det 14-18 uS för samma grej. Jag antar att arduinon klarar 16 klockpulser per uS. 16 x 12 = 192 klockcykler 16 x 18 = 288 klockcykler.
"Förtjänsten" är i häradet lite under 100 klockcykler mindre med AtMega328.h om jag nu har räknat någotsånär rätt??
Men, hur räknar man ut den totala precisionen i Arduinon? Jag blev varnad för väldigt dålig precision typ + - 39 grader fel på vevaxelläget, se inlägg på sid 2. Vad jag kan se så är jittret inom några få uS, tilläggas skall att spridaren har en påslagsfördröjningstid på ca 450 uS, dvs man måste starta spridaren ca 12 vevaxelgradergrader före kalkylerad starttid som dessutom minskar en bra del när batterispänningen ökar, ja så mycket att jag måste mäta batterispänningen och göra en algoritm för justering av påfördröjningen. (i dag har jag den fast på 450 uS)

Författare:  mrfrenzy [ 00.42 2018-01-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hur mycket skiljer klockfrekvensen på arduinon när du varierar temperaturen från -20 till +50 grader?
Det är väl det som skulle kunna påverka ditt enstaka exemplar.

Om man ska massproducera måste man ha koll på toleransena så inte varje enhet behöver kalibrera separat men det behövs knappast här.

Författare:  Janson1 [ 07.08 2018-01-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kristallfrekvensen kan knappast vara nåt problem, det brukar skilja sig inom ppm från lägsta till högsta. Som realtidsklocka blir den värdelös men i denna app så tror jag det är försumbart. Dessutom ger det ju inget jitter. Nu vet jag i och för sig inte om det är kristall eller bara en resonator som ger referensen det borde inte vara boven i dramat då faktiskt motorn är en av dom viktigaste klockorna i sketchen.
Hur som så är "mitt" jitter mindre än försumbart. Jag har ju även en Arduino som agerar "motor" och man kan inte se någon antydan till fladder /jitter från den mer än glappet i varvpotentiometern. Men däremot den riktiga motorn, den ger gitter, vevpulserna påminner lite om ett dragspel i aktion... Och ECU:n följer med så fint. Det man skulle kunna tänka sig ge ett svårberäknat fel är att på tex tomgång slutar ECU.n att räkna vevpulser ca 4 tänder innan insprutnings-start. Där kan motorn sacka i fart utan att det egentligen är verifierat, ECU:n går med död räkning sista biten, men som sagt detta fungerar ju onekligen ändå...

Författare:  Janson1 [ 20.48 2018-01-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I dag har jag labbat lite mera och flyttat fram insprutningsbörjan från ca 6 grader till 12 grader BTDC (Before Top Dead Center) och det gjorde riktigt gott! Nu ryker den inte alls men luktar fortfarande skunk, DET kan jag leva med... På min nya sketch har jag lagt in analogingångar med potar så nu går det att justera bästa förtändning under drift både på tomgång och på maxvarv men hänsyn till ljud (oljud) lukt och värme. Men nåt måste ha gått snett på nya sketchen för motorn var stendöd... Rent generellt så är det mycket att ta hänsyn till, typ batterispänningen påverkar spridarnas fördröjningstid, den tid det tar från att spridaren strömsätts tills den stänger ventilkäglan och insprutningen börjar på riktigt. Så jag måste mäta batterispänningen och kalkylera fram en variabel som tidigare lägger insprutningsbörjan mer eller mindre med hänsyn till hur många volt systemet har för tillfället. Jag måste nog också lägga in olika spridarstarttid beroende på om motorn är kall eller varm, detta är väl kanske inte riktigt nödvändigt? Men nåt händer med spridarna när motorn blir varm då den är mycket mera lättstartad kall. Jag misstänker att när spolarna i spridarna blir varma så blir dom generellt "tröttare" och kräver mer tid för att komma igång, kanske måste man lägga in en variabel för detta med? Nåt som jag däremot önskar slippa är att göra en variabel per spridare, det borde inte vara så stor skillnad mellan dom??? Jag har både hård och mjukvarumässigt möjlighet att lägga in variabler på utetemp, motortemp, (bränsletemp), utetryck, turbotryck, turbotemp som kan finjustera både spridarbörjan och spridarslut om så behövs. Det finns redan två turbotryck/turbtempluftgivare och en atmosfärstryck/atmosfärstempgivare förutom motortempen, så det är väl bara fantasin som sätter gränsen hur fancy det skall bli på slutet...

Författare:  milsson [ 21.02 2018-01-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

På, t.ex, Volvos lastbilsrovor från slutet av tiotalet så var det en kalibreringskod på varje spridare som skulle skrivas in i parameterfilen. Så det är inte omöjligt att man måste ha en separat "map" eller algoritm för varje spridare.

Författare:  mrfrenzy [ 22.11 2018-01-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det finns två olika metoder.
I ena fallet leverans spridaren uppmätt från fabrik med data över flöde vid olika tryck och tider typ QQEE1FARECTB

I andra fallet sker kalibreringen i bilen. Motorn ska vara varm och man väljer "kalibrera spridare" den står sen och testar olika parametrar vid olika varvtal för varje spridare.
Kräver förmodligen bredbandslambda.

Författare:  Janson1 [ 22.56 2018-01-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Original så har bilens ECU en strömkännare på spridarnas gemensamma minus som känner den verkliga strömmen och när nålventilen bottnar och spridaren börjar sin insprutning. Om det ligger lite fel i förhållande till vad det bör så offsetas spridaröppningstid lite plus eller minus som en kompensation, detta har jag inte byggt in i min konstruktion denna gång. Men precis som det skrivs kan jag göra 4 separata finjusteringar, en för varje spridare om det nu visar sig behövas. Detta fel som jag eventuellt upplever kan ju också bero på 15 års törnrosasömn... Nu kommer jag bara att labba med motorn som den är, det är nog viktigt att den får gå en bra stund och bli genomvarm och garanterat upplead i alla detaljer.
Nästa stora utmaning blir ju växellådan...

Författare:  Janson1 [ 15.22 2018-01-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kunde bara inte låta bli... så jag la in en individuell justering per spridare så man kan få spridarna att öppna tidigare/senare som kompensering till olika trögheter per exemplar. Bra att ha!

Författare:  Janson1 [ 23.19 2018-01-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En övervakning behövs ju också så därför har jag gjort en ECU-Control som lämnar ut delvis basdata till en display som visar varvtal, motortemp, effektsetting, bränsleförbrukning (momentan). Och dels skall man kunna koppla in sig via datorn och få ut detta och mer som tex. turbotryck, turbolufttemp, atmosfärstryck, atmosfärstemp, motor och propellervarv (1,6/1) och vilken ECU som är aktiv. I dag har jag inget minne som sparar undan data men det ligger på önskelistan. Det finns ett inbyggt Eprom i kretsen som man kan lagra data, ett tag sen tar det väl slut? Jag har funderingar på att använda ett USB-minne och lagra tex varannan sekund och när det blir fullt så skjuter man bara det äldsta över kanten... Och, får man problem så är det bara att gå tillbaka en bit om man inte väntar för länge... Ev så kanske ett USB-minne räcker motorn ut? Jag har provat att programmera lite inför ett USB-minne men har egentligen inte lyckats så bra... Är det någon som har nåt förslag? Eftersom det bara är en ECU-övervakning så är det inte tidskritiskt på nåt sätt.

Författare:  milsson [ 00.16 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Can bus!! Det finns redan en standard för hur man presenterar data i j1979 (OBD).

Författare:  Janson1 [ 06.40 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det med can bus vet jag inte om jag fixar, sen har jag redan Arduinons bussytem färdigt.
Finns det några färdiga förslag med Arduinon tro?

Författare:  milsson [ 07.18 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Sant. Det är bökigt om man inte har en susning om hur det funkar. Dessutom skall det till extra hårdvara för det fysiska gränssnittet, och det blir ju lite overhead varje cykel för att presentera datan.
Det är dock en jävligt bra kunskap att ha om man håller på med fordon mycket.

Det finns lite färdiga librarys till arduino för att hantera can bus jag har inte hållit på med just arduino så jag vet inte hur bra dom är.

Författare:  Klas-Kenny [ 09.26 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Elektriskt Interface för CAN är ju i princip bara en enda liten krets, så det bör vara överkomligt.

Ett sätt att slippa overhead i ECU'n om det är jobbigt att hinna med vore ju att ha en ytterligare processor för att hantera CAN, vilken pratar typ SPI eller annat lättarbetat med ECU'n. Kunde ju räcka med en enda sån till båda ECU'er om man bara tänker till så att de inte kan påverka varandra. :)

I övrigt för datalagring, USB-minne är kanske inte det smidigaste. Kan inte tänka mig att det är särskilt enkelt eller vettigt att implementera USB-host i en Arduino.
SD-kort eller annat kanske kunde fungera? Klart enklare interface.

Och EEPROM har ett ganska begränsat antal skrivningar man kan göra till det, kanske inte optimalt.

Författare:  Janson1 [ 10.45 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har i dag en övervaknings-Arduino som inte gör något annat. Jag har nog en sköld för SD-kort när jag tänker efter, den kanske man skulle labba med? Jag vill inte störa själva motor ECU-Arduinona så inga frågor till dom, bara passiv medlyssning och detta har jag redan idag. Det jag saknar är väl egentligen bara loggningsfunktionen för att kunna se dåtid.

Författare:  ecenier [ 10.52 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kolla in LIN som är mer lättviktig än CAN. Det finns lib-ar till Arduino.

https://en.m.wikipedia.org/wiki/Local_Interconnect_Network

Författare:  Janson1 [ 14.34 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror inte det är detta som jag egentligen behöver. Jag har hittat min SD-card reader/writer och har nu hittat ett litet färdigt program som kan skriva, läsa, sudda. Det är nog där jag skall börja. Det passade tom direkt istället för displayens kontakt, bara att kroka i. https://www.mschoeffler.de/2017/02/22/h ... duino-uno/
Nu är det konstaterat att det funkar, nu skall jag bara försöka skriva in värden typ varannan sekund och se om det sparas och om jag kan ha nytta av datan senare...

Författare:  Janson1 [ 18.44 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Då var en logg fixad. Dom mest behövda värdena tillsammans med tidsangivelse var tredje sekund sparat på ett SD-kort som sen kan läsas ut på datorn, även en förklaring följer med loggen. Med hjälp av den här filen jag länkade till förut så var det ganska enkelt at skräddarsy den till min sketch. Open sourse är inte så dumt.

Författare:  Janson1 [ 23.08 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har jag har stött på problem!! Jag flyttade runt lite bland I/O:sarna och tog bort en funktion som jag inte kommer att använda och fick dit en display men den funkar inte... Jag har använt #include <LiquidCrystal.h>fil och använt ben 4,5,1,7,10,9 till displayen och kollat flera gånger och det är rätt kopplat (det är det, nog). Ben 1 är ju RX1 som man bör undvika om möjligt men både programmering och läsning via monitoren fungerar, SD-kortet likaså. Finns det ben som inte är användbara till LCD-displayen? (Det är en 4 x 20 med RS,EN,D4,D5,D6,D7 som är inkopplade)

Författare:  Klas-Kenny [ 23.30 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Citera:
Ben 1 är ju RX1 som man bör undvika om möjligt men både programmering och läsning via monitoren fungerar


Well, det sitter väl något i "andra ändan" av Rx, en utgång antagligen. Så länge den är aktiv lär det ju inte fungera vidare bra att sätta pinnen till utgång och styra ut en signal där.

Författare:  hawkan [ 23.56 2018-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Trots det borde det fungera. Det går naturligtvis inte att samtidigt använda seriekommunikation med Serial.begin. Men kan du använda någon av de analoga pinnarna istället? De fungerar även som digitala io.

Författare:  Janson1 [ 06.54 2018-01-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jo, det borde gå. Jag använder Serial.begin() men sänder bara ut på det andra stiftet som jag inte lagt beslag på... Men jag skall testa att stänga av Serialen som prov. En analog pinne som digital får bli i yttersta nödfall då alla analoga redan används (8 st). Det är helt enkelt brist på pinnar och jag har redan ett "färdigt" kretskort. Men testa skall jag göra men förmodligen inte innan tisdag kväll som först då jag även måste jobba lite...

Författare:  hawkan [ 07.17 2018-01-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysedi

Du använder en Nano om jag förstått rätt? Både rx och tx blir anslutna till en intern uart när man använder Serial, både pinne 0 och 1. Det stör. Serial.end borde släppa detta fritt men har inte testat själv. Bara gissade att du hade nån analog pinne ledig. Det kanske finns nån annan pinne som kan samsas om en funktion?

Författare:  Janson1 [ 08.51 2018-01-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det är ju värt att testa Serial.end. En annan fundering, om man nu gör om funktionen på RX1 och ev TX1. Kan man programmera den mera sen, eller låser man nyprogrammering för gott?
Jag tror i och för sig att den alltid startar via bootloadern och är en "ben 13 lysdiodsblink" precis innan det nya programmet startar, men det är en ren gissning från min sida...

Författare:  hawkan [ 09.28 2018-01-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag anar att du tycker det finns två seriella portar, 0 och 1? Det finns bara en seriell hårdvaruport på en atmega328, kopplad till pinne 0 och 1, en pinne for transmit och en för receive. Jag *tror* att kopplingen sker i och med Serial.begin och Serial.end. Har man gjort Serial.end eller aldrig använt något seriellt så borde pinne 0 och pinne 1 vara fria att använda som en vanlig port. Det skulle jag ha satsat på. Tycker det borde gå att växla mellan olika funktioner.
Det finns också flera varianter av SoftwareSerial som kan använda i stort sett valfri pinne(?) för seriell kommunikation. Såg att det även fanns en som bara skickade data på en pinne, det kan kanske vara något om du mest är intresserad av utskrifter eller envägs. Här får du nog leta på nätet för att hitta detta, vet ej exakt var det finns.

Författare:  Janson1 [ 19.59 2018-01-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Då denna del i systemet inte är egentligt tidskritiskt så tror jag om det funkar utan Serial.begin() så är det ju bara att lägga Serial.begin() i loopen och sen lägga Serial.end efteråt, detta kan ju fungera, skall testa i morgon som tidigast. Däremot så finns det inga pinnar över så man tjänar nog inget på att försöka flytta runt.

Författare:  Janson1 [ 19.33 2018-01-31 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det funkade inte... Däremot när jag provade att göra om A0 till 14, då funkade allt, Displayen, seriell nutidsdata och sparning på SD-kortet, enda abret är att jag har bara 7 analoga ingångar och behöver alla 8. Serial.end() funkar som kod men hjälper mig inget i detta fall. En annan fråga: Jag använder en heatherfil som heter. SD.h, där skall man använda vissa ben som är öronmärkta till just SD-modulens SCK, MOSI, MISO, går det att byta dom benen på Arduinon till för mig mer lämpade?

Författare:  Janson1 [ 21.37 2018-01-31 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vågar nog nästan svara mig själv att dom benen verkar vara hårdvarubundna till mosi, miso och sck... Men jag skulle ändå behöva ett till ben...

Författare:  Joe [ 21.51 2018-01-31 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Byt displayen ifrån HD44780 till tex SSD1306 som kör I2C ?

Författare:  Janson1 [ 21.56 2018-01-31 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, jag tittar faktiskt precis på det nu men varför inte SPI bus lika gärna? Fast jag har nog en I2C display hemma redan, fast den är nog väldigt liten.

Författare:  Janson1 [ 06.39 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nya problem att lösa. I2C lägger beslag på 2 analoga ingångar så det får nog gå bort om dom nu inte går att omdirigera?
Men, man kan ju sätta två NANO på varandra och låta en ha hand om displayen och den andra ha hand om SD-kortet via SPI interfacet och varför inte en realtidsklocka, tex DS-3234 från Dallas, den har också SPI. Det verkar som programmeringskontakten har MOSI, MISO, SCK, plus och minus, det är bara chipselekt som saknas. Man borde väl kunna koppla in bägge SPI-modulerna parallellt och bara ha två separata cs? Vidare kan bägge NANO:sarna ha samma serialprogram och visa samma oavsett vilken man kopplar in till datorn.

Författare:  Janson1 [ 06.44 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Eller måste jag bygga en egen NANO-mega med 2560 blaffa? Då lär ju benen räcka och bli över... Men vad jag kan utläsa så är processorkraften ungefär lika som 328?

Författare:  KLset [ 11.14 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Har jag förstått det rätt att pinnarna börjar ta slut och att LCD:n tar upp hela 6 stycken? Jag är novis på elektronik men jag tror att ett skiftregister (eng. shift register) är lämpligt. Registret kopplas mellan Arduinon och LCD:n. Då borde du bara behöva tre pinnar; en för att mata en bit till registret, en för att "skifta" bitarna i registret så att du kan mata in nästa bit och en för att signallera till registret att mata ut sitt innehåll parallellt till LCD:n.

Författare:  KLset [ 11.51 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Du kan också använda I2C på andra pinnar! ATmega328 har vad de kallar för "TWI - 2-wire Serial Interface" som är I2C-kompatibelt. Det är alltså implementerat direkt i hårdvaran, och pinnarna ADC5/SCL och ADC4/SDA används för detta. Men man kan också implementera I2C på egen hand i mjukvaran och använda vilka pinnar man vill. Jag hittade https://github.com/Testato/SoftwareWire som är ett Arduino-bibliotek för just detta.

Författare:  Joe [ 12.20 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

SPI kräver fler ben än I2C och vad jag förstår så är antalet tillgängliga ben problemet?

Författare:  hawkan [ 13.10 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det går att vinna två pinnar till ur en atmega328 men då får du nästan göra ett eget kretskort och löda fast atmegan direkt därpå. Och inte använda en färdig Nano. Det är de två pinnarna till extern kristall/oscillator som går att använda. Atmegan har en intern 8MHz kristall, för att aktivera den istället för den externa 16 MHz oscillatorn behöver man ladda ner en ny bootloader. Det är lite pilligt men inget omöjligt. Du vinner två pinnar, men halverar hastigheten.

Det finns lösningar med mjukvaru-iSP och I2C. Man får se upp bara för de brukar behöva en Timer för att fungera och snart kan antalet Timers ta slut.

En Mega2560 är lika snabb (lika långsam?) som en atmega328p, men har fler pinnar, mer minne, fler Timers, mer mer. Löser nog det behov du har. Själva processorn 2560 har väldigt små pinnar (tqfp) så inget man lödar utan vidare själv på ett kretskort. En Arduino Mega2560 är ju enkelt men stor.

Författare:  Janson1 [ 14.47 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Inga foton, än. Men så här löser jag det nog då jag redan provat. Två NANO på varandra med lite olika programmeringar. På den översta som skall kopplas till SD-kortet kommer jag att använda den 6 poliga pluggen rakt av och jag tar bort reset och ersätter det med tex D6 som cs. Fungerar inte detta så får det bli en annan lösning.

Författare:  Janson1 [ 18.59 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag nästan lovade en bild på lösningen...
Bilaga:
IMG_20180201_183017.jpg

KLset: Riktigt novis är du inte! Det är bra förslag med att använda andra pinnar för I2C än just dom 2 analoga. Med "min" lösning så räcker pinnarna ett litet tag till men jag kanske hittar på fler hyss? Jag skall ju ha en realtidsklocka också, tror jag och det får nu bli en med SPI, det borde funka...
hawken: Jag tror (hoppas) inte jag behöver gå så långt att jag behöver stjäla kristallpinnarna, men som sista option...
Att trycka dit en Atmega2560 kittlar ändå lite, själva lödjobbet ser jag inget större problem med då jag gjort det ett par gånger förut, för det är väl en 4 x 25 benare, finepitch? Själva mönsterkortet är nog bara att rita och sen sjuss iväg till Kina.
Joe: Antal ben klarar sig precis inte med SPI (4 istället för 2) men jag hittar ingen SD-kort läsare utan SPI... Nu skall tilläggas att jag är urdålig, nä kass på att hitta nåt på nätet!
edit: ändrade från PCI till SPI då jag nog blandat ihop dom olika bus-systemen...

Författare:  Skogen [ 19.08 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Finns ju färdiga "mini-Mega", jag har ett par sådana:
https://www.ebay.com/itm/New-Small-Meduino-Mega2560-R3-Pro-Mini-ATMEGA16U2-Arduino-Mega2560-Compatible/162880757867?hash=item25ec73206b:g:-9cAAOSwyQtVnMbp

Författare:  Janson1 [ 20.16 2018-02-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja där slapp jag uppfinna den! Bra att ha i bakfickan utifall att...

Författare:  Janson1 [ 09.43 2018-02-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En annan elektronist, Baron3d skall komma på besök i dag och kolla in läget på motor, ECU, övervakning, kanske lite avlusning också? Inte på oss, bara programmeringen... Det är bra när han är med, det blir alltid nån aháupplevelse inom programmeringen, den kan helt enkelt göra ett jättekliv till det mycket bättre. Jag hoppas på att förstå vitsen med interrupt men inte gjort det än, kanske mest för att det inte behövs i mina alster, än... Mitt nästa delmål är en realtidsklocka med SPI-bus, det blir till att beställa en, Electrokit verkar ha såna.

Författare:  KLset [ 11.09 2018-02-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Jag hoppas på att förstå vitsen med interrupt men inte gjort det än, kanske mest för att det inte behövs i mina alster, än...


Vitsen är enligt mig att man inte behöver instruera processorn att vaka över en input (polling loop) i väntan på att något ska hända. Istället kan den köra någon annan kod som gör något nyttigt. När ett hårdvaruavbrott sker lägger processorn allt åt sidan för att köra den ISR (Interrupt Service Routine) som du bestämt, oavsett vilken annan kod som kördes just då. I slutet på din ISR lägger du till en return-instruktion (reti i AVR) som gör att processorn återgår till det den gjorde innan avbrottet. Inget mer sitta och vänta i en loop. (Mjukvaruavbrott har jag inte mekat med än, så det har jag inget att skriva om.)

Författare:  Janson1 [ 07.06 2018-02-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

KLset: TWI från github fungerade alldeles utmärkt både med SDA,SCL och med egna valda ben. Men inte ihop med mitt SD-kort som har SPI.
Jag bestämmde mig för att skaffa en RTC med SPI ochså, hängslen och livrem... Då skall jag väl få nåt att fungera fullt ut.

Författare:  KLset [ 14.16 2018-02-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
TWI från github fungerade alldeles utmärkt både med SDA,SCL och med egna valda ben. Men inte ihop med mitt SD-kort som har SPI.

Kul att det fungerade! Då är det väl som det ska, för biblioteket var ju för I2C och inte SPI. Stödet för SPI i ATmega328 är också inbyggt i hårdvaran och det är pinnar som är dedikerade till den funktionen. Är SPI-pinnarna upptagna?

Författare:  Janson1 [ 15.56 2018-02-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I dag är SPI pinnarna upptagna till SD-kortet men hoppas kunna köra RTC parallellt med SD-kortet och bara ha två olika chip selekt...

Författare:  KLset [ 22.31 2018-02-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det lät som en bra idé. Jag kommer att använda SPI och/eller I2C i ett av mina egna projekt, så jag försöker hänga med lite i den här tråden och lära mig.

Jag har läst att det går att koppla SPI-enheter seriellt i en så kallat daisychain för att slippa dedikera pinnar till chip-select. Är det något du kommer att testa tror du?

Författare:  Janson1 [ 10.37 2018-02-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Själva inkopplingen (tycker jag utan att ha läst på) borde vara parallell med varsin Chip Select?
Nu i går cadade jag ett nytt kort (PCB) som jag kommer att kalla NANOMEGA, helt enkelt ett NANO fotprint med 45 extra I/O, 8 Extra Analoga och resten digitala, dom flesta har även dubbelfunktioner typ MOSI/MISO, SDA, SCL mm. Den kommer att kräva ett 25 kronors NANO kort i botten (med amputerad processor) för programmering/läsningsbiten, så slipper jag uppfinna det också...
10 kort (PCB) kostar 110 kr från Kina med TNT fram till dörra.

Författare:  KLset [ 15.16 2018-02-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Själva inkopplingen (tycker jag utan att ha läst på) borde vara parallell med varsin Chip Select?

Det är texten från Maxim Application Note 3947: Daisy-Chaining SPI Devices som jag läst. Kortfattat handlar artikeln om detta:

Citera:
In typical SPI systems with one master and multiple slaves, a dedicated chip-select signal is used to address an individual slave. As the number of slaves increase, so do the number of chip-select lines. In this situation, the board layout of the system can become quite a challenge.


Jag saxar två diagram från artikeln:

Bilaga:
3947Fig01.gif

Figure 1. Microcontroller with independent chip selects for multiple slave devices.

Bilaga:
3947Fig02.png

Figure 2. Microcontroller with multiple daisy-chained slave devices.

Om jag förstår dig rätt kör du på varianten i figur 1?

Författare:  Janson1 [ 17.40 2018-02-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Än så länge har jag bara en SPI grunka men hur nästa skall kopplas in återstår att se, jag ser att det går på bägge sätten. Frågan är vad som finns att tillgå som grundsketch? Jag får hem klockmodulen i morgon och är själv hemma som tidigast onsdag, lång väntan... Man måste ju jobba också, ibland.

Författare:  KLset [ 18.39 2018-02-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kikade lite i manualen till ATmega328, och det verkar som att det finns två SPI-enheter i praktiken. Dels finns det en dedikerad SPI-modul, men USART (Universal Synchronous Asynchronous Receiver Transceiver) kan också användas i "Master SPI mode". Kanske är den enkla lösningen att köra en SPI-enhet på varje sådan, givet att du har pinnarna ledigt.

Författare:  Janson1 [ 19.02 2018-02-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror att pinnarna är slut, i alla fall på 328:an...

Författare:  Janson1 [ 08.42 2018-02-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Är det inte typiskt... Det råkar finnas flera schema pinout på nätet på en NANO modul och det som skiljer sig är just RX, TX antingen TX längst ner eller RX längst ner... Utan fysiska kort så får jag gissa och jag känner på mig att jag gissat fel än vilket jag väljer... Vafför är det på detta viset?

Författare:  hawkan [ 11.17 2018-02-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Du skulle kunna använda en Pro Mini istället för en Nano. Den har ingen inbyggd usb utan du får ha en extern seriall usb t ex ch340g för kanske 10 spänn. Då kan du använda Rx och Tx. Men inte samtidigt med seriell komm. Om du bara behöver seriell komm för debuggning kanske det går att samsas med Rx och Tx?

Det är inte heller speciellt svårt att löda dit en 328p direkt på ett kretskort. I o m att du sitter och designar om så kan det vara ett alternativ. Du har ju några från dina Nano du kan använda t ex.

Författare:  Janson1 [ 15.48 2018-02-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu är det ju USB jag vill ha, dels för programmering och dels för att kunna läsa realtidsdata. Min konstruktion bygger på att ha en Nano i botten och "min" Mega upptill. Förhoppningsvis kommer benen räcka till oavsett det är analoga eller digitala signaler, nästa flaskhals blir väl att ALU:n (som är ganska lika som på 328:an) inte hinner med?

Författare:  Klas-Kenny [ 19.25 2018-02-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det kan inte vara så att det bara är olika märkningar på olika varianter? Vissa märker vilket som är tx, andra märker var du ska koppla in tx...
Bara en tanke. :)

Författare:  Janson1 [ 21.37 2018-02-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jodå, jag har tänkt i dom banorna med, beroende var man står så det en uppförbacke likaväl som en nerförbacke... Nu är kortet skickat, får se hur fel det blir.

Författare:  Hedis [ 10.26 2018-02-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det finns inga tankar på att överge dom små Atmel processorerna och leta dig emot någon lite större µC som enklare uppfyller dina önskemål nu när ditt projekt växer i rasande takt. (just "rasande" kanske inte låter så bra när vi snackar flygplansmotor? ;) )

Ta tex. en koll på ST´s STM32 familj.
Där kan du få dels pinnar i överflöd, massa timers, mängder med AD-kanaler, USB, CAN, displaydriver om det skulle vara intressant, SDIO-interface mm.
Du mister ju tyvärr den enorma bank av färdig kod som man enkelt kan använda, men du vinner mycket i form av tex. enkelhet vid debug via JTAG, ovan nämnda storlek gällande I/O och interface istället.

Författare:  carpelux [ 10.50 2018-02-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ett annat alternativ om man ska titta på annan arkitektur skulle ju kunna vara ESP32. Då borde man förhopningsvis kunna använda mycket av den befintliga arduino-koden.

Givetvis går det inte rakt av och det är en 3.3 voltsenhet istället för 5V.
I gengäld får man mycket mer processorkraft (2 cores på 160MHz) och ett antal bussar. Som grädde på moset kommer WfiFi och blåtand.
https://en.wikipedia.org/wiki/ESP32

Författare:  Borre [ 11.01 2018-02-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Eller om du vill hålla dig helt kompatibel med Arduino så en Arduino M0 med 32-bit ARM Cortex M0 med många fler konfigurerbara serieportar tex,
https://www.microchip.com/wwwproducts/en/ATSAMD21G18
Finns i större varianter också.

Författare:  hawkan [ 12.17 2018-02-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det finns alternativ om man vill. Även Arduino Due som varit med ett tag, 32-bitars sam3x8e processerare.
Men det blir säkert bra det TS gjort nu. Det var en Mega2560 om jag förstod rätt för 328 är också en Mega, en atmega 328p.
En Mega2560 har mer av allt så där ska inte antalet pinnar in/out/analog/timers vara en flaskhals längre.
Men skulle ALUn vara en flaskhals, varför tror du det?

Författare:  Janson1 [ 22.40 2018-02-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Oj, det blev mycket på en gång. Först, eftersom jag inte kan programmera nåt vidare så får nog ST familjen gå bort så länge. ESP32 är ju "bara" 3,3 volt och då måste det byggas en massa kring-elektronik för att tex kunna driva MOS-transistorer säkert mm. Detta skulle jag väl i och för sig leva med eftersom koden är ganska lik? Cortex processorer har jag sneglat lite på, men som ersättare, inte än. När man programmerar via Arduinos egna bibliotek så blir ju inte koden alltid optimal, jag tror det finns mycket kvar att hämta ur Atmega, om man programmerar den helt rätt med så lite kod som möjligt. Ang flaskhals: Om man jämför en krets (Atmega2560) med ca 75 I/O 16 MHz klocka och 16 MIPS, 8 bitar, 1 core och en annan (Atmega328) med ca 25 I/O 16 MHz och 8 bitar, 1 core så har den större mycket mer att ta hand om innan den gått igenom alltihopa, borde den större då inte bli lite trögare då? Mer timers, mer interruptben, mer analogingångar, mer PWM utgångar, mer av allt, den borde bli långsammare?

Författare:  Janson1 [ 22.46 2018-02-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Btw, RTC kom i dag, den som använder MISO, MOSI, SCK och Cs. mycke förkortningar blir det, men det får man tåla på ett elektronikforum... Snart skall det provas! Men en osciloskopbyggsats kom i vägen, var bara tvungen att bygga ihop den och testa. Och, den funkar, vad skall man nu ha den till?
Den är ju högst bärbar i alla fall och behöver bara ett 9 volts batteri.

Författare:  KLset [ 23.23 2018-02-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Ang flaskhals: Om man jämför en krets (Atmega2560) med ca 75 I/O 16 MHz klocka och 16 MIPS, 8 bitar, 1 core och en annan (Atmega328) med ca 25 I/O 16 MHz och 8 bitar, 1 core så har den större mycket mer att ta hand om innan den gått igenom alltihopa, borde den större då inte bli lite trögare då? Mer timers, mer interruptben, mer analogingångar, mer PWM utgångar, mer av allt, den borde bli långsammare?


Ja, det tror jag. Att köra flera ATmega328 som du gör borde vara snabbare än att köra en ATmega2560, förutsatt att det inte är massor av kommunikation mellan dem som gör att de måste vänta på varandra. Hur är arbetsbördan fördelad på dem - vilken ATmega328 gör vad?

Författare:  hawkan [ 23.32 2018-02-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det håller jag inte med om. Eventuella långsamheter märks inte av användaren. Instruktioner går lika fort, interrupt går lika fort osv. Mega2560 är mer komplex, men det är internt innanför det svarta skalet. Man kan iofs bygga störr program med fler enheter med en mega2560 och det kan vara så att storleken på progammet blir stort så det går långsamt. Å andra sidan går det inte alls att göra på en 328p. Många, många 3D-skrivare drivs av en mega2560 och det är en hel del processande den klarar av utan att storkna.
Om det funkar på en 328 funkar det också på en 2560 skulle jag säga som generellt.

Författare:  KLset [ 00.55 2018-02-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

@hawkan: Ja, Microchip skriver att både 328 och 2560 klarar av 1 MIPS/Mhz. Jag tänkte att man som exempel behöver 69 I/O och alternativen är:

    1) en 2560 som har 86 I/O
    2) tre 328 som har totalt 69 I/O

Om den kod man vill köra lika gärna kan köras parallellt på de tre 328:orna - då är det snabbare än en enda 2560. Sedan kanske problemet inte kräver mer MIPS än en 2560:a kan ge då all I/O används - då är ju det en enklare lösning tycker jag.

Författare:  Janson1 [ 08.36 2018-02-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Till min övervakare av dom båda ECU:er så vill jag helst ha allt på samma chip&sketch. Detta är inte tidskritiskt mer än 2-3 sekunder mellan skrivningarna till SD-kortet. Hela systemet med en motor som går på ganska konstant varv och lika effekt är ju inte behov av ögonblicklig övervakning även om det nästan blir det. Med en 2560 får jag 8 analogingångar till vilket passar mig bra då jag funderar på att logga även andra tryck och temperaturer för senare genomgång. Nu i början så behövs nog temperaturkontroll av växellådan lite här och var som man sen ta bort och klistra på Telatempettiketter istället. (En etikett som har 5-6 fält som blir och förblir svarta vid en viss temp som står förtryckt tex, 55 gr, 68 gr, 76 gr, 88 gr, 95 gr.) Jag hittade 2560 kretsar på ebay så dom är beställda, kretskorten likaså. Nu i väntans tider så skall jag testa ut den nya klockmodulen, om jag nu inte måste jobba igen?

Författare:  Janson1 [ 07.09 2018-02-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tittade lite på nätet om inkopplingar med flera olika enheter som nyttjar MOSI, MISO och om man vill ha dubbelriktad förbindelse som jag behöver så rekommenderas att alla enheter kopplas parallellt men med varsin chip selekt. Detta innebär att det går åt fyra tampar för en enhet, fem tampar för två enheter osv. Det andra mer likt seriekoppling är bara användbart om man bara behöver kommunikation åt ett håll tex led-driver. Så nu testar jag alternativ ett. Jag får å andra sidan inte det till att fungera heller... Felsökning är på G.

Författare:  hawkan [ 08.16 2018-02-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

KLset, jag förstog detta med separata enheter efter jag skrivit inlägget. Visst är det en poäng du har men samtidigt ökar komplexiteten för gemensamma saker som loggning, display och seriellt.
Nu har jag tyvärr inte följt med i allt i själva projektet men cylindrarna behöver inte styras samtidigt, visst är det så? Då sker insprutningen totalt med några hundra Hertz, vilket inte är några som helst problem. Det jag funderar på är om du använder de analoga ingångarna för att styra tidpunkten för insprutning?
SPI med varsin chip select ska fungera, har använt själv.

Författare:  Janson1 [ 11.39 2018-02-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

För att det inte skall råda några missförstånd. Jag har tre eller fyra separata NANO:sar, två st är ECU:er A och B där endast en är verksam åt gången. Allt dom gör är ytterst tidskritiskt, dom får inte störas av nåt annat krafs. En funktionsbeskrivning följer senare. Den sista eller ev dom två sista NANO:sarna är till övervakningen alena. Dom skall bara samla in data från div givare och det som kommer ut från den aktiva ECU:n, även hålla reda på vilken som är aktiv. Vissa data vill jag ha presenterade på en display såsom varvtal, effektsetting, nån temperatur mm. Men den mesta datan vill jag ha samlad på ett tex SD-kort med tidsangivelse, det är inte nödvändigt med exakt realtid, det räcker med antal minuter från start per gång. Själva ECU:n Har två digitala ingångar som i princip styr alltihopa, en vevaxelingång som känner vevaxelns position och förändring och en kamaxelgivare som känner kammens hemposition, den ingången blir "döv" ett några hundra varv, så en ingång till det mesta. Sedan så finns en analog ingång som känner börvärde varvtal benämnd "gas". Vidare så finns det 7 analoga ingångar till som känner av div temp och spänningar mest för optimering av spridarstart och spridaravstängning.
Sen har den några digitala utgångar som driver varsin spridare via MOS-transistorer. Och några digitala kontrollutgångar som övervakningen sedan tar hand om.

Författare:  ViktorSigg [ 13.08 2018-02-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag hoppar in lite sent i tråden men jag kanske kan tillföra något.

Du har alltså 2 st ECU, dessa är naturligtvis tidskritiska. En är master den andra ligger i dvala som reserv.
Du har sedan 1 st kontroll-MCU som enbart gör mindre tidskritiska prylar och håller ECUerna under uppsikt.
Då detta ska användas till flygplan så är det viktigt att prylarna fungerar, framför allt failsafe, dvs eventuellt byte av ECU processor. Är detta korrekt uppfattat?

Jag kan säga hur jag skulle ha strukturerat upp det, så kanske de ger några idéer.

ECU 1&2 skulle jag koppla till signalerna som krävs för realtidskörningen, dvs. vevaxel, kamaxel samt spridare och önskat gaspådrag.
Det bör bli 2 digitala ingångar samt 4 digitala utgångar per ECU enhet, plus en analog ingång.

Jag skulle då ha kopplat Vevgivare och kamgivare till pin 32 och 01 för att köra dessa rutiner med interrupt. Spridarna skulle jag ha kopplat till valfri ledig digital pinne, men hållt mig borta från SPI pinnarna 14, 15 och 16. Analoga gaspedalen skulle jag ha kopplat till valfri analog ingång. Jag skulle även ha hållit pin 13 ledig för kontrollutgång med PWM möjlighet.


Kontroll-MCUn skulle jag koppla alla mindre kritiska givare till, alltså temperatur osv.
Säg att dessa är:
Analog - temperatur 1 (ex. motor)
Analog - temperatur 2 (ex. växellåda)
Analog - temperatur 3 (ex. omgivande lufttemp)
Analog - spänning
Analog - gaspådrag
Analog - reserv
Digital - kamgivare (för varvtal)
Digital - Kontrollinput ECU 1
Digital - Kontrollinput ECU 2

Jag skulle även ha kopplat SPI med chip-select, dvs. 3 pinnar för kommunikationen samt två eller tre valfria pinnar dedikerade till SS ingången på varsin ECU. Alla enheter på samma bus men med varsin SS och kontroll-MCUn som master.

I programmet skulle jag ha strukturerat upp så att varje ECU ger ut en PWM kontrollsignal som följer motorvarvtalet. Denna signal skulle jag ha mätt med kontroll-MCUn som då skulle jämföra sin egen input av varvtal (kamaxelgivare) med inputen från var ECU. Om något felas så används beräkningen att de två som är överens anses vara hela, den avvikande stängs av.

Jag skulle även ha strukturerat upp programmet så att kontroll-MCUn skickar värdena för mindre kritiska givare till varje ECU, några gånger i minuten. Om så behövs så skulle jag polla data från ECUerna också via SPI, men tanken är att ha de värden som skall visas på till exempel en display direkt till kontroll-MCUn som då kan hantera allt i lugn och ro.

Hela grundidén är att att koppla så lite som möjligt till varje ECU, och låta hårdvaru SPIn ta hand om resten. Då denna inte stjäl tid från ECUs huvudloop så borde det ge varje ECU gott om tid att hantera sina uppgifter. Det är det som är fördelen med hårdvaruserial, då man kan använda buffrarna för att skicka och ta emot data "när det passar" så att säga.

Finns såklart mycket mer att tillägga men detta är iallafall min tanke i en sammanfattning.

Författare:  Janson1 [ 14.31 2018-02-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Intressant att någon har ungefär samma tanke som en själv. Jag har valt att jag själv bestämmer vilken ECU som skall vara aktiv, för då kan den inte välja fel åt mig... Annars har jag kopplat så som du beskriver, ungefär. Jag har D2 och D3 som digital input från vev och kamgivare för dom är dom ända två som går att interrupta, fast det klarar jag inte av att få till med nån reda så jag har inget interrupt.
Utgångarna är D8, D9, D10, D11 dom kommer från samma port för att få så lika processtid som möjligt. Jag har en kontrollutgång (D7) fast den lämnar ut två pulser per motorvarv, utnycklad från vevaxelns 28_2_28_2 pulståg per varv. På D13 kör jag samma signal som aktiv spridare får så den ger 2 signaler per varv motsvarande motorns arbetstakter. Signalen använder jag till att räkna ut momentanförbrukningen tillsammans med D7:s pulsutgång. Jag har däremot valt att köra in alla analoga signaler direkt till både ECU och övervakare parallellt där det inte är kritiskt vid givarfel och dom kritiska givarna är dubblerade så en aktiv givare bör finnas kvar oavsett per ECU. Det kommer även att finnas två separata vevaxelgivare med varsitt tandhjul och som drivs från två olika strömkällor, dels det vanliga huvudbatteriet och dels via ett ECU-backup batteri som diodladdas och toppladdas via ett extra motstånd. Bägge batteriernas spänning övervakas av ECU och övervakningsArduinon.
Det här med SPI är jag egentligen inte alls påläst på fast jag fuskat med det nån gång, men det låter som ett hållbart förslag. Att ge ut en pwm signal baserad på varvtalet har jag ju redan så det skulle väl gå att ordna... Men stannar nu motorn så skulle jag som första åtgärd skifta ECU och som andra åtgärd stänga av och starta om elen, så den kanske är lite onödig?
I min sketch så har jag gett ganska mycket tid till just analogläsning så tidsmässigt är det nog inga problem att låta ECU hålla reda på värdena. Det ligger även inbyggt i (ska göra i alla fall då jag medvetet inte gjort detta än) i ECU:n om en givare går sönder, ligger utanför "fönstret" då skall den ta ett förutbestämt värde tex om vattentempen saknas blir det i beräkningsgrunden 70 grader, och felavläst värde blir kryss i displayen och skrivs ut på SD-kortet som uppmätt felvärde, allt för lättare felsökning... Alla ben jag hänvisar till är Arduino NANO och UNO som referens.
Hoppas detta är förståeligt. Jag kanske kan lägga ut sketcherna om intresse finns...

Författare:  Janson1 [ 23.42 2018-02-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det verkar som SD-drivkortet med eller utan SD-kort belastar ner MOSI, MISO och SCK? Skall prova att lägga motstånd i serie, kanske gör det nån nytta?

Författare:  Klas-Kenny [ 09.34 2018-02-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det är väl en 5V Arduino du har?
Ett SD-kort kör 3.3V, vilket innebär att det måste finnas någon nivåskiftare på skölden. Kan mycket väl vara så att miso där aldrig tri-stateas vilket gör att inget mer går att koppla in på Miso, på Arduinons sida om nivåskiftaren.

Författare:  Janson1 [ 13.02 2018-02-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag provar just nu ut om det finns nåt lämpligt värde på motstånd mellan SD-kortet och Arduinon... När/om den möjligheten är uttömd, då får det bli en annan lösning.

Författare:  Janson1 [ 19.14 2018-02-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu är det testat. Bästa motståndskompromissen är 560 ohm. Men när jag först hämtar klockdata på RTC och nästa vända skriver den datan till SD-kortet, då skiter det sig. Om jag kommer på nåt bra sett att först hämta klockdata och sen spara den i en variabel och sen skriva in variabelvärdet på SD-kortet, det borde gå även om jag inte riktigt vet hur... Nu kan man i alla fall ha både RTC och SD-minne på samma snören.

Författare:  Janson1 [ 19.33 2018-02-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Fixat! Först hämta klock/datum, sedan mellanspara som String sedan anropa Stringen och putta in datan till SD-kortet.

Författare:  Janson1 [ 22.03 2018-02-13 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har kretskortet kommit och en viss förbestyckning är gjord. Under sitter en NANO som snart skall amputeras. Men först skall 2560 kretsen komma på plats. Nu får jag en expanderad NANO med dubbelt så många analoga och ungefär dubbelt så många digitala, det är bara fortsätta att programmera...
Bilaga:
IMG_20180213_213909.jpg

Författare:  Janson1 [ 15.40 2018-02-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag är inne lite på att skaffa en ZERO eller en DUE, den har en annan processor, 32 bitar istället för 8 vad det nu innebär...
Den går i alla fall att programmera i Arduinomiljön som jag blivit van vid. Rent teoretiskt så borde jag kunna flytta över min ECU sketch till den och få lite respit på tiderna, jag är nu ganska nära max. Och, jodå, det går säkert att programmera smartare men det klarar jag inte av just nu oavsett. Ett "problem" är ju att den går på 3,3 volt istället för 5 volt vilket ställer till det på utgångssidan, istället för att bara driva en MOS-transistor rakt av så behövs några extra komponenter, men det går! Det jag lite funderar på är att kunna köra överlagrad PWM på utgångarna till slutstegen. Med NANO:n/UNO:n blir det alldeles för dåligt, för låg frekvens helt enkelt (490 resp 980 Hz, dessutom den "höga" frekvensen bara på två utgångar). Där tror jag den större processorn blir ett bättre alternativ? Men vilka flaskhalsar har den tro??

Författare:  KLset [ 16.58 2018-02-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kul att du gör framsteg. Tidigare skrev du:

Citera:
Jag har D2 och D3 som digital input från vev och kamgivare för dom är dom ända två som går att interrupta, fast det klarar jag inte av att få till med nån reda så jag har inget interrupt.


Skriv mer om det här så löser vi det. Vet du hur en interrupt fungerar till att börja med?

Citera:
Det jag lite funderar på är att kunna köra överlagrad PWM på utgångarna till slutstegen. Med NANO:n/UNO:n blir det alldeles för dåligt, för låg frekvens helt enkelt


Överlagrad PWM - är det PWM som du genererar själv i mjukvaran till skillnad från att använda de inbyggda hårdvarumodulerna?

Författare:  Borre [ 17.16 2018-02-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Ett "problem" är ju att den går på 3,3 volt istället för 5 volt vilket ställer till det på utgångssidan, istället för att bara driva en MOS-transistor rakt av så behövs några extra komponenter, men det går! Det jag lite funderar på är att kunna köra överlagrad PWM på utgångarna till slutstegen. Med NANO:n/UNO:n blir det alldeles för dåligt, för låg frekvens helt enkelt (490 resp 980 Hz, dessutom den "höga" frekvensen bara på två utgångar). Där tror jag den större processorn blir ett bättre alternativ? Men vilka flaskhalsar har den tro??

Zero rekommenderar jag.
Väljer du "rätt" mosfet är 3.3V inget problem.
PWM-frekvensen går att ändra, läs tex https://playground.arduino.cc/Main/TimerPWMCheatsheet

Författare:  hawkan [ 17.39 2018-02-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

D2 och D3 är de pinnar som har extern intterrupt. Men nästan alla pinnar har möjlighet till "Pin change interrupt" som är lika bra (nästan).
För ditt ändamål borde det funka.
Bild
Alla pinnar som har "PCINTxxx" kan göra Pin change interrupt".

Så här krångligt satte jag upp det häromdan i min kod.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#include <EnableInterrupt.h>
...
setup()
{
  pinMode(PIN11, INPUT);       
  digitalWrite(PIN11, HIGH);
  enableInterrupt(PIN11, &pin11, CHANGE); // M40 S0
..

Pin change betyder att man får kolla om pinnen är hög eller låg det första man gör i isr för min del i pin11() som den så fantasilöst heter.

PWM-frekvensen går mycket riktigt att ändra, speciellt med Timer1 som är 16-bitars PWM. För Due och Zero så är analogOutput också kring 1 kHz och man får ändra pwm-inställningen på samma sätt som för Nano. Du får hur som helst lära dej hur man gör det och det är processorspecifikt genom att pilla på olika register, så du kan lika gärna lära dej principen på Nanon du har.

Författare:  Janson1 [ 17.52 2018-02-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Var skall jag börja? Borre: Jag har ej kollat om det finns EffektMOS-transistorer men finns så är det problemet löst. Skulle en vanlig transistor funka tro? Har den tillräckligt hög förstärkning så den inte belastar ner den stackars utgången?
Jag har tjuvtittat lite på andra PWM frekvenser men det jag behöver är 4 utgångar som har samma grundfrekvens ca 20 KHz men ev olika duty-cykel, ev en hög start som sen går ner efter nån millisekund. Själva upplösningen behöver inte vara högre än 8 bitar. Just den biten klarar en NANO nästan...
KLset: Ja det här med interrupt... I min nuvarande sketch där NANO:n är en ECU så behövs egentligen inte interrupt men om jag nu skall ha det så till vad? Jag har två pinnar som skall bevakas, den ena pinnen bevakas bara i 250 kamaxelvarv som max (125 motorvarv) sedan görs den döv (stänger av sig själv helt enkelt) kvar blir vevaxelgivarens ingång. Alla dom pulserna kommer ytters regelbundet, "man kan ställa klockan efter dom" vilket jag faktiskt gör. Mellan varje ny vevaxelpuls har jag en viss tid som är som kortast på fullvarv, ca 200 uS. Det finns ingenting som processorn inte hinner med i dag och analogread som är det ända som egentligen tar tid i anspråk ligger i slutet där det inte gör nåt om en puls eller två skulle missas, jag har totat ihop sketchen så... Som direkt svar på frågan om jag vet hur interrupt fungerar så är det väl lite nja.
Man kan välja att "passa" en ingång tex vevaxelpulsingången så den aldrig missas. Man kan också passa en speciell händelse i processorn som gör en speciell sak vid ett exakt tillfälle, tex. starta en spridare via nu är det dags och sen går processorn vidare och gör det den skall och sen när spridaren skall stängas av då kallas en intern interrupt och allt annat städas undan och spridaren stängs av och sen går allt vidare igen. Men som jag fått ihop det nu så behövs nog inte interruptet... Här är ECU sketchen, jag tror det är den sista versionen?
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
 #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 = 16;         // totaltid för case 15/45: x * motorns duration (16)OBS: spridartröghetstid tillkommer!!
    const int grundvarde = 330;       // grundvärde ställs in här, högre tal = mindre tryck (330)
    const int lagstavarv = 520;       // tomgångsvarvet 580 uS motsvarar ca 800 Rpm (580)
    const byte hogstavarv = 130;      // fullgasvarvet 100 uS motsvarar ca 4200 RPM  (100)
    const byte aggrfaktorlag = 30;    // 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 = 9;        // avgör max startmängd 6 = 1 vevaxelpuls = 6 grader ontid (6)
    const float maxdeltalag = 9.0;    // max insprutningstid mellanvarv mdutation * 9.0 ger 4,5 vevaxelpulser = 26 gr ontid (9.0)
    const byte lagmangd = 4;          // max lågvarvsmängd 3 =  1,5 vevaxelpuls = 9 grader ontid (under tomgångsvarv)(3)
    const int tid1 = 2000;            // tid 1 är för att hitta pulsluckan vid start/lägsta varv(2000)                           
    const int tid2 = 1500;            // tid 2 är för att hitta pulsluckan vid lite under tomgång (1500)
    const int tid3 = 1000;            // tid 3 är för att hitta/behålla pulsluckan vid tomgångsvarv (1000)
    const int tid4 =  200;            // tid 4 är för att hitta pulsluckan vid alla andra varvtal (200)
    const int sprtroghet = 500;       // korrektion för den inbyggda påslagströgheten i spridarn (500)
    const byte turbostartregl = 150;  // när tubotrycket börjar avläsas och bli aktivt (150 = uS mduration ca 3200RPM)(150)
    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 = 20;          // en ev tidigareläggning av spridare 4 om den avviker i startfördröjning
   
    float senasteinspr = 12.0;        // senaste insprutningstid (vid tomgång)(12.0)(8 till 14)ej constant
    byte tidigasteinspr = 27;         // kortaste insprutningsfördröjning (vid maxvarv)(27)ej constant
                                     
                                 
    int vevpin = 2;                   // pulsingång vevaxelgivare,
    int kampin = 3;                   // kamaxelgivarens ingång, 
  //int logfart = 5;                  // till mikroswitch tomgång aktiv.
  //int hogfart = 6;                  // till mikroswitch fullgas aktiv.
    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).
    int turboAirTemp = 300;           // komprimerad turboluft temp
    int engineTemp = 700;             // motortemp.
    unsigned long delvalue;           // delvärde av pulstid i uS.
    unsigned int ondelay;             // tillslagsfördröjning spridare i uS.
    long puls,priv, delta;            // senaste, föregående och deltatid i uS,
    float error;                      // error = varvfelet i decimalform
    float starttandfin;               // starttandfin 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 46
    byte gas = 0;                     // gas 0-255
    int turbotryck = 700;             // turbotryck
    byte pekare;                      // pekare för att välja rätt spridarutgång (0 till 3)
    byte kamtand = 0;                 // Kamtand för att sluta detektera kamaxelgivaren efter några tänder
    int sprstartkorr = 50;             // spridarstartkorrigering i uS
    int variabel1;                    // bra att ha variabel 1
    int variabel2;                    // bra att ha variabel 2
    int fasttid = 300;                // Fasttid = tid1,tid2,tid3 eller tid4 beroende på varvtal, startar alltid på 200 uS
    int battVolt = 700;               // mäter systemspänning till spridare
    int atmtryck = 300;               // mäter atmosförstrycket
    int ambTemp =300;                 // mäter omgivningstemperaturen
    int sprtroghetklar;               // det klara spridartröghetsvärdet
    int spridardiff;                  // en individuell spridartidskorrigering
   


void setup()
{
   pinAsInputPullUp(vevpin);         // satt vevpin som ingång (2)                         
   pinAsInput(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)
   pinAsInputPullUp (disable);       // ECU väljare Hög = on, Låg = off (12)
   pinAsOutput(pulsutpin);           // satt pulsutpin som utgång (2 pulser per varv)(7)
 //pinAsInputPullUp(logfart);        // lågfart-switch aktivt låg = on (5)
 //pinAsInputPullUp(hogfart);        // högfart-switch aktivt låg = on (6)
   Serial.begin(250000);             // bra att ha, behöver aldrig tas bort
}

void loop()
{
   if (digitalRead(disable)==LOW)   //Disable låg stänger av ECU:n och gör den passiv
      { 
      delta = 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*
       
    //------------------------------------------------------
       
      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.
         }
       }
  //--------------------------------------------------------------------
       
   switch (tand)
  {

   case 16:
          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)
         // engineTemp = analogRead(A1);        // 0 till 512 0,1 Volt/10 grad använder LM-35 tempgivare
          variabel2 = analogRead(A2)>>3;        // skall vara turboAirTemp,
   break;

   case 46:
         // ambTemp = analogRead(A3);
        //  battVolt = analogRead(A5);
         // atmtryck = analogRead(A6);          // analogingång för lufttrycket max 255
          variabel1 = analogRead(A1)>>5;        // A7!!
   break;

   case 32:
         delvalue = priv + delvalue;            // föregående pulstid + föregående deltid läggs ihop
         senasteinspr = map(variabel1, 0, 32,8.0,14.0);
   break;

   case 33:
          delvalue = priv + delvalue;            // föregående pulstid + föregående deltid läggs ihop
      tidigasteinspr = map(variabel2,0,128, 18,31);
     
                                                     
   break;


   case 10:
          starttandfin = mduration /tidigasteinspr;// insprutningsfördröjning i gånger, ställs högst upp
          // starttandf, ett flyttal = motorns duration/ x som är minsta duration/max RPM. ställs högst upp
          if (starttandfin >= senasteinspr)         // om över målvärdet (som ställs in högst upp)
           {                 
            starttandfin = senasteinspr;            // blir det målvärdet ändå
           }
   break;

   case 11:
          ondelay = mduration * starttandfin;// tillslagsfördröjning = motorns duration * starttandsfördröjning (decimaltal)       
   break;                                    //       Ondelay     uS = mduration     uS * starttandf i decimalform
   

   case 12:
            delvalue = priv + delvalue;                 // föregående pulstid + föregående deltid läggs ihop
       if (mduration >=151)                             // "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 <= 150)                          // "högvarv"
          {
           delta = mduration * error * aggrfaktorhog;   // Felkorrigeringsvärde som ger spridaröppningstid i uS
          }                               
   break;
                 
   case 13:
          if (mduration <= turbostartregl)        // här bestämms varvtalet när turbon skall börja regleras ner
           {                                      // 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
         // 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...
            if (delta <=0)
             {
              delta = 0;                          // för att undvika minusvärden
             }
           }
          if (mduration >= 700)                   // för att få mjukstart vid motorstart.
           {
            delta = lagmangd * mduration;         // mjukstarten justeras via lågmängd högst upp             
           }
          if (delta + ondelay >= totaltid * mduration)
           {
            delta = (totaltid * mduration)-ondelay;// Absolut max insprutningstid, ställs högst upp
           }                               
   break;
 
   case 14:
           if(mduration >= minfart)   // motorn måste upp i x varv för att få bränsle, ställs högst upp
            {
             delta = 0;
            }         // x =  fast tid  + spridardiff per spridare, fyra val - spridarstartkorr beroende på battspänningen
            sprtroghetklar = sprtroghet + spridardiff - sprstartkorr;
   
   break;   

   case 34:
          delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
          bduration =map(gas,5, 252, lagstavarv, hogstavarv); // Ger motorns börvarvtal
   break;

   
   case 0:
         delvalue = priv;            // Första  föregående pulstid läggs in som deltid 1
   break;

   case 1:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 2:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 3:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 4:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;     
   

   case 5:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 6:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 7:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 8:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 30:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 35:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 36:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 37:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 38:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;
         
   case 39:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop                 
   break;

   case 40:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
   break;

   case 42:
         delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop       
   break;                             

   case 41:
         delvalue = priv + delvalue;                    // föregående pulstid + föregående deltid läggs ihop
       if (mduration >=151)                             // "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 <= 150)                          // "högvarv"
          {
           delta = mduration * error * aggrfaktorhog;   // Felkorrigeringsvärde som ger spridaröppningstid i uS
          }                               
   break;
 
   case 43:
          delvalue = priv + delvalue;            // föregående pulstid + föregående deltid läggs ihop
    if (mduration <= turbostartregl)             // här bestämms varvtalet när turbon skall börja regleras ner
           {                                     // 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
            if (delta <=0)
             {
              delta = 0;                          // för att undvika minusvärden
             }
           }
          if (mduration >= 700)                   // för att få mjukstart vid motorstart.
           {
            delta = lagmangd * mduration;         // mjukstarten justeras via lågmängd högst upp             
           }
          if (delta + ondelay >= totaltid * mduration)
           {
            delta = (totaltid * mduration)-ondelay;// Absolut max insprutningstid, ställs högst upp
           }                               
   break;

   case 44:
          mduration = delvalue/26;   // motorns totala pulstid i mikrosek dividerat med 26
          if(mduration >= minfart)   // motorn måste upp i x varv för att få bränsle, ställs högst upp
           {
            delta = 0;
           }
          sprtroghetklar = sprtroghet + spridardiff - sprstartkorr; // spridartröghet klart värde räknas ut här
   
  break;

  case 9:
          error = (mduration / bduration)-1;       // räknar ut skillnaden mellan är och börvärde - 1 = error
         if (error <=0.)                           // om error under noll
          {
           error = 0.;                             // för att ej få minusvärden
          }
  break;
   
  case 15:
           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.
            if ((delta*2) >= startmangd)           // här ställs startmängden in (högst upp)
             {
              delta = startmangd;                  // så det blir rätt startmängd/slag
             }
             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.
             ondelay = ondelay *1000;
             delta = delta * 1000;
           }                                      // Detta paket används vid låga farter såsom start/lågvarv
     
        else                                      // Eller om delay är mindre än 14000 uS. (> 250 RPM)
           {
            ondelay = ondelay - sprtroghetklar;   // spridaren tidigareläggs x uS pga dess starttröghet
            if (delta > 30)                       // Delta under 30 uS har inget värde
             {
             delta = delta + sprtroghetklar;      // Delta över 30 blir x delta + trögheten i spridaren (ca 450 uS)
             }
            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 8,9,10 eller 11].
            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 i delta uS
            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.
            ondelay = ondelay + sprtroghetklar;   // Ondelay görs ursprunglig igen innan urgång
            delta = delta - sprtroghetklar;       // Delta görs ursprunglig igen innan urgång
           }                       
   break;

   case 45:
           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.
           if ((delta *2) >= startmangd)          // här ställs startmängden in (högst upp)
            {
             delta = startmangd;                  // så det blir rätt startmängd/slag
            }
            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.
            ondelay = ondelay * 1000;             // Ondelay mS blir uS igen innan urgång.
            delta = delta * 1000;                 // Delta mS blir uS igen innan urgång
          }                            //Detta paket används vid låga farter såsom start/lågvarv
     
        else                                      // Eller om delay är mindre än 10000 uS. (> 300 RPM)
          {
          ondelay = ondelay - sprtroghetklar;     // spridaren tidigareläggs x uS pga dess starttröghet
          if (delta > 30)                         // Delta under 30 uS har inget värde
           {
            delta = delta + sprtroghetklar;       // Delta över 30 blir x delta + trögheten i spridaren (ca 450 uS)
           }
            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 8,9,10 eller 11].
            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 i delta uS
            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.
            ondelay = ondelay + sprtroghetklar;   // Ondelay görs ursprunglig igen innan urgång
            delta = delta - sprtroghetklar;       // Delta görs ursprunglig igen innan urgång
          }
   break;

    case 31:
       /*    if (gas < 2 || gas > 253)    // om gaspotentiometern går sönder...
            {
            if (digitalRead(logfart) == LOW && digitalRead(hogfart) == HIGH)
             {
              gas = lageffekt; // om tomgångsbrytaren är aktiverad (låg) blir det gas=tomgång
             }
          if (digitalRead(logfart) == HIGH && digitalRead(hogfart) == HIGH)
           {
            gas = marcheffekt; // om ingen brytare är aktiverad (hög hög) blir det gas=marcheffekt
           }
          if (digitalRead(logfart) == HIGH && digitalRead(hogfart) == LOW)
           {
           gas = fulleffekt; // om fullgasbrytaren är aktiverad (låg) blir det gas=fulleffekt
           }
       }
 */  break;
 
  }
 //  ----------------------------------------------------------
     
     tand  ++ ;                  //räkna upp ett steg för varje ny tand, 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 (4000 uS i grundinställning)
       }
      if ((mduration > 1200)|| (mduration < 1800))
       {
        fasttid = tid2;
       }
       if ((mduration > 500)||(mduration < 1200))// Om motorn går under 1100 RPM
        {
         fasttid = tid3;                         // används tid2 (1200 uS i grundinställning)
        }
       if (mduration <500)                       // Om motorn går över 1100 RPM
        {
          fasttid = tid4;                        // används tid4 (300 uS i grundinställning)
        }
       
       
        puls = pulseIn(vevpin, LOW, 30000);      // Ett färdigt kommando som väntar in nästa puls (tand).
                                                 // vid stillastående motor blir det en timeout
                                                 // efter 30000 uS vilket motsvarar < 30 RPM.
                       
     if  (puls > priv + fasttid)                // jämför om ny pulstid i uS är större än föregående + 300 uS.
      {
        digitalWrite (pulsutpin, HIGH);          // utpin blir hög när pulsluckan återgår till pulser

          if (tand <27)
           {
            tand = 30;
            pekare = pekare + 1;                 // 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
              }
           }
         
          if (tand >40)
           {
            tand = 0;
            pekare = pekare + 1;                 // 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
              }
            }
       
     
       if (pekare == 0)
        {
         spridardiff = sprdiff4;               
        }

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

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

       if (pekare == 3)
        {
         spridardiff = sprdiff3;
        }
     

      // Serial.println(spridardiff);
      }
       if  (puls < priv - fasttid)               // jämför on ny pulstid är mindre än förgående - 300 uS.     
         {   
         digitalWrite (pulsutpin, LOW);          // utpin blir låg igen nästa uppgång i pulståget.
         }
Om det är någon som orkar läsa in sig på coden ovan så kan jag kanske svara på frågor sen och kanske försvara varför det är på ett visst sätt och om det är någon som vill/orkar ändra något till det bättre så är jag tacksam.
Edit: ja nu tillkom Hawkan som jag inte läst riktigt än.

Författare:  Janson1 [ 21.12 2018-02-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hawkan: Det är väl inte speciellt krångligt att sätta upp en interrupt, det krångliga är vad den skall göra och vad jag skall plantera den någonstans och sist men inte minst: nyttan...
Nu finns ju mitt alster för allmän beskådan, bara att kolla in!

Författare:  KLset [ 07.05 2018-02-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Har skummat lite igenom koden och har en fråga: Vad är det variabeln tand representerar? Jag förstår att den räknar från 0-46 och så om igen och, att timingen på insprutningen beror i huvudsak på denna. Det är någon sensor förstår jag.

Författare:  Bosen [ 07.39 2018-02-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har bara skummat igenom koden....
Men du har alltså inte vevaxelgivaren på interrupt och ändå fått detta att funka.
Det är lite imponerande faktiskt.
För att implementera interrupt på vevaxelgivaren så kommer du tycka att det är ganska snurrigt tills du får till det, men när du väl har implementerat det så vill jag ändå påstå att resterande program kommer att bli mycket lättare att sätta upp.

Författare:  hawkan [ 09.11 2018-02-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Otroligt bra kommenterad kod :)
Om jag förstår koden rätt så händer det mesta i sekvens och timing styrs av "tand" och av delayer för några "tand".
Tycker nog att approachen du har är helt okej. Använda interrupt undrar jag om det underlättar speciellt eftersom saker sker i sekvens och det finns möjlighet att ligga och polla en pinne för att se om det händer saker utan att andra saker behöver göras.
Keep going!

Författare:  ViktorSigg [ 11.03 2018-02-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

MOSFET för 3.3 volt brukar ha ett L i namnet om jag minns rätt. Någon mer får gärna stämma in om så är fallet!

Författare:  hawkan [ 11.32 2018-02-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vet inte svaret på det, men min favorit är IRLML6244 N-MOSFET och den har två L i namnet :) Drivs direkt av 3.3V, 5-6A.

Författare:  KLset [ 21.40 2018-02-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Efter vad Bosen skrev och en till titt på variablerna förstår jag nu att variabeln tand är vevaxelns läge. Får ta och hålla med hawkan i att koden är välkommenterad! Får jag föreslå att placera de olika case:n i ordning? Då tycker jag det skulle bli lättare att visualisera processen allt eftersom man läser koden i ordning, uppifrån och nedåt.

Edit: Varför just 47 olika tillstånd på vevaxeln? Blev lite nyfiken...

Författare:  Janson1 [ 22.19 2018-02-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

3-4 Amp räcker inte, den jag har i dag är nog på nästan 30 Amp när det gäller MOS-transistorer. Som ni nog har listat ut så representerar varje case en tand på vevaxeln. Själva kugghjulet som sitter på vevaxeln och givaren detekterar har 28 tänder, 2 luckor, 28 tänder, 2 luckor per varv osv. Och jag har låtit varje tand (case) representera en händelse eller tre och sen när händelsen är slut så går den ur case´t och väntar snällt på nästa Puls från vevaxeln. Jag hade case´n i ordning från början men det blev så mycket bläddrande innan jag hittade rätt så nu har jag lagt dom case som måste ändras hela tiden först och dom som egentligen inte behöver nån handpåläggning alls, ja dom ligger sist. Sen blir det förprocessorns huvudvärk att lägga case`n rätt igen. Tandantalet är ju 28 plus 28 plus luckorna vilket blir 56 tillstånd plus 2 lucktillstånd.
Processorn behöver hålla reda på alla tänderna tills insprutningstanden kommer, tand 15 eller 45. Sen går processorn på död räkning tills det är dags att stänga av spridaren/spridarna. När den sen går ur case 15/45 så är man x antal tänder senare beroende på varvtal och belastning, detta är egentligen oväsentligt så länge det finns tid kvar för analogread av 4 värden och en sista tand för att inte tappa räkningen. 47 olika tillstånd är det nog inte men första halvvarvet består av 0 till 15 säkra tänder och sen hoppar den över x antal tänder för att ge nästa tand nr 16, rätt som det är tänderna slut och luckan dyker upp, dags att reseta eller gå till tand 30 (case 30) och göra om allt i hopa.
Hoppas detta är förståeligt...

Författare:  Bosen [ 08.29 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hur vet man om man är på första eller andra halvan av vevaxelvarvet? Då tänderna har 28+2+28+2 så finns det ju ingen indikation vilket som är 0:an?

Jag har bara skummat igenom tråden så jag har inte riktigt koll på hur du styr motorn, men det sättet jag själv hade försökt med är vevaxelgivaren på interrupt och i ISR:en skulle jag räkna tiden från förra ISR. på så sätt kan jag hitta luckan och sedan räkna varje tand från det. När jag har kommit upp till tand 15 så startas insprutningen på samma sätt som du gör nu. Eventuellt måste man då stänga av interruptet under insprutningstiden.
Jag tycker det är väldigt många case som gör samma sak. Genom att göra den beräkningen i ISR så skulle du slippa många case känns det som.

Författare:  Janson1 [ 11.11 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vevaxelgivaren triggas in av kamaxelgivaren sen behövs inte den mera... Jag har försökt ta bort "dubblett" case men då blir det fel senare. Det finns säkert nåt bättre/smartare sätt att programmera på... Om man måste ta bort interupet under insprutningstiden, då försvinner väl hela interruptgrejen? Det är väl där man skulle ha det istället för död räkning.

Författare:  KLset [ 11.44 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, nu ser jag att till och med att de "stora" case:n 15 och 45 är ju identiska till koden, men däremot diffar några kommentarer.

Om du skulle byta till if-statements istället för ett switch skulle du kunna ta bort många dubbletter:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
   ...
} else if (tand == 15 || tand == 45) {
    ...
} else if (tand == 31) {
    ...
}

Författare:  Bosen [ 12.07 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Vevaxelgivaren triggas in av kamaxelgivaren sen behövs inte den mera... Jag har försökt ta bort "dubblett" case men då blir det fel senare. Det finns säkert nåt bättre/smartare sätt att programmera på... Om man måste ta bort interupet under insprutningstiden, då försvinner väl hela interruptgrejen? Det är väl där man skulle ha det istället för död räkning.


Ja, jag sa eventuellt. Men behöver man hålla koll på kuggarna under insprutningstiden så kan man hålla igång ISR:en även då.
Normalt sett så behöver du ha en loop som bara kollar givardata och sen har du en insprutningsloop som körs igång vid rätt kugg. När insprutningstiden är klar så går man tillbaka till koll av olika givare.

Som du har programmerat nu så baserar du allt på vissa kuggar. Det vill säga att du läser av vissa givare på vissa kuggar (om jag förstår det rätt) men det känns inte som det är nödvändigt utan det bör man göra hela tiden när inte håller på med en insprutningssekvens.

Författare:  Joe [ 12.58 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Interrupt för insprutningsstarten och sedan Timer interrupt för insprutningstiden. (Hur mycket kan motorvarvtalet ändras under insprutningsfasen)
Då är programmet ledigt att hålla räkningen och kolla givare även under insprutningen.

Författare:  Bosen [ 17.15 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En annan fråga jag ställer mig är om man måste hålla koll på alla kuggar. Räcker det inte med att hålla koll på 28 kuggar i taget. Första halvan av varvet är väl lik den andra halvan av varvet förutom vilken spridare som skall påverkas, men det ska väl egentligen kamgivaren ta hand om. Man borde ju ha interrupt på kamlägesgivaren också och bara hålla koll på vilken spridare som skall vara påverkad genom den. Det borde vara enklare än att ha koll på detta genom vevaxelgivaren.

Författare:  Janson1 [ 17.44 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ang. kamaxelgivaren: som det är nu så behövs inte den givaren efter ca 125 motorvarv. Vitsen med det är om givaren går sönder/ger felvärden/hänger sig eller vad som så kan den inte fördärva motorgången. Från början hade jag bara 28 kuggar att hålla reda på men sen har först en analogread kommit till sen en till osv, nu har jag 8 st och då räcker inte tiden till bakom insprutnings"modulen" så därför delade jag upp i två halvor, samtidigt passade jag på att läsa av många mer tänder att räkna och dividera mot för att få ett exaktare medelvärde. Det skiljer sig lite mellan halvorna vilka tänder som läses av om man kollar noga... Nu senare så har jag tänkt att göra om även analogread i case så man läser ett par stycken per halvvarv och sen bara har ett halvvarv för alla uträkningar. En annan ide jag haft är att låta cykeln vara 720 grader, dvs två vevaxelvarv och fördela ut jobben på, kanske overkill för denna ganska långsamtgående diesel? Ni ska veta, det har varit mycket huvudbry innan jag fick till detta. Just i denna sketch så finns det två variabler (variabel1 och variabel2) som bara är till för att kunna testa ut rätt förtändning både på låga och höga varv via två potar och analogread. Så fort det är utrönt så blir det två konstanter längst upp i sketchen. och två andra variabler blir föremål för utvärdering/ändring. Från början körde jag med if-satser istället för case men nu ser jag bara fördelar med case, det blir dessutom mindre kod...

Författare:  hawkan [ 17.57 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ta en titt på "ADC free running". Det är en teknik där processorn hela hela tiden ligger och gör ad-konvertering utan att ditt program belastas av det. Har du problem med att analogRead tar mycket tid kan detta helt klart vara något att titta på.

Författare:  Janson1 [ 18.18 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, detta skall jag kolla in. Det kan ju förenkla mitt programmerande. Nu är det så här att jag har aldrig i mitt liv programmerat förut, det började den 27 oktober 2016 med att jag gav mig själv en present i form av ett Arduinokit för dumhuvuden. Och mitt mål var just en ECU-styrning till min numera från halvdöda dieselmotor till en fungerande diesel med utvecklingspotential. Jag har bara lärt mig grunden och knappt det så det tar lite extra tid om det tillkommer nåt nytt, man måste lära sig dels programmera nya och dels hitta/komma på nyttan och få till det bra dessutom. Det är några timmar på kammaren varje gång nåt nytt dyker upp... ADC free running blir nog nästa grej att kolla närmare på.
Tack för tipset!

Författare:  Bosen [ 18.32 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Just det du säger att sprida ut dina analogread på fler kuggar är ju något du egentligen ska slippa. Det är ju något du ska läsa av när inte processorn är upptagen.
Jag förstår hur du har tänkt med ditt program, och jag tänkte på samma sätt i början, men du låser in dig ganska mycket när du gör en steg-för-stegprogrammering som du har gjort, i min mening.
Men jag vill inte ifrågasätta hela ditt projekt. Jag tycker det är skitbra gjort det du har lyckats med och jag är inte heller speciellt erfaren när det gäller programmering.

Författare:  janno [ 19.28 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Om du har case satser som gör samma sak så rada bara upp dom efter varandra.


Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
case 1:
case 2:
    ....
    ....
    break;
case 3:
case 45:
    ....
    ....
    break;


klamrarna behövs inte i case satsen om det inte är så att du vill ha eller behöver lokala variabler där.

Författare:  mrfrenzy [ 20.05 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Eftersom du är ute efter hög driftsäkerhet nämner jag detta:
Många motorer går att starta med trasig kanaxelgivare.

Hur det går till vet jag inte men om jag får gissa så kanske man provar sig fram att spruta in bränsle i cylinder 1 vid "tdc1" och se om det rör sig åt rätt håll annars prova med cylinder 2 istället efter ett varv.

Författare:  Bosen [ 20.09 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Ang. kamaxelgivaren: som det är nu så behövs inte den givaren efter ca 125 motorvarv. Vitsen med det är om givaren går sönder/ger felvärden/hänger sig eller vad som så kan den inte fördärva motorgången.


Jag bara tänker lite på hur det fungerar på min bensinmotor som sitter i min opel. Där läser den båda givarna hela tiden och jämför de mot varandra. Om kamlägesgivaren ger upp så beräknas allt på vevaxelgivaren och om vevaxelgivaren ger upp så beräknas faktiskt allt efter kamlägesgivaren, men då är den väldigt ”svårstartad” eftersom motorn måste gå flera varv innan den har beräknat rätt. Jag antar att den vill ha flera medelvärden innan den är säker på att det är rätt ställe.

Författare:  Janson1 [ 20.48 2018-02-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

janno: Jag har testat lite olika alternativ men inte lyckats, jag testar ditt förslag!
mrfrenzy: Jag har detta system i dag, teoretiskt var fjärde gång. Men praktiskt sett var femte-sjunde gång.
Bosen: jag har valt att ha två ECU:er med varsin vevaxelgivare istället.
Bosen igen: jag vet inte om detta är behövligt, än. Men blir jag tvungen att göra om analogread så den gör det "för sig själv" så kommer jag läsa på och försöka få till det.

Författare:  Janson1 [ 07.45 2018-02-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Joe: från början var det tänkt att ECU:n skulle följa kuggarna slaviskt och via uträkning komma fram till att tex. insprutningsbörjan skall vara tand 16 och en halv. Där görs en markering i Micros och sedan så vid tex. 392 micros senare stänga av vilket tex skall motsvara tand 18,2 . Är det nu inte tand 18,2 beroende på olika fart på motorn vid komp, tändning mm så skulle det göras en korrigering och stänga på just 18,2 ändå. Detta kunde jag aldrig få till och nu i efterhand så tror jag inte det är nån bra lösning? Tanken var just att fortsätta hålla reda på tänderna vilket jag inte gör i dag efter tand (case) 15/45. Nu har det visat sig inte behövas så jag tror inte jag bygger nån ny grundsketch innan/om det visar sig att denna sketchlösning inte går att få till mera utav.

Författare:  carpelux [ 13.05 2018-02-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Jag är inne lite på att skaffa en ZERO eller en DUE, den har en annan processor, 32 bitar istället för 8 vad det nu innebär...
Den går i alla fall att programmera i Arduinomiljön som jag blivit van vid. Rent teoretiskt så borde jag kunna flytta över min ECU sketch till den och få lite respit på tiderna, jag är nu ganska nära max.


Efter en veckas sängliggande i influensa där bland annat denna tråd hart lättat upp är jag nu på bättringsvägen. För att minska tristessen lite testade jag att kompilera koden för en ESP32. Det är för övrigt en fantastiskt välkommenterad kod!

Det gick i stort sett utan några problem, det enda jag ändrade var att exkludera PureAtmega328.h samt ändra tillbaka pinAsInputPullUp, pinAsInput samt pinAsOutput till de vanliga varianterna med pinMode(). Läsningen av Variabel1 och Variabel2 har jag också kommenterat bort då pin A1 och A2 inte var definierade och jag inte orkade leta upp vad det skulle stå istället.

Det är säkert massor annat som måste tas hänsyn till, b.la. 3.3V vs 5V men det kan kanske vara kul att veta att det inte medför en massiv förändring av koden att gå från 8 till 32 bit och upp till 240MHz samt dual cores.

Så här ser resultatet av kompileringen ut:

Citera:
Sketch uses 165585 bytes (12%) of program storage space. Maximum is 1310720 bytes.
Global variables use 11192 bytes (3%) of dynamic memory, leaving 283720 bytes for local variables. Maximum is 294912 bytes.


Kortet jag laddade upp det på är ett Wemos lolin32 ( https://wiki.wemos.cc/products:lolin32:lolin32 ). Otroligt prisvärt skulle jag vilja säga. Strax över 50:- på kinamarknaden. Det är så billigt att de extra 75:- + lite moms vi snart kommer att få betala knappt spelar någon roll :-)

Författare:  Janson1 [ 16.13 2018-02-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Tackar för testet! ja detta låter ju väldigt bra... Jag har beställt nåt liknande för någon vecka sedan så det skall bli intressant att testa mot min syntetmotor och få till det mot min riktiga motor också. Nu tror jag i och för sig att jag kommer att klara mig med Atmegas kretsar både till ECU och kontrollern. Men det är alltid roligt att förnya/förbättra sig...

Författare:  Janson1 [ 21.39 2018-02-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Några frågor här om en 8 bitars processor resp en med 32 bitar: Tar kompilatorn hänsyn till vilket och gör om tex en byte till nåt annat för att fylla upp "hålrummet" ? Blir koden användareffektiv? Jo jag förstår att denna processor är mycket snabbare/bättre men vad händer egentligen när man ändrar från 8 till 32 bitar, är det bara göra rakt av? Behöver inte jag som "programmerare" ta hänsyn till detta på nåt sett?

Författare:  hawkan [ 22.39 2018-02-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja bara att göra rakt av. Har du programmerat nåt speciellt för att atmegan är 8-bitars? Tror inte det. Storlek på datatyper hanteras av kompilatorn. Byte = byte. Det kan finnas alignment- problematik vad det kan heta på svenska. Men det hanteras av kompilatorn och en 32-bitars har mer av allt så dét spelar ingen roll om man slösar lite. Håller du dej på c/c++-nivån och arduino-nivå så är det bara att kompilera och köra. Lågnivå-grejor som register och sånt ja det kan hända och det är troligt att det görs på helt annat sätt på en ny arkitektur.

Författare:  Janson1 [ 06.42 2018-02-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ahh, det låter ju lätt och trevligt. Det ända som jag egentligen har tagit hänsyn vid programmering är att använda byte istället för int där det varit möjligt och unsigned int istället för long och inte gödslat med float i onödan, allt för att hålla nere koden och uppe hastigheten. Men med denna förbättring av processor så behöver man inte ta hänsyn till detta lika mycket?

Författare:  hawkan [ 11.19 2018-02-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Alltid bra att undvika float/double om det inte finns flyttalshårdvara. Bara att köra på annars.
Men som med allt så finns det till slut saker som blir en flaskhals, även på en 32-bitars.
Det tar lite längre tid att komma dit bara. Det är ingen mirakelkur som löser allt, och till
slut händer det att man ändå sitter där och försöker optimera saker. Och man kanske
behöver ge sej in på lågnivågrejor och man inser då att det ska göras på ett helt annat
sätt och att det tar en hel del tid att läsa in sej på det och att testa av så man fattat
det rätt.

Författare:  Janson1 [ 20.15 2018-02-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janno: Jag testade nu att lägga casen efter varandra och det funkade fint! Tackar för tipset. Nu kan jag skriva ner koden ganska rejält och ändå ha kvar allt nödvändigt.

Författare:  janno [ 20.56 2018-02-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vad kul att du fick det att funka. Det gäller bara att se till att man kommer ihåg att sätta break på rätt ställe.
Man kan även göra såna här saker om man har kod som är delvis är lika.
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
switch (a)
{
  case 1:
      ...
  case 2:
      ...
  case 3:
  case 4:
      ...
      break;
  default:
      break;
}

Nu kommer 1 att göra allt från 1-4, 2 allt från 2-4, 3 och 4 gör samma sak, alla andra värden gör inget (hamnar i default).

Edit: satte dit parenteser runt (a) i switch

Författare:  Janson1 [ 07.19 2018-02-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

När jag själv nu tittar på min ECU-sketch så behövs det nog lite förtydliganden: Det är ju tänkt att ha 2 tryckgivare, en för turbotryck, en för atmosfärstryck. 3 tempgivare, en för motortemp, en för ute temp, en för turbons utgångstemp. 1 spänningsavkännare också för att bedöma systemspänningen till spridarna. I dag har jag gjort fixvärden på dom för att kunna komma igång och sedan simulera olika tryck/temperaturer/spänningar för att efterlikna verklig miljö. Märk sedan att jag kommer inte att göra om några värden från tex 10 bit analogread till Celsius/Bar utan använda den som den är och bara skifta ner värdena tills dom stämmer bättre om så behövs, allt för att spara på tid/plats i kretsen. I min ECU-kontrolldel gör jag däremot om all rådata till temp, tryck mm så det blir förståeligt. Både ECU och ECU-kontroll kommer att delvis dela på givarna så jag bör direkt kunna se om en givare lämnar ut rätt signal till ECU:n via kontrollens utdata. Case 13/43: behandlar korrigeringsfaktorer som ökar/minskar insprutningstiden (mängden soppa) Insprutningtidens början beräknas i case 10, 11 och själva korrigering av insprutningsbörjan ("tändning") avgörs i case 14, 44 där även lägsta praktiska startvarv sätts. Jag har nu slagit samman dom case
som jag tror kan vara exakt lika, alla dom som bara räknar ut tandtid för att sen dividera i 26 ligger nu tillsammans (16-17 st) Det tar mycket mindre plats i IDE:n men blir givetvis samma storlek när det är kompilerat...

Författare:  Bosen [ 11.59 2018-02-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kommersiella insprutningssystem är ju baserade på olika tabeller men du verkar förlita dig på olika beräkningar för insprutningen. Hur kommer det sig?
Ett av mina största projekt var en arduino-styrning för en automatväxellåda och där har jag en växlingstabell i eeprom som den hela tiden läser ifrån. Det gör det ju väldigt enkelt att förändra och justera jämfört med att ha beräkningar i själva ecu-sketchen.

Författare:  Janson1 [ 17.53 2018-02-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: Tja, man får ju göra det man tror sig kunna... Nu vet jag inte hur man skulle lägga upp en tabell och få den att fungera samtidigt som jag faktiskt inte vet vad som skall stå i tabellen, det måste jag utröna och testa mig fram. Att Arduinon gör själva beräkningarna är nog inga problem, den tid det tar finns. Sen har jag alla konstanter högst upp i sketchen för att man skall slippa rota runt längre ner i koden, det lär väl behövas ändå men det minimerar. Skaffar jag mig ett EEPROM eller liknande så blir det väl där man får göra om vid förändringar istället? Jag kanske vill ha ett EEPROM ändå, måste tänka på saken.

Författare:  Bosen [ 21.12 2018-02-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Info om vad som borde stå i tabellen finns här: https://sites.google.com/site/vagecumap/ :D

Författare:  Janson1 [ 06.59 2018-02-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag kommer in där utan att vara medlem men skit samma. Jag kör nog vidare med "mitt" sätt, och skiter det på sig så får jag tänka om. Däremot så skall jag köra temperaturerna med NTC-motstånd som sitter inbyggt i turbotryckgivaren, jag har tre stycken likadana. På ECU:erna så spelar det ingen större roll men på övervakningsArduinon vill jag ju ha så någotsånär rätt visning av temp. Jag tror NTC-motståndet är på 2 kohm vid 25 grader, vad den visar vid dom andra temperaturerna vet jag inte men jag har mätt vid några olika temp och kommit fram till att den är inte linjär, speciellt inte vid kallare temperaturer.
Finns det någon färdig algoritm för detta?

Författare:  Bosen [ 08.14 2018-02-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jo, det finns mycket på gratis-sidorna.Det är bara att börja i vänsterkolumnen uppifrån. Det sår väldigt mycket om just PD-motorerna så jag tror det finns mycket värden du kan använda dig av. t.ex insprutningsvinkel: https://sites.google.com/site/vagecumap/understanding-ecu-maps-part-2

Jag förstår ditt sätt att tänka, men det blir lite svårt att beräkna allt då inte effektkurvan på en turbo är speciellt linjär. En icke turbo hade varit lättare att beräkna på det sättet som du gör. Men som sagt, jag tycker ditt projekt är riktigt imponerande!!!

Författare:  Bosen [ 12.28 2018-02-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Jag tror NTC-motståndet är på 2 kohm vid 25 grader, vad den visar vid dom andra temperaturerna vet jag inte men jag har mätt vid några olika temp och kommit fram till att den är inte linjär, speciellt inte vid kallare temperaturer.
Finns det någon färdig algoritm för detta?

Jag tror du måste googla på givarens nummer för att få fram en tabell eller kurva på detta. Jag är ganska säker på att även detta sköts med en tabell i ECU normalt så det är inte säkert att det finns någon algoritm för det.
här finns ett exempel på en bosch-givare: http://www.bosch-motorsport.com/media/catalog_resources/Temperature_Sensor_NTC_M12_Datasheet_51_en_2782569739pdf.pdf

EDIT:
Här finns faktiskt en generell algoritm för NTC-motstånd: https://www.allaboutcircuits.com/projects/measuring-temperature-with-an-ntc-thermistor/

Författare:  Janson1 [ 19.52 2018-02-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: tackar för länkarna. Jag är dålig, nä kass på att hitta nåt vettigt på internet hur jag än letar. Jag har letat efter relevant info om PD-dieslar i flera år utan nåt egentligen matnyttigt så alla mina beräkningar, antaganden är tagna ur luften med hänsyn till det jag vet om dieselmotorer rent allmänt. Det visade ju i och för sig stämma ganska bra då den startar och går. Tändfördröjning (dvs. den tid det tar från det att soppan sprutas in i cylindern tills dess den tar sig) har jag hittills inte kunnat utläsa någonstans. Jag antar den är beroende av flera faktorer såsom varvtal, belastning, turbotryck, motortemp, lufttemp, intern turbulens, bränslets tändvillighet och luftöverskottet, va det allt tro? Jag har i alla fall gjort en "algoritm" för det som jag tror påverkar mest. Nu har jag ju inga krav på avgasrening, inget större krav på tystgång, men jag tror i och för sig inte motorn klarar av för mycket bankningar så jag måste nog välja tystgång ändå. Bränsleförbrukningen tror jag inte jag kan göra ett skit åt mer än att hindra den från att ryka svart...

Författare:  mrfrenzy [ 20.04 2018-02-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det var en mycket intressant och detaljerad redogörelse.

Som jag förstår ska insprutningen alltid påbörjas vid sådan tid/vinkel btc att den är färdig exakt vid tdc.

Det blir förstås enklare att koda och kräver inte lika kraftig processor om man har det i tabeller som VW har gjort men ser inget som hindrar att man gör beräkningarna direkt som du gör om man har tillräckligt snabb processor.

Författare:  Janson1 [ 20.30 2018-02-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Skall väl göras ett tillägg... Spridarna på denna PD-diesel har möjlighet att pumpa rent mekaniskt ca 30 grader efter övre dödpunkt, ja tom. 35 grader efter men där är mera osäker gång då pumpkolven skall "bromsas" in för att sen vända. Så jag tror den fortsätter att spruta in soppa efter övre dödpunkten för att få denna höga litereffekt för att vara en diesel... Vidare så sitter ju kolvringarna ganska långt ner på kolven så det gör ju ingenting om det brinner på cylinderväggen en bit ner? Jag kan inte utläsa något om tändfördröjningen, kan ni andra se detta? Det är ju en av dom större stötestenarna på en dieselmotor...

Författare:  Bosen [ 10.26 2018-02-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Du menar före övre dödpunkt va? Som jag förstår det så sprutas det som tidigast in 28 grader före övre dödpunkt (enligt https://sites.google.com/site/vagecumap/understanding-ecu-maps-part-2) för att verkligen få in allt bränsle INNAN övre dödpunkt.
Länk till bild

Men självklart kan det vara så att man KAN spruta i upp till 30 grader EFTER övre dödpunkt, men som jag förstår det så är det inte det man ska sikta efter.

Författare:  Janson1 [ 13.43 2018-02-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag menar faktiskt efter ÖDP. Rent mekaniskt så påverkas spridaren av kamaxeln drygt 40 grader IÖDP till ca 30 grader EÖDP.
Alltså 70-75 grader av vevaxelns läge där faktiskt spridaren kan spruta in soppa om den strömsätts. Jag tänker att konstruktören har ju inte gjort denna möjligheten om den inte sen skall användas... Min ECU-sketch kan använda ca 65-70 grader som aktivt on om så behövs. Ett stort problem för dieselmotorer är ju själva tändfördröjningen och denna motor har ju förinsprutning för att få ner förbrännings(O)jludet, det gör ju i sin tur att insprutningen måste påbörjas lite tidigare ändå. Jag kan inte se nåt om detta?

Författare:  Janson1 [ 21.05 2018-02-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har jag läst igenom denna ganska bra förklarande sida i många delar: https://sites.google.com/site/vagecumap ... aps-part-2
Men jag kan inte se nåt om tändfördröjning, har jag missat nåt eller har dom missat en stor del av dieselmotorns problematik? All deras data blir inte värdelös men saknar just en väldigt viktig faktor. Hur långt innan verklig tändning måste soppan börja sprutas in vid kall motor, varm motor, lågvarv, högvarv, innan turbon börjat ladda, vid fullt laddtryck. Jag tror tändningsfördröjningen skiljer sig en del under dom här olika fallen. Jag kan inte se nån tabell som behandlar detta. Jag har svårt för att tro att det inte behövs.

Författare:  Janson1 [ 21.21 2018-02-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Men det finns någon slags tabell där det beskriver insprutningsbörjan från 12 grader BTDC vid 1750 rpm till 28 grader BTDC vid 5000 rpm. Mina spridare har jag mätt upp till ca 450 uS fördröjning från strömsättning till det att dom börjar pumpa. Det är 12-14 grader på vevaxeln vid högvarv så skall man börja insprutningen 28 grader så måste spridarna ström sättas 28 + 12 = 40 grader innan. Jag får väl börja där. Jag har med denna tidskonstant i min sketch redan. Så det kanske bara är lite finjusteringar som behövs utöver?
IÖDP = BTDC = Innan Övre Död Punkt EÖDP = ATDC = Efter Ö....

Författare:  Bosen [ 07.00 2018-02-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror redan spridarens 450us är medräknade i de tabellerna. Du skall inte behöva plussa på dina 12 grader. Den tändfördröjningen du pratar om är vad jag förstår tabbellen som du tittar på. Sen finns det en likadan map när bilen är kall. Tändningen ändrar sig inte automatiskt för stt turbon laddar, men jag råder dig att fortsätta läsa på den sidan( till exempel https://sites.google.com/site/vagecumap/understanding-ecu-maps) så ser du vad turbon påverkar. (Om jag inte har fel för mig så ändrar turbons ladd bara mängden bränsle som skall sprutas in, och eftersom mappen du precis har kollat på har varvtal i horisontell axel och mänden insprutat bränsle i vertikal axel så kommer den titta efter en annan vevaxelvinkel eftersom det är en annan mängd som skall sprutas in.
Jag kan inte så mycket om dieselmotorer, men det jg kan få fram här är att bränslet alltid skall vara insprutat innan övre dödpunkt (så nära övre dödpunkt som möjligt) någon annan form av tändkurva kan jag inte få det till att man ska behöva. På vilket sätt menar du att man skall behöva en annan tändkurva?

Författare:  Janson1 [ 14.53 2018-02-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

För att vara lite motvals... Jag tror inte spridarnas påslagsfördröjning är med då parametrar som systemspänning, bränsletemp, bränslekvalite (tjocklek) motortemp och spridarens egna avvikelse är olika per spridare, jag tror jag hittat ca 20-30 uS skillnad på olika individer... Så det krävs säkert en alldeles egen tabell för detta som jag tror baseras på en strömkrets som i verkligheten känner när spridarventilen träffar käglan och den börjar bygga upp tryck. Jag har ingen sådan strömkännare på min senare ECU då den känns lite överkurs, jag bör komma tillräckligt rätt ändå.
En annan tändkurva: Från det att spridaren öppnar och börjar spruta in soppa i cylindern så tar inte soppan eld omedelbart utan det tar en stund, den skall först förgasas, sedan värmas upp och sen tar det eld lite här och var samtidigt. Den tid det tar från det att första soppan sprutas in till det tar sig kallas tändfördröjning och är olika lång beroende på varvtal, värmen på motorn, värmen på inkommande luft, turbulensen och soppans möjlighet att ta eld. (sk cetantal-tändvillighet). Ett exempel: 3500 rpm låg effekt, turbon laddar inte alls. Detta ger tex 23 grader BTDC som insprutningsbörjan. Stampar man nu fullt spett så ger man ju mer soppa till motorn och varvet 3500 rpm med 23 grader BTDC. När sedan turbon börjar ladda då blir luften tätare och varmare vilket minskar tändfördröjningen och då bör man ju börja insprutningen lite senare för att behålla peaken på samma ställe (runt TDC) Nästa problem blir då: hinner man få in samma mängd bränsle om man börjar lite senare? För mer turbotryck, mer bränsle kan puttas i samtidigt som det blir mindre tid för att få i soppan. Finns det nån lösning mer än större spridare/pump? Ja om man fortsätter lite förbi TDC, nu brinner det så bra att allt i princip brinner upp direkt om bara syret räcker... Detta tror jag man måste ta hänsyn till. Sedan en kall motor börjar sin insprutning betydligt tidigare för att det just brinner dåligt i början. Detta är nog parametrar jag måste ha med...

Författare:  Janson1 [ 07.30 2018-02-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Skall väl tillägga: Dom parametrar som är kända kommer jag att ta hänsyn till och bara trimma in så det blir lagom, tex insprutningsbörjan med hänsyn till motortemp och motorvarv. Det kanske är överkurs att senarelägga insprutningsbörjan när turbon laddar? Sen kommer nog insprutningsslutet att ge sig lite självt, avslutar man för tidigt blir det för låg effekt och för lågt turbotryck, avslutar man för sent får man för högt turbotryck och kanske för hög avgastemp? Detta kommer jag att mäta så tempen håller sig i schack.
Sen har ju dom här spridarna mekaniskt inbyggd förinsprutning för att just stävja förbränningsojludet och det funkar nog då motorn är väldigt tyst i gången. Detta behöver jag inte ta hänsyn till i min programmering mer än att jag ev måste tidigarelägga lite extra pga att insprutningen startar först, sedan upphör den en kort stund för att sen komma igång igen tills jag bryter strömmen, det blir typ: """__""""""""""" varje gång oavsett varvtal.
Står det någonting om detta i länken? Jag kan inte se nåt. Det är oavsett förmodligen medräknat i tabellen grader/varvtal.
edit: felstafning

Författare:  Janson1 [ 20.07 2018-03-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag fick hem en EGT temp-prob i går och har gjort en liten koppling med proben (K typ) och en OP, LM358 och har nu en användbar spänning till Arduinon. Jag tror avgastempen säger väldigt mycket om insprutningsbörjan/slut ligger rätt eller ej. Så jag har nu lagt till en analogingång till (A8) och loggar detta värde också.
Jag har gjort om i loggen så, vid tomgång och fulleffekt och strax där under sparas loggen var tredje-fjärde sekund och vid marschvarv så sparas det bara var 28-30 sekund bara för att inte bli överöst med data. Detta är helt ärvarvtals-styrt och går motorn utanför detta marschvarvsfönster så loggas det snabbare igen. Jag har även en GPS-modul som lämnar ut nån slags nmea-signal. Jag har lite funderingar på att även logga detta...
Sen så finns det nu plats för att logga dom olika roderlägena, en Flight Data Recorder, FDR helt enkelt...
Men kanske lite overkill?

Författare:  larky [ 07.09 2018-03-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det är aldrig fel att logga data, men helst bara sådant som man skulle kunna ha nytta av. Loggning till SD-kort på ett sådant sätt att det underlättar för att sen visualisera resultatet är nog nyttigt för att kunna justera insprutningen efter en stunds körning då det går att kontrollera hur temperaturerna förändras.
GPS är alltid bra att spara om det händer något.

Författare:  Janson1 [ 08.33 2018-03-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En ytterligare förbättring eller bara förändring. Jag har nu beställt en slags efterföljare till NANO, Adafruit Adalogger och ItsyBitsy som nu skall provas ut. Jag är i skrivande stund lite oklar på om det blir bättre eller sämre... Mer datakraft gör inte ont men bara 3,3 volt istället för 5 volt ligger helt klart på minussidan. Men först skall det testas!

Författare:  Janson1 [ 08.01 2018-03-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har hittat lite roliga tryckgivare som med hjälp av en analogingång på arduino:n kan bla. ge airspeed, alltså en fartmätare som i visar samma som den runda fartmätaren i planet. Detta i hop med GPS- fart och riktning ger ju vindriktning och vindhastighet. Just att veta detta är väldigt bra för då kan man välja en annan höjd och få mindre motvind eller mer medvind. Dom här småplanen jag oftast flyger omkring i gör mellan 100 och 160 knop (185 till 295 km/h) och då blir det ganska vindkänsligt. 30 knop rakt i nosen gör att 100 knop bara blir 70 knop (130 km/h) i verkligheten. Flyger man bara runt fältet, (samma start och landningsplats) då spelar det ingen större roll men skall man någonstans då har det betydelse!

Författare:  Janson1 [ 21.53 2018-03-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har nu fått hem en för mig ny typ av Arduino med ARM processor som bara går på 3,3 volt. Kan man köra in 5 volt på ingångarna ändå? Jag har hört att vissa av dom skall klara detta men efter att tittat i den 1180 sidor långa manualen så ser jag ingenstans att det är tillåtet över 3,6 volt.
Vad gäller?

Författare:  Bosen [ 22.18 2018-03-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kan man inte bara göra en spänningsdelare till varje ingång?
Känns enkelt och säkert.

Författare:  Janson1 [ 06.17 2018-03-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jo jo visst, var på väg till det när jag hörde detta och måste ju kolla upp det och kasta ut en fråga också.
Det är en mastig manual i alla fall. Det värsta är att jag blir sömnig varje gång jag börjar läsa den...

Författare:  Janson1 [ 06.26 2018-03-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vi har fått en anställd på jobbet och en av hans hobby är visst astrimmade dieselmotorer för racing av något slag. Han menar på att man insprutningen skall vara klar vid TDC om möjligt. Detta underlättar min programmering en bra del men minskar väl effekten en del också... Men min undran kvarstår varför den mekaniska möjligheten att spruta in soppa sträcker sig 30-35 grader efter TDC. På denna motor så finns det inget annat sätt att få in mer diesel än större spridare, dvs lite större tryckkolv och lite större hål i munstycket å så kanske spruta in lite efter TDC, några grader och sen ha noggrann kontroll på avgastempen.

Författare:  hawkan [ 08.17 2018-03-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Teoretiskt ska väl förbränningen ske under konstant tryck. Insprutningen sker därför även under kolvens nedåtgående rörelse. I teorin så det behöver inte alls vara så det görs i verkligheten.

Kan du driva dina givare mm med 3.3V eller ger de alltid ut 0-5V?

Författare:  Janson1 [ 17.09 2018-03-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror alla mina givare är 5 volt eller 12 volt med "kortslutande" utgång (open colektor?) Så motståndsnät blir väl enklast där spänningen ligger för högt. Nu har jag lagt in min ECU sketch i Adalogger MO men det blev fel ingång första vändan. Jag tror man måste reseta den på nåt vis inför varje ny programmering? Jag har läst om det förut och nu kan jag inte hitta det...
Den här teorin med konstant förbränningstryck övergavs visst ganska direkt vid dieselns barndom.
I brist på ett 100% svar så blir det till att testa, jag har ju möjlighet att pyttsa in soppa upp till ca 30 grader efter TDC. Men nu släpper jag det till förmån för nya problem och utmaningar, tex få in min ECU sketch i den ARMa processorn.

Författare:  mrfrenzy [ 20.56 2018-03-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Eftersom VWs originalmjukvara gör all insprutning före TDC så behöver man nog inte fundera utan kan utgå från att det är bästa lösningen. (Enligt länken tidigare)

Författare:  Janson1 [ 21.05 2018-03-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Är vi källkritiska nu?

Författare:  mrfrenzy [ 00.34 2018-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Detta är information som används av många som "chiptrimmar" därute, hade den vart felaktig skulle det påpekats direkt.

Motorstyrenheterna använder en vanlig motorolaprocessor och koden går att köra i en disassembler för att se exakt vad den gör.

Det finns färdiga programvaror att ladda ner som tolkar och presenterar tabellerna.

Kanske har du kvar motorstyrenheten som hörde till bilen från början? Då går det att läsa ut flashminnet och få fram exakt hur den var konstruerad att fungera. Det går ofta också att hitta data som andra laddat upp om man vet motorkod och bilmodell.

Författare:  Janson1 [ 07.25 2018-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jadå, jag har kvar original styrboxen. Vem kan läsa ut den och få fram verkligheten? Eller skall jag försöka mig på det själv? Vad behövs i så fall för utrustning?
Jag har även fått på förslag om att byta motorfamilj från nuvarande till en 5 cylindrig i helaluminium. Mer effekt, mindre vikt. Det är egentligen en oslagbar kombination... Men min sketch klarar bara fyra cylindrar, skall jag göra en fem cylindrig sketch så får det bli ett helt nytt tänk och med interrupt dessutom...
Fasen, nu börjar det snurra här uppe på loftet...
mrfrenzy: Vi förutsätter nu att denna hemsida stämmer exakt. Då finns det nog inte så mycket mer effekt att hämta ur dom här PD-dieslarna utan att byta spridarna till större helt enkelt. För man kan ju inte börja spruta in soppa för tidigt och man kan inte spruta in soppa efter TDC så spannet blir ca 35-40 grader. Hade det varit en CR-diesel så hade man bara höjt trycket och vips får den mer soppa per vevaxelgrad.
Denna motorfamilj finns ju i en mängd olika effekter, från 43 till 118 Kw (58 till 158 hkr) Det är samma motor i botten så vad skiljer? Turbotryck, olika stor turbo. kamaxel? borde skilja en del. mest skillnad är det nog på spridarnas kolvarea. Jag misstänker att min motor som i dag är på 85 kw eller ev 96 kw (enligt uppgift bör det vara en AJM- motor men jag kan inte hitta det någonstans) inte går att få ut så mycket mer kräm utan nya spridare?
Men som sagt, jag måste lämna detta till förmån för en växellåda.

Författare:  Bosen [ 08.10 2018-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

på samma länk som jag tidigare visat så visas även skullnaden mellan PD130 och PD150. Det är skillnad i mapparna på vissa ställen men det verkar som om man håller sig innan TDC i vilket fall.
Jag fortsatte att googla lite och jag hittade att man i vissa fall vid trimmning går upp till 6 grader efter TDC men efter det så ökar inte efekten något alls. Någon påstod att optimalt var mellan 4 och 6 grader efter TDC.

Att läsa ur programvaran kan man göra med en enhet som heter MPPS och går att köpa på ebay för några hundringar. Det finns ganska mycket info på nätet om det men jag har aldrig använt det själv.

Författare:  mrfrenzy [ 08.42 2018-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kan du lägga upp en bild på styrenhetens etikett så ska jag kika om någon redan har läst ut den.

Författare:  Janson1 [ 08.47 2018-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Den här hemsidan ÄR verkligen intressant, jag kommer att använda den data som går att använda. Däremot saknar jag turboreglering via ventil N75. Jag har låst min turbo i det yttersta läget så den kan nästan inte ladda alls vid låga varv. Jag kan inte utläsa på vagecumap hur dom reglerar maxtrycket men jag kommer att reglera ner max bränslemängd när trycket är på väg över målvärdet. Jag hade tänkt 1,5 bar över atm vilket är samma som 2500 mBar totaltryck om nu turbon orkar detta?
Jag skulle instinktivt gissa också att lite efter TDC är ok men sen försvinner kolven fortare än vad den nya soppan hinner brinna...
Om man nu tänker tanken 2 mg/grad så kan max mängd bli 40Gr x 2 mg = 80 mg /slag + 5 Gr x 2 mg = 90 mg /slag. Om jag har denna möjligheten på riktigt då blir allting mycket lättare, att begränsa mjukvarumässigt är inga problem men skall den ha mer än vad den rent mekaniskt kan ge då blir det problem...
Det kanske inte ger nåt att läsa av den gamla mjukvaran då jag ändå gjort helt ny och på annorlunda sätt, dessutom kan jag ju lite utläsa den via vagecumap´s hemsida.
edit: Jag har den gamla styrboxen men inte locket med etiketten , har inte sett till det på länge. Däremot så står det inte Motorola någonstans, det kan ju vara egenstämplat men Bosch och Siemens står lit här och var.

Författare:  svanted [ 12.51 2018-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

jag har ju alltid trott att dieslars högre vridmoment beror på att bränsle sprutas in efter TDC, typ att arbetstakten blir längre.
Citera:
men sen försvinner kolven fortare än vad den nya soppan hinner brinna...

hur menar du nu?
så länge det finns syre kvar i cylindern måste det vara vits med att tillföra mera soppa under arbetstakten,
det är ju ingen flamfront som skapar tryckökningen utan en volymökning av dels förbränningsgaserna och dels temperaturökningen.
och tryckökningens hastighet hävdar jag är lika med ljudhastigheten, kolven går ju bara med typ 25m/s

Författare:  Janson1 [ 13.12 2018-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bara här på forumet så råder det delade meningar om detta med att spruta in soppa efter TDC, nu kommer jag göra någon slags halvetenskaplig utprovning av detta och jag är väl själv inne på att en liten bit efter är ok men inte för länge. Vad detta sen beror på är från mig bara gissningar som jag förut skrivit om, men som sagt en utprovningsrapport kommer!
Men, men... Nu har vi haft ett allvarligt snack, jag och den ARMa MO, den har lovat att bättra sig så nu kan jag programmera Itsy Bitsy med min IDE flera gånger och det funkar, har även provat Serial.print funktionen på flera farter och det fungerar med. Vid programmering så använder den tex Port com 11 och vid Serial.print Port com 12. Detta måste man aktivt ändra mellan varje gång. För att få itsybitsy i prog.läge trycker man reset 2 snabba gånger, sen är det bara att programmera in sitt alster.

Författare:  Janson1 [ 14.21 2018-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

svanted: Det "högre" vridmomentet beror nog mer på att effekten kommer vid betydligt lägre varvtal och max effekt oftast ligger runt 4000 rpm. Sedan så beror det nog i sin tur på att dieselns flamfront är lägre än bensinens, hur stor skillnad vet jag inte men det är av betydande. Alla "gamla" dieslar, sådana som sitter i traktorer och andra jordbruksredskap har fast insprutningsläge och dom bankar en del också. Jag tror ingen jag kommit i kontakt med har sin insprutning efter TDC så det är nytt för mig med.
Jag är nog lite inne på att då soppan brinner ganska sakta och dessutom kräver lite beredningtid så hinner nog kolven en bit innan det brinner för fullt och sen blir det ju för sent för avgasventilen öppnar ju lite innan botten. (BDC)

Författare:  Janson1 [ 07.04 2018-03-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Problem, problem, men dom är till för att lösas... Den här ItsyBitsy MO har väl gett mig en del huvudbry, först ville den inte vara med alls, sen lyckades jag programmera in och få liv i den, även Serial.print(). Men alla ben låg huller om buller, det visade sig att jag valt fel modul helt enkelt, efter en del meck så har jag rätt modul vald i IDE:n och rätt ben aktiveras vid rätt tillfälle, i alla fall dom jag kunnat/hunnit kolla. Då NANO:n/UNO:n har alla ben representerade från d0 till d21 (UNO d19) och A0-A7 (UNO A5) medans MO saknar nåt ben här och där så fick jag göra om i sketchen och välja ben som i verkligheten fanns. Funkar? Nää, inte ens Serial.printfunktionen i setup fungerar så nåt är riktigt dåligt, men vad? Jag använder Arduinos egna IDE och dess egna språk och det skall vara kompatibelt hela vägen. Och jag är för dålig för att kunna göra en felsökning. Jag har ju använt byte där det varit möjligt men nu är denna processor 32 bitars istället, kan det bli problem där? Det verkar som problemet uppträder redan i setup för hade setup snurrat en gång så hade serial.printen skrivit Hej till min dator...

Författare:  kodar-holger [ 07.44 2018-03-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu säger du ju att det har fungerat en gång så det enda jag har att komma med kan vara helt galet.

På den där är det en 32-bits processor som du vet. En ARM Cortex-M0 eller närmare bestämt en ATSAMD21G18. Du behöver alltså komplettera din installation med en kompilator för just den processorfamiljen. Och har du redan kört kod oavsett om pinnarna är blandade så borde du redan ha det...

På den här sidan kan du läsa om hur du gör.
https://learn.adafruit.com/adafruit-feather-m0-basic-proto/using-with-arduino-ide

Sen måste du välja rätt kort i IDEt under Verktyg->Kort. Och det säger du ju också att du gjort....

Och nej, byte borde inte vara problemet. Har du försökt göra ett helt nytt program som bara typ blinkar med lysdioden och skickar ut något med serial.print?

Författare:  Janson1 [ 13.44 2018-03-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kodar-holger: Jag har gått ganska systematiskt till väga och fått till blink på dom olika benen, även flera samtidigt i olika mönster.
Samtidigt har jag kört Serial.print()) på 2 hastigheter, dels 9600 och dels 250000 baud vilket fungerar alldeles utmärkt. Eftersom den kan skriva ut det som jag putter in, kan blinka på rätt pinnar så borde det mesta vara rätt i alla fall. Vad som sen händer i konverteringen från 8 bitar till 32 bitar har jag ingen susning om, kan inte ens gissa... Men jag tycker som så att fungerar det med detta så borde en annan funktionell sketch också funka här! Sen har jag inte provat alla funktioner, analogRead() inte alls utan det är skarpt nu. Jag förutsätter att efter d13 så kommer d14 som också är A0, d15 är A1 osv.

Författare:  hawkan [ 13.52 2018-03-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Använd explicit storlek på typerna t ex int16, int32, uint8_t så är det inget problem.

Författare:  Janson1 [ 16.11 2018-03-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I dag använder jag byte så ofta som möjligt. och int har varit 16 bitar per automatik förut. Skall jag byta ut alla byte och int mot int16?

Författare:  hawkan [ 22.34 2018-03-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det är inte så stort problem att gå till 32-bitars. byte är byte. int är 16-bitars på avr men gissningsvis 32-bitar på din nya platform. Blir det ett problem, det kan nog bara du avgöra. Är det viktigt att inten är en viss storlek kan det vara bra att ange storleken. Det hade nog varit mer fundersamt att gå från 32-bitars till 16-bitars i och med 16-bitars int. Jag raljerar märker jag. Jag skulle utgå från att det inte är något problem alls, men om du vet någon variabel som är viktigt att den är en viss storlek så kan det hjälpa att ange storleken. Vill du vara helt säker så ange storleken på alla variabler.

Författare:  Janson1 [ 06.37 2018-03-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det här med storlek, byte, int, long mm: Jag misstänker att en eller två av dom har betydelse men som det ser ut nu så verkar inte ens setup gå? I alla fall om man ska lita på serial.print funktionen som finns i både setup och i loop. Egentligen skall printfunktionen inte vara där alls men när inte nåt funkade överhuvudtaget la jag till ett par serialer för att kunna se ett ev fel... Det är nu därför jag tror den är tvärdöd... Egentligen så behöver jag inte få det till att funka då jag nog har bestämt mig för NANO och NANOMEGA (TM via Janson1). Det är bara roligt att testa och nu varför det inte går att få liv i...

Författare:  Janson1 [ 06.50 2018-03-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

carpelux: Du var ju först med att lägga in min ECU-sketch i en 32 bitars processor, vet du om du fick någon slags funktion?
Har du möjlighet att prova med printfunktionen för att se om det snurrar där inne?

Författare:  carpelux [ 07.08 2018-03-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tog en snabb titt på om det går att få någon utskrift från ett par Serial.print. I och med att jag inte har något kopplat till den blir det ju inget rättvisande test, men två printar som visar de två alternativen för disable fungerar bra. Efter 15 utskrifter där disable är hög tystnar det, antagligen för att den hamnar i någon annan loop och inte får input.

Författare:  Janson1 [ 07.21 2018-03-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

OK: Tack. jag gör samma test under dagen...

Författare:  Janson1 [ 21.03 2018-03-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, nu är det testat som jag tror du carpelux har gjort också. Jag la en Serial.print inom varje IF-sats till disable LOW/HIGH.
Och... inget hände. Så nåt är riktigt galet. Jag skrev // framför alla analogRead på prov också utan nån förbättring.
Egentligen kan jag skita i detta helt och hållet då jag har en fungerande lösning med Atmega328/2560. Men, det skulle vara roligt att veta vad tusan som går fel...?

Författare:  Janson1 [ 09.19 2018-03-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu börjar våren äntligen komma, kung Bore har haft sitt grepp länge nu... Med våren så exploderar mitt jobb så både programmering och utprovning blir lidande. Ju bättre väder ju mer jobb. Och nu har jag väntat på Atmega2560 kretsen alldeles för länge, det är väl snart två månader sedan den beställdes? Allt inom elektroniken har nu stagnerat. Men en fredag em/kväll när solen gassat hela dagen och kvicksilvret visar betydligt plus så skall jag ta ut motorn på gården och provköra/programmera tills jag är nöjd med gången i alla fall. Jag har ju spridarstart både lågt och högt varvtal att justera in och det kan jag göra analogt med två potar helt enkelt, det är nästa grej att få provat ut.
Så, fortsättning lär följa när tid finnes!!

Författare:  Janson1 [ 19.02 2018-03-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I dag (äntligen) så kom AtMega2560 processorn och det visade sig att jag cadat fel storlek på mönsterkortet... Det skulle varit 16 x 16 men jag hade valt efter mätning 14 x 14 utan att egentligen veta var 14 resp 16 skulle mätas. Trots lärdomen att alltid ha alla komponenter hemma innan kretskortcad så känner jag mig tvungen att fuska där lite då det kan ta en månad eller två att få hem alla pryttlar. Som tur va så var jag inte nöjd med mitt NANOMEGA ändå så det känns bra att kunna cada om och få det bra. Sen så kostar ju dagens kort nästan ingenting i jämförelse mot 90 talet... (ca 150 spänn för en 10 pack)

Författare:  Janson1 [ 21.40 2018-03-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nytt kort cadat och ivägskickat för tillverkning. Jag har mer I/O på det nya kortet och + - draget till samtliga plintar.

Författare:  Janson1 [ 21.05 2018-03-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I dag em/kväll så startade jag upp motorn igen, den gick ganska illa i någon minut tills all luft i soppan var väck. Nu skall jag göra en ny kallstart i morgon och sen lägga in mitt nya program med variabel förtändning via potar, en för lågvarv och en för högvarv. Nu blir det mest inställt på känn men jag får i alla fall till ett ungefärligt tändläge/insprutningsbörjan.
Jag tänker även prova att öka tiden individuellt per spridare då jag har märkt lite olika mekaniska skillnader.

Författare:  Janson1 [ 22.37 2018-03-30 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Med senaste programmet gick motorn skit! Jag har nu tänkt om lite ang programmeringen, jag har gått tillbaka till halvvarvsprincipen, den gör alla beräkningar inom 180 grader förutom dom analoga, dom har jag delat upp i 6 st case där den läser gas och turbotryck första halvvarvet, sedan nåt annat, sedan gas och turbotryck igen, sedan nåt ytterligare annat. Det jag totalt läser av är gas, turbotryck, atmosfärstryck, turbolufttemp, omgivningtemp, motortemp via ECU:n driv-NANO, (Kontroll-NANOMEGA läser även avgastemp och loggar hela skiten inkl. realtid&datum).
I morgon om tid finns, då skall jag prova vidare...

Författare:  Janson1 [ 06.10 2018-04-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Blev ingen test... Fick byta urtrampningslager på traktorn istället, det är i och för sig nästan lika roligt, men betydligt mer behövligt. Man får välja sina strider!

Författare:  Janson1 [ 21.12 2018-04-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I dag kom senaste kretskortet, en NANOMEGA. Kretsen passar rent mekaniskt. det blir nog nu till att skaffa flussvätska.
Har Kjell o CO detta tro?

Författare:  mrfrenzy [ 00.25 2018-04-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag brukar köpa chipquik gelfluss från digikey. Det kommer på två dagar.

Författare:  Janson1 [ 15.35 2018-04-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bra förslag mrfrenzy! Jag var faktiskt inne på kjell&Co i dag och köpte en flaska av deras fluss. Han i butiken var osäker på dess funktion, men det blir väl till att testa och göra rent efteråt ifall det är aggressivt. Annars så får det bli från digikey!

Författare:  mrfrenzy [ 20.14 2018-04-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I fordonsmiljö måste man göra rent även om man avänder no-clean fluss!

Detta har jag lärt mig den hårda vägen :)
Efter några månader ser det ut som korten badat i saltvatten ifall man lämnat flussrester.

Författare:  Janson1 [ 06.57 2018-04-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kjells fluss fungerar men vad jag minns från förr så va den gamla sorten bättre. Jag fick till lödandet ganska bra, alla 100 benen sitter ordentligt, den är 99 % centrerad och jag gjorde rent direkt efteråt. Nu är den ihoplödad med en stympad NANO (NANO utan processor) och nu skall jag försöka få till en ISP (In Ciricuit Programmering?) via en annan MEGA och AduinoISP via min IDE. Vet egentligen inte riktigt hur det skall gå till men men...

Författare:  hawkan [ 07.06 2018-04-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Åh, jag tror att för den som kan styra en motor med en arduino så är detta en baggis.
Här är en länk annars https://www.arduino.cc/en/Tutorial/ArduinoISP
som beskriver rätt detaljerat

Författare:  Janson1 [ 15.35 2018-04-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag går nog bet... Skit också! Jag har i alla fall lyckats få till det mesta utom det att jag får error vid den sista programmeringen, då när själva bootloadern skall in i Atmega2560. Den resetar och sen blir det error...
Alla klipp och div instruktioner jag sett så är det alltid 328:an som är målkrets, min är ju 2560! Vad göra?
Alltså, jag kan ju ha eldat upp processorn??? Men oscilatorn går, den får 5 volt, reset fungerar.

Författare:  Janson1 [ 18.54 2018-04-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag kunde inte låta bli så monterade en till krets på ett nytt PCB och gjorde det lite mer vetenskapligt och får samma problem... Jag har ju köpt dessa kretsar på Ebay och dom är tillverkade 2013 vecka 41. inte pinfärska men ändå.
Finns det möjlighet att dom helt enkelt är kassa? Jag tror in i det längsta att det är jag som gör/gjort nåt fel men finns det någonstans man kan se om tex. Microsoft har haft mycket kassationer vid nåt specifikt tillfälle?
Jag har i alla fall gjort så som Youtube-klippen visat och valt om till 2560 vid "load bootloader" men inget har hjälpt...
Jag är nu lovad en ISP-programmerare som jag skall göra ett "sista" försök med...

Författare:  Janson1 [ 19.04 2018-04-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag gjorde även en vetenskaplig test om min NANO som ISP-programmerare fungerar mot en annan NANO och det gör den, testade även mot en ytterligare NANO utan kristall/resonator och den fungerade inte. Så min NANO-ISP funkar om målkortet svänger.

Författare:  hawkan [ 20.43 2018-04-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Den måste ha lite sväng. Men det behöver inte vara en oscillator. Här en en arduinoisp som ger ut 8 MHz på pinne 9 som kan användas som "kristall".

https://github.com/adafruit/ArduinoISP

Författare:  Janson1 [ 21.05 2018-04-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag får nog känna mig besegrad, för tillfället! Men på måndag skall det testas med en "äkta" ISP-programmerare, vad nu detta innebär? Hoppet är det sista som överger en, säger dom lärde...

Författare:  Janson1 [ 09.25 2018-04-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hjälp! Är det någon som har en processor, Atmega2560-16AU? Dom verkar slut på dom flesta kända ställen...

Författare:  hawkan [ 09.52 2018-04-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror faktiskt det kan ligga en här. Det enda jag kan tänka för felsökning är att titta av lödningen i mikroskop. Det är rätt smått och nästan säkert att det blir nån brygga. Åtminstone med min lödskills.

Författare:  hawkan [ 10.14 2018-04-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hade några liggande. PM-a adress och sånt så skickar jag.

Bilaga:
mega.png

Författare:  Janson1 [ 12.53 2018-04-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har lött dom under en sk. steroelupp, ser ut som ett tvåögt mikroskop men har inte så hög förstoring, bara runt 12-30 gånger. Däremot har jag inte mätt efter ev kortisar, bara kontrollmätt att det finns 5 volt och minus och att kristallen/resonatorn går.
Hawken: ja gärna! Du har ett pm.

Författare:  Janson1 [ 20.51 2018-04-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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.

Författare:  Janson1 [ 21.51 2018-04-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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...

Författare:  Janson1 [ 20.16 2018-04-11 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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.
Bilaga:
IMG_20180411_200156.jpg


Hmm, får nog investera i en bättre kamera, den här mobilkameran är inget vidare.
Bilaga:
IMG_20180411_200210.jpg

Författare:  KLset [ 19.27 2018-04-13 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vad är det för status på det hela? Hur ser ECU:n ut i nuläget?

Författare:  Janson1 [ 21.26 2018-04-13 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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.

Författare:  Janson1 [ 17.58 2018-06-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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!!

Författare:  Janson1 [ 22.37 2018-07-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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!!

Författare:  Janson1 [ 16.49 2018-07-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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...

Författare:  Janson1 [ 07.56 2018-07-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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.

Författare:  Janson1 [ 18.27 2018-07-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Här kommer en liten video på motorkörningen med två olika program.
https://www.youtube.com/watch?v=xJZjwwSrgyo
Håll till godo.

Författare:  KLset [ 20.10 2018-07-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det låter ju riktigt fint det där. :D

Författare:  Magnus_K [ 21.20 2018-07-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja riktigt snyggt :tumupp:
Blir alldeles varm av ljudet efter ha tuffat runt i ca 35000 mil med en sån där :wink:

Författare:  Janson1 [ 21.45 2018-07-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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?

Författare:  ktm_micke [ 06.39 2018-07-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vilket jobb du lägger ner helt otroligt och att du skriver utförligt om det. Kul

Författare:  Janson1 [ 08.28 2018-07-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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: [Expandera/Minimera] [Hämta] (Untitled.txt)
    // 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()

Författare:  Janson1 [ 17.21 2018-07-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror jag måste hitta programmet som sitter i master ECU:n (A) för den går oförskämt bra trots att det inte finns några yttre justermöjligheter… Det senaste programmet fungerar men jag är långt i från nöjd, motorn är svårstartad och den tappar fasläget om den går som inaktiv utan aktiv kamaxelgivare, nåt är vajsing...

Författare:  Janson1 [ 21.48 2018-07-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Efter lite injustering av insprutningsbörjan så har jag fått bästa resultatet på ca 12 grader BTDC vid tomgång och ca 45 grader BTDC vid fullvarv. Sen är spridarna på x tid beroende på belastning (duration) men pga. avsaknad av belastning blir ON-tiderna ytterst korta, typ 2-4 grader bara... Den här sajten: https://sites.google.com/site/vagecumap ... g-ecu-maps kan bara inte stämma, kanske som nån teoretisk önsketanke om dieselmotorn men inte med verkligheten. (Eller har jag fått detta helt om bakfoten?) Men å andra sidan, motorn går ju... Jag kan bara konstatera, skulle jag programmerat efter deras tabeller så hade nog motorn aldrig startat, ännu mindre gått bra.
Edit: Skall väl tillägga att jag strömsätter spridarna ca 300-450 mikrosekunder innan önskad insprutning vilket inte gör någon större skillnad på tomgång/lågvarv men gör ca 10-15 grader på fullvarv, så strömsättning av spridarna sker 55-60 grader BTDC vid 4000 rpm! annars ryker den vitt och går dåligt = för sen tändning.

Författare:  Janson1 [ 19.11 2018-08-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har jag dels hittat filen/sketchen som går så bra, jag hade mejlat den till mig själv i mars månad... Och dels har jag hittat felet till att den tappade fasläget som inaktiv, jag hade valt "puls = 0" men "delta = 0" blir mycket bättre. Om man väljer "delta = 0" så följer den inaktiva ECU:n med slaviskt men utan att vilja ge någon soppa. Jag hade valt "puls = 0" vilket tar bort alla tänders durationstider så den hittar helt enkelt inte tandluckan, inte bra... När jag sedan gör ECU:n aktiv så letar den upp tandluckan på fem röda men har ingen aning om vilken cylinder som ligger i tändläge... Nu tror jag att jag har en ganska bra och säker ECU, och det är det nog dags att börja med finliret. Att ha olika tider pga tillslagsfördröjning verkar ändå lite overkill, kanske skulle skippa detta? Att ha olika tider kall/varm motor verkar också onödigt men det får jag prova ut till vintern. Jag tror jag är till världs ände nu utan att ha en rejäl belastning, typ en propeller. Nästa grej att börja med blir nog ändå en växellåda&propeller så motorn får nåt att bita i... Det blir annars smått omöjligt att få till turboriet.

Författare:  Janson1 [ 05.27 2018-08-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I går körde jag den riktigt varm >80 grader, ja tom. plastslangen på bränslereturen smälte ner...
Jag upptäcker att den blir mer och mer svårstartad ju varmare den blir. Normalt startar motorn på ett halvt till max två varv beroende på kamaxelns startläge, hur långt kvar till givaren den har. Men som riktigt varm så blir den lite tjurig, kan tända till men orkar inte riktigt igång alla gånger. Det är bra fart i startern hela tiden och den hugger aldrig utan verkar bara få för lite soppa/fel tillfälle? Det är ju en del detta kan bero på... Koppartrådens ökade resistans vid högre temp, magnetismen kanske minskar vid ökad temp, soppan blir tunnare och läcker igenom högtryckskolvarna lättare, ja det finns en del anledningar... Jag har ju en del justeringar att välja på, se högst upp i sketchen: "senasteinspr" "startmangd" mm som styr detta.

Författare:  Janson1 [ 21.00 2018-08-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag funderar vidare... Jag har numera lagt in ett seriemotstånd (0,47 ohm) på den gemensamma plusmatningen till spridarna för att, ja mest skydda spridarna om en transistor blir kortis i eller om ECU:n får ett tuppjuck och blir aktivt hög för länge. Under start så är spridarna på otroligt länge (ca 9 vevaxelgrader vilket tar flera millisekunder) i förhållande till under drift då ontiden är upp till två millisekunder som absolutmax. Kanske så räcker strömmen inte till för att hålla spridarna öppna tillräckligt länge när dom är varma? Om man kortsluter motståndet så borde denna tes visa sig direkt som sann eller falsk... Det är ändå lite konstigt för motorns krav på startmängd diesel/slag minskar drastiskt vid varm motor och den verkar ändå inte kunna ge tillräcklig startmängd. Kanske insprutningstillfället skall senare eller tidigareläggas?

Författare:  Bosen [ 12.38 2018-08-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har för mig att du skrivit att spridarna tar ganska lång tid på sig att öppna. Det är inte så att du ska använda någon form av peak & hold? (Eller det kanske du redan gör?)

Författare:  Janson1 [ 07.46 2018-08-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: det stämmer spridarna tar lite tid på sig från strömsättning till nålstängning/öppning. (nåt mellan 250-500 mikrosekunder beroende på drivspänningen och förmodligen temperaturen också) Men på startvarv gör ju detta nästan 0 i fördröjning. Det blir lite av peak&hold per automatik genom det gemensamma drivmotståndet på 0,47 ohm. Men nu har jag provat att kortsluta det vid start varm motor och jag kan inte påvisa nån egentlig skillnad. Jag har ett väldigt litet startbatteri (44 A/h) som dessutom inte laddas upp när motorn startats då generator saknas. Så efter tio femton startförsök så kroknar batteriet och den startar inte mer alls fast jag tror den är över startvarvet. Men är det bra fart i batteriet så startar den varje gång varm med men lite mer malande behövs ibland. Nästa grej att kolla blir nog hur länge spridarna aktiveras rent elektriskt vid start så jag inte felsöker på fel ställe. Jag har funderat på nåt slags urladdningsrör som jag sen triggar på tex spridareutgång ett och får då veta verklig spridarstart i förhållande till vevläget. Och sen skopet för att få ut öppningstid/vevaxelgrader.

Författare:  Bosen [ 09.21 2018-08-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Då är inte drivspänningen helt stabil alltså?
kan man inte göra den mer stabil? Behöver du 12 volt, eller skulle du klara dig på 10 tex?
Måste ju vara väldigt jobbigt att göra olika beräkningar beroende på hur laddat batteriet är?

Författare:  Janson1 [ 12.07 2018-08-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det är inte speciellt jobbigt att programmera in en algoritm för detta. Jag läser av via A7 och drar av x mikrosekunder från, jag tror 500 uS grundfördröjning beroende på aktuell drivspänning. (se en bit ner i sketchen) Den går att starta och då är det ca 10-11 volt i batteriet och jag har provat att köra ner till 9 volt men då går den ganska dåligt, nu var detta innan jag gjort korrigeringen i koden. Men spridarna öppnar vid 9 volts batterispänning i alla fall. Drivspänningen är väl ganska ren men inte spänningsstabil, det skiljer sig på det vanliga viset som på alla andra fordon...

Författare:  Janson1 [ 17.10 2018-08-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag gjorde en "stroboscopslampa" av tre blåa lysdioder och ett motstånd som jag sen kopplade på en valfri spridarutgång, och se på f*n det funkade, man kan se både starttid och hur länge spridaren är aktiverad. Man ser strecket först tydligt sen är det otydligt en bit brevid som sen ändrar sig lite när man ökar/minskar varvtalet. Den variabla tändförställningen synt tydligt, likaså batterispänningens inverkan på starttiden. Det finns ett litet flutter runt 1500-2000 rpm som jag gissar på är någon slags självsvängning i motorn, man kan tom höra det lite ibland. En bild på härligheten när den står still.
Bilaga:
20180810_165843.jpg

Att fota det när motorn går gick inte men det borde finnas nåt sätt där också?

Författare:  KLset [ 21.11 2018-08-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kul att läsa, som vanligt.

Kanske går det att fånga något av det på video?

Författare:  Janson1 [ 19.24 2018-08-11 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, kanske det... I dag har jag haft uppe en ejektor och lagat den och sen tillbaks i borrhålet igen och är alldeles utschasad...
Om jag hinner så skall det testas i alla fall.

Författare:  Janson1 [ 06.39 2018-09-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror jag kommit till den del av projektet som nu kräver en helt annan typ av insats... Jag kommer inte speciellt längre med programmeringen, det är inte meningsfullt att fortsätta så länge jag saknar en belastning som kan ta hand om motorns effekt. Att bygga en växellåda känns nu ganska jobbigt även om jag har bägge tandremshjulen och två remmar liggandes. Jag är ytterst tveksam till om motorn kommer att hamna i nåt flygplan någon gång då jag har tröttnat lite på flygeriet rent allmänt. Att trycka in motorn i en gammal traktor skulle kanske vara roligare att få till? Definitivt lättare att få till om det är samma rotationsriktning bara... Min hemmasnickrade vartalsreglering skulle passa en traktor som handen i handsken då alla traktorer har varvtalsregulator genom hela vartalsregistret.

Författare:  Janson1 [ 06.39 2018-09-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En gammal Dexta eller Ferguson tror jag skulle passa ganska bra. Eller en Volvo 400/430, den har ram där framme, det underlättar motormonteringen.

Författare:  Janson1 [ 22.30 2018-09-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det blev en gammal bensin/fotogen Grålle som nu är införskaffad men ej hemkommen än... Den gamla motorn är hel eller halvdöd? och lämnar sin plats till förmån för VW PD-dieseln, ja den går åt samma håll. Däremot har en Grålle ingen ram utan motorn är en bärande del så en abrovinsch behövs här då VW motorn inte klarar att hålla både traktor och framvagn själv. Jag ser faktiskt fram emot denna del i projektet! Nu får jag en sportslig chans att få till turbotrycksreglering och olika maxbegränsningar som bara måste finnas. Maxbegränsning på höghöjd går nog däremot inte att få till... Man kan inte få allt på en gång.

Författare:  Bosen [ 07.49 2018-09-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ska bli kul att följa fortsättningen :tumupp:

Författare:  Janson1 [ 20.29 2018-09-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ett par bilder på den nu hemkomna traktorn
Bilaga:
20180906_172105.jpg

Bilaga:
20180906_172121.jpg


motorn har beslutat sig för att lämna garaget, den står numera utanför...

Författare:  Janson1 [ 20.30 2018-09-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hur tusan vänder man på bilderna?

Författare:  svanted [ 05.59 2018-09-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Citera:
Däremot har en Grålle ingen ram utan motorn är en bärande del så en abrovinsch behövs här

jodå, både motor, kopplingskåpa och växellåda är ramen, så den modifieringen blir intressant... :)

Författare:  Janson1 [ 00.15 2018-09-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror man kallar dom utan ram eller bara självbärande men nu när motorn är väck så tänkte jag mig en fyrkantsbalk på varje sida om motorn, det skall precis få plats då den nya motorn är ganska smal vid tråget. Det skall ju ändå till en adapterplatta av något slag, jag tänkte mig en 10 mm platta som bultas i växellådans sprängkåpa och motorn bultas sen i adapterplattan lagom centrerad. Fyrkantsbalkarna skall sen svetsas fast mot adapterplattan så dom ligger parallellt med motorn och sen skall framvagnsupphängningen bultas fast i andra ändan på fyrkantsbalkarna och även motorn kommer att bultas framtill i balkeriet. Mer om detta sen. I dag har jag ev fått till en kopplingskonvertering, jag tänkte använda befintlig tryckplatta, lamell från Fergusson och befintligt dubbelmassahjul från VW-motorn. För att få till detta så har jag införskaffat en bromsskiva till nån Daihatsu av något slag (Biltema…) som sen har fått sätta livet till och blivit just en viktig del i kopplingen.
Bilaga:
20180908_182953.jpg

Här bearbetas skivan till att passa i en koppling istället...

Bilaga:
20180908_193331.jpg

Så här tänkte jag det skulle bli från början men jag har nog ändrat mig lite, får se hur det blir.

Författare:  Janson1 [ 18.54 2018-09-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har tänkt om och använder dubbelmassahjulet vidare, först fick jag fräsa bort en kant för att det större svänghjulet (bromsskivan) skall gå plats och kunna vrida sig utan att det tar i någonstans. Att få till centreringen är inte det enklaste, försökte först med typ spetsiga bultar och med hammarslag kunna se märken men skivan studsar ur läge, inte bra. Se bild
Bilaga:
20180909_153530.jpg


Jag får nog hitta en tryckplatta och centrera in den och sen borra lite i blindo, men det bör passa...

Författare:  svanted [ 20.49 2018-09-09 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

bultarna behöver kanske inte vara exakt utan med lite spel, sen kan man centrera den i en svarv mha en mätklocka, dra fast och sen borra i några styrstift...
är hålen symmetriska så att man kan tillverka en jigg,

Författare:  Janson1 [ 08.14 2018-09-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hålen är symetriska. Jag skall leta upp en tryckplatta att borra efter och sen göra ev finjusteringar så det blir så rakt som möjligt från början och därefter balansera enheten i svarven. Jag har själv en vibrationsutrustning och har även chans att låna jobbets balanseringsutrustning (Wib 2020 någonting)
Ett nytt styrstift när det är som rakast är en bra idé.

Författare:  Janson1 [ 20.50 2018-09-13 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har jag till sist fått till dubbelmassasvänghjulet och sen fått fast det på motorn.
Bilaga:
20180911_204622.jpg

Ett nytt problem har dykt upp, tack vare dubbelmassahjulet så har den blivit nästan omöjlig att få igång... Jag tror dubbelmassan stör vevaxeln vid startvarv? Vad göra? Jag har kanske nån idé men är det någon av er som vågar sig på en kvalificerad gissning?
Edit: felstavning

Författare:  Bosen [ 10.03 2018-09-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kan du utveckla på vilket sätt du tror den stör?
Använder du original vevaxelgivare?

Författare:  Janson1 [ 12.36 2018-09-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Med komplett dubbelmassahjul och tryckplatta orkar den helt enkelt inte igång utan att batteriet laddas under startförsöket, med bara bromsskivan som extra svänghjul så blir den något bättre, med bara dubbelmassahjulet som det var från början startar den direkt. Jag har en ide om att dubbelmassan kommer i någon slags ofas/självsvängning vilket gör att tiderna som mäts via tandhjulet inte blir rätt. Jag gjorde nu i dag en avart av programmet där jag tog bort alla deltiderna och sparade bara 2 st som jag sen delar på mitten. Ingen skillnad... Jag misstänker att den detekterar inte tandluckan varje gång utan kommer i ofas och då behöver den gå ett halv varv inna den kommer i fas igen och tänder till och kommer i fas igen osv... Tusan, jag behöver nog ta ut scopet och mäta vetenskapligt.

Författare:  svanted [ 13.00 2018-09-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

behöver du ha batteriladdaren i för att den ska starta?
den går tyngre med större massa...
sjunker spänningen till styrboxen såpass att den resettas?
prova sätta en diod på spänningsmatningen till styrboxen(arna)(processorena) så att inte buffertkondingen(och sätt dit en stor en) laddas ur bakvägen.


edit;
snabbast är ju att starta från ett annat batteri än det resten drivs av.

Författare:  Janson1 [ 20.58 2018-09-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nä, det är inga batteriproblem alls egentligen, ECU:n resetas inte utan jag tror den tappar fasläget, hittar inte pulsluckan (tandluckan)
Batteriladdaren är för att få mer än maxfart på startern vid start, då kommer den igång ibland. Utan det extra dödköttet startar den direkt även när batteriet börjar krokna... I värsta fall skulle jag kunna steloperera svänghjulet, det finns väl ingen Grålle som är i behov av ett dubbelmassahjul? Samtidigt är det roligt att hitta felet/förbättra programmet...

Författare:  Janson1 [ 11.23 2018-09-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: Jag har en egen vevaxelgivare, original är en magnet med koppartråd runt och min är av hallelementtyp och ger en fin fyrkantsvåg som är lätt att detektera rätt. Däremot använder jag samma hål och original tandhjul.
Jag hinner nog inte kolla några pulser i dag men återkommer när det är gjort om inte innan...

Författare:  Bosen [ 17.48 2018-09-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det kan vara så att upplösningen blir för dålig med din givare. Om du kör orginalgivaren tillsammans med max9926, så kanske det funkar bättre... bara en tanke...

Författare:  Janson1 [ 06.23 2018-09-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag började med originalgivaren och just Maximkretsen men fick aldrig till någon vettig lucka i tandräkningen, detta finns avhandlat tidigare i tråden någonstans. Upplösningen som från början är 6 grader/tand ökar jag till långt inom en grad,(matematiskt) jag har möjlighet att dela varje tand i mer än 200 delar vid fullvarv (uS) Däremot så klarar inte Arduinon av uS vid startvarv för talen blir helt enkelt för stora så därför växlar jag om till mS vid start och lägsta varv, vid om jag minns rätt så vid ca 200 RPM så blir delningen i uS och är det sen hela tiden. Skall väl tilläggas att när man kör uS Micros() så är precisionen bara inom ca 10 us men detta ser jag som försumbart då spridaren har ca 400 uS fördröjning innan tillslag vid strömsättning, och vid startvarv spelar det ingen roll alls. Jag tror fortfarande den tappar tandluckan och räknar fel varje gång dubbelmassahjulet självsvänger, men detta skall mätas upp snart, i dag tror jag inte jag hinner...

Författare:  Bosen [ 11.23 2018-09-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Spontant känns det som om du har byggt upp koden lite fel om du inte kan köra på uS även under start. Tandluckan och varje tand borde ju behandlas var och en för sig.
Har du lust att visa koden för tandräkningen?

EDIT:
Kollade tillbaka i tråden och insåg att jag tidigare ifrågasatt att du inte körde vevaxelgivaren med interrupt.... Kör du fortfarande utan interrupt?

Författare:  Janson1 [ 16.15 2018-09-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, jag kör fortfarande utan interupt… I detta fallet tror jag inte interupt gör någon skillnad. Men som sagt, jag måste mäta lite innan jag är säker.

Författare:  Bosen [ 06.57 2018-09-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag är lite nyfiken på din pulsein-funktion för vevaxeln. Som jag förstår det så mäter den längden på tanden och jämför om den är längre eller kortare än den förra tanden. Det kräver ju först och främst att det inte finns någon form av smuts eller liknande på tandhjulet. Men jag tänker mig också att vid uppstart så varierar hastigheten hela tiden när startmotorn får jobba eftersom att alla cylindrar inte startar exakt samtidigt. Har du med det i beräkningen?

Författare:  Janson1 [ 02.30 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

bosen: Det stämmer, jag mäter längden på tanden och jämför med föregående, se längst ner i sketchen. För att göra den mer emun mot felräkning och utebliven detektering så har jag olika förprogrammerade "referenstider". Vid start väljer den tid1 som är den längsta tiden, den väljs via motorns durationsvärde för stunden. tid1 har jag på måfå provat med både mer och mindre än 2000 uS som är grundvärdet och det gör egentligen ingen skillnad alls... Själva tandhjulet sitter i vevhuset så där är i princip helt rent minus oljan. Vid startvarv så tänker jag mig att motorn går stötigt två gånger/varv, det är därför jag gjort referenstiden så pass lång. men utan att veta så tror jag att den extra svängmassan om den sitter fast i hjulet så blir kompressionsstötarna mindre men som den nu är fjäderupphängd via dubbelmassahjulet så blir kompressionsstötarna mycket mer markerade och dubbelmassan kanske tom. bromsar upp vevaxeln ännu mer för att sedan efter ödp putta iväg den igen desto mera. Men detta är bara min teori, vid nästa tillfälle skall detta mätas, jag har för övrigt beställt ett tvåkanaligt bärbart batterioscilloskop som jag helst vill få hem innan testen.

Författare:  Bosen [ 07.34 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag förstår inte riktigt varför du jämför med förra tanden. Vid startsessionen så borde du veta ungefär vilket varvtal du har och således så borde du veta hur lång tandluckan är. Då behöver du ju bara leta efter en puls som är en viss längd, helt oberoende av var förra tanden var.

Förstår jag det rätt att du gör massa beräkningar även vid start av denna motorn?
Jag kan inte svära på hur insprutning brukar fungera, men ett tändsystem brukar ha en helt fast tändkurva just vid start.

Författare:  svanted [ 08.17 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

är det en lång tandlucka och resten korta?
kan förstå om det ställer till problem om motorn går så hackigt inom ett varv att korta tandluckor blir lika långa som den långa?
det blir ju omöjligt att detektera vilken som är rätt.
mät, som du säger, och är det så måste du nog steloperera svänghjulet.

Författare:  Janson1 [ 11.48 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

bosen: Jag har fast insprutningsstart (sker vid tand ca 20) vid startvarv men för att veta att motorn är just på rätt ställe så måste man räkna tänderna dit och för att veta vilken tand som är vilken så måste man bestämma sig för vilken tand som är ett. Luckan är ett bra (det enda?) resetställe, hyfsat lätt att detektera bland alla tänder, i alla fall när motorn är startad och går. Just vid start så går motorn ganska olika fort beroende på batteri, temperatur och om den är på väg att tända eller ej. Jag kan se på scopet att pulserna från vevaxelgivaren åker isär och ihop lite som bälgen på ett dragspel... Annars bosen så förstår jag inte riktigt hur du menar.
Svanted: Det är ett tandhjul som från början har 60 tänder varav 2 tänder är borta per halvvarv, totalt sett är det 56 tänder kvar fördelade om 28, lucka 28 lucka osv...
Jag hoppas jag slipper steloperera.

Författare:  Bosen [ 12.14 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Men om jag inte missförstår så mäter du tandens längd, men egentligen borde du mäta längden på luckorna, men det kanske inte spelar någon roll...

Författare:  svanted [ 12.31 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

varför itne steloperation?
totala vikten på ditt dubbla svänghjul är betydligt högre än originalet så syftet kanske försvinner bara därför.
och vad gäller tandluckorna,
hur snabbt går startmotorn?
om ryckigheten hos svänghjulet ligger ovanför och under de 200rpm du säger är gränsen mellan uS och mS hos tandräknaren?
jag tror ju inte att hastigheten varierar med 100% så att en av de små 28 blir lika långa som de två som saknas.

kan du gör ett testprogram som bara matar ut tidsvärdena mellan tidsluckorna på konsollen då du kör startmotorn,
av de borde du kunna avgöra hur mycket rotationen varierar.
och se e.v. konstigheter.

Författare:  Janson1 [ 14.03 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

bosen: tand och lucka är samma förutom vid just luckan.
svanted: jag har väl tänkt i samma banor ang svänghjulets vikt, kanske skulle steloperera bara rakt av...
Jag har i dag 150 RPM som måste över för att insprutning skall ske överhuvudtaget. Jag laborerade med detta när jag hade en massa andra problem och jag har för mig startmotorn går med rund 180 RPM när batteriet är friskt.
Skiftet mellan mS och Us är 10000 uS och jag har själv skrivit varvtal <300 RPM, orkar inte kolla riktigheten men det ligger i det häradet.
Det är ytters enkelt att köra ut mduration via seriellen, men motorn går inte att köra samtidigt mer än yttersta lägsta varv då Serial.print() tar mycket tid, för mycket.

Författare:  Bosen [ 14.14 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

150 rpm låter ganska högt. Det är ju runt 1,5 varv per sekund. Många tändsystem anser att motorn är ”igång” över 2-300 rpm

Författare:  svanted [ 14.35 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Det är ytters enkelt att köra ut mduration via seriellen, men motorn går inte att köra samtidigt mer än yttersta lägsta varv då Serial.print() tar mycket tid, för mycket.

tänkte mera att bara skriva ut tidsluckorna då startmotorn drar runt utan att något annat görs...
de siffrorna är ju samma sak som att mäta med oscilloskop fast bättre då det skrivs ut, då förloppen kan vara svåra att fånga på ett oscilloskåp.
mha siffrorna kan man se om de ser så rena ut att inte ställa till med problem.

Författare:  Janson1 [ 20.13 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

bosen: Det är en diesel, den behöver högre startvarv för att få tillräckligt med kompressionsvärme.
svanted: Jag kan inte skriva ut från serielrutan men här är värdena:11310, 1804, 1808, 1825, 1829, 1841, 1889, 1938, 1966, 2060, 2131, 2229, 2332, 2499, 2750, 3252 3669, 3515, 3414, 3062, 2456, 2045, 1990, 1963, 1945, 1920, 1870, 1859, 1838, 11262. Detta är ett halv varv med startmotorn igång utan att ansluta elen till spridarna. Man kan se att när den är på väg att kompa så blir tiderna längre och längre, när den sedan når ÖDP (runt tand 22) så blir tiderna kortare igen och när luckan kommer blir det en jättemycket längre tid. Kör man den däremot på starten och den nästan vill gå igång men ändå inte startar då blir dom här tiderna lite random och den kan få för sig att den hittat luckan lite varstans. Jag anslöt oscilloskopet, kanal 1 på vevaxelgivaren och kanal 2 på den utnycklade pulsen som blir varje halvvarv precis när luckan är slut. Det gick att se på scopet att den utnycklade pulsen var flera tänder lång varje gång motorn tände till.
Som en första åtgärd så provade jag olika tider på tid1 och tid2 och även fasttid som den startar på till samma som tid1, detta gjorde väl egentligen ingen skillnad, det var ett par gånger den startade men mest inte. Till sist blev det en tillfällig steloperering av dubbelmassahjulet...
Bilaga:
20180918_191008.jpg


Och då försvann alla startproblem, det kvittar nästan vad man väljer som tid1 och tid2 och fasttid, den startar direkt ändå.
3300 us motsvarar 152 RPM. Skall väl ochså tilläggas att jag bara använder 8 av tiderna i min beräkning (1 lucktid och 7 tandtider) som sen divideras med 12 för att ge en medeltid, i detta fallet runt 1900 uS vilket bör bli runt 200 RPM.

Författare:  mrfrenzy [ 20.55 2018-09-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror problemet är att du bara håller reda på en tand.

Låt istället motorn gå ett halvt varv utan spänning till spridarna tills du hittat luckan.
Sen använder du en räknare som loopar vid 56.
Då vet du exakt var du är hela tiden oavsett hur fort motorn snurrar.
Du vet också exakt varvtal hela tiden eftersom du kan mäta tiden mellan tänderna och vet när tiden ska vara normal respektive dubbel.

Det går till och med att spara värdet i RAM vid avstängd tändning för att underlätta upprepade startförsök. Alla kommersiella ECU har ett tidrelä som behåller spänning på någon minut.

Författare:  svanted [ 05.48 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

ok, du mäter alltså flera tidsluckor för att skapa ett tröskelvärde som används för att detektera en lång tidslucka...?
när den kompar blir de ju bara lite längre...
man behöver kanske inte hålla reda på mer än två tidsluckor
om man jämför två efter varandra följande tidsluckor A och B,
när A är mindre än typ 1/5 av B är B en långtidslucka, om inte, lägger man A=B och mäter nästa som blir B,
skillnaden mellan två efterföljande korta luckor verkar inte bli mindre än 25%.

Författare:  Janson1 [ 05.49 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

mrfenzy: Först och främst är jag ju skyldig att ha rätt sketch och visa rätt förutsättningar för en seriös felsökningshjälp, så här kommer mitt senaste alster. Jag har numera bara 17 case dvs. jag kör "halvvarvsprincipen", har visat sig funka bäst.
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
    // Förändrad 2018-09-17 och inlagd 09/18, aktiv/inaktiv fungerar
    // utmärkt. 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.
   
   
            // 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 = 13;         // totaltid för case 16: x * motorns duration (13)
    const int tryckminskn = 60;       // turbotrycket ställs in här, högre tal = mindre tryck (60)
    const int lagstavarv = 500;       // tomgångsvarvet 500 uS motsvarar ca 800 Rpm (500)
    const byte hogstavarv = 120;      // fullgasvarvet 100 uS motsvarar ca 4200 RPM  (100)(160 = ca 2500 RPM)
    const byte aggrfaktorlag = 8;     // hur mycket spridar PWM skall öka vid belastning mellanvarv (8)
    const byte aggrfaktorhog = 20;    // hur mycket spridar PWM skall öka vid belastning högvarv (20)
    const int minfart = 3800;         // lägsta startvarv för spridarfunktion (3300 uS = 152 RPM)(3300)
    const byte startmangd = 9;        // avgör max startmäng 9 = 1,5 vevaxelpulser = 9 grader ontid (9)
    const float maxdeltalag = 5.0;    // max insprutningstid mellanvarv mdutation * 6.0 ger 3 vevaxelpulser = 18 gr ontid (9.0)
    const byte lagmangd = 4;          // max lågvarvsmängd 4 =  2 vevaxelpulser = 9 grader ontid (under tomgångsvarv)(4)
    const int tid1 = 2500;            // tid 1 är för att hitta pulsluckan vid start/lågvarv < 300 RPM (400)                           
    const int tid2 = 1500;            // tid 2 är för att hitta pulsluckan i mellanvarv 1100--> (1200)
    const int tid3 = 1000;            // tid 3 är för att hitta pulsluckan i alla andra förekommande varv 1100--> (300)
    const int tid4 = 100;             // tid 4 är för att hitta pulsluckan på högsta varvtal
    const byte turbostartregl = 150;  // när tubotrycket börjar avläsas och bli aktivt (150 = uS mduration ca 3200RPM)(150)
    const float senasteinspr = 7.0;   // senaste insprutningstid (vid tomgång)(7.0 = 3,5 vevaxelpulser = 21 grader delaytid
    const byte tidigasteinspr = 60;   // kortaste insprutningsfördröjning (vid maxvarv)(60=t19=24grFödp)(30=t20=18grFödp)
    const int sprtroghet = 400;       // ett grundvärde för spridarnas påslagsfördröjning i uS.                           
    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;     //20  // en ev tidigareläggning av spridare 4 om den avviker i startfördröjning (uS)                                 
   
   
    int vevpin = 2;                   // pulsingång vevaxelgivare, (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 18)
    long puls, priv, delta;           // senaste, föregående och delta (totalöppningstid) i uS(mS)
    float error;                      // error = varvfelet 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 51 (max 255)tänder, startar på 0
    int fasttid = 300;                // Fasttid = tid,tid2 eller tid3 beroende på varvtal, startar alltid på 300 uS
    byte analogval;                   // En switch/case till analogread
    int turbotryck;                   // turbotryck
    int battVolt = 400;               // mäter systemspänning till spridare
    int variabel1;                    // bra att ha variabel 1
    int variabel2;                    // bra att ha variabel 2
    int ambTemp = 300;                // mäter omgivningstemperaturen
    int atmtryck = 330;               // mäter atmosfärstrycket
    int sprstartkorr = 50;            // spridarstartkorregering i uS, spänningsberoende
    int sprtroghetklar;               // korrektion för den inbyggda påslagströgheten i spridarna
    int spridardiff = 0;              // en ev. individuell spridartid korrigering (uS)
   
    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)
   //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 17!
                                   
                                 
     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 (kamtand <= 250)              // 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
          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,50,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
           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
     break;
       
     case 9:            // 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
            }
     break;       
     
     case 10:          // 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;        // felet i uS mellan är och börvärde för motorns fart
     
     
     case 11:   // 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
               //       500      + (0 till 50) - (0 till 400)
     break;    //       500      +     0       -      50
     
    // case 12:
          // ledigt
   //  break;                         
   
     case 12:           // 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. ställs högst upp
       if (starttandf >= senasteinspr)         // om fördröjning över målvärdet, som vid tex startvarv (ställs in högst upp)
        {                 
         starttandf = senasteinspr;            // blir det målvärdet ändå
        }
     break;
 
     case 13:                     // 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 14:          // 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 15:         // (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 ;                        // används ej än så delta förblir delta oförändrat           
       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
     break;
     
     case 16:    // 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.
       }                                     // Detta paket används vid låga farter såsom start/lågvarv < 250 RPM
     
     else                                     // Eller om delay är mindre än 10000 uS. (> 300 RPM)
       {
        if (delta > 50)                       // Delta under 50 uS har inget värde
        {
        delta = delta + sprtroghetklar;       // Delta över 50 blir x delta + trögheten i spridaren (ca 250 uS)
        }
        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);  // 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 i on spridare 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.
       }                                      //Detta paket används vid varv (250 -> 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:                       // är mellan  tand 19 och 24
          switch (analogval)
      {
        case 0:   
           gas = analogRead(A0)>>2;           // analogingång för gasreglage 0 till 255( skiftad 2 gånger)
           turbotryck = analogRead(A4);
        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);            // skall vara 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);                             
 
        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)                        // 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)
       
        //Serial.println(priv);
       if (mduration >1800)                     // när motorn går på allra lägsta varv (start)
       {
        fasttid = tid1;                         // används tid1 (4000 uS i grundinställning)
       }
      if ((mduration > 1200)|| (mduration < 1800))
       {
        fasttid = tid2;
       }
       if ((mduration > 500)||(mduration < 1200)) // Om motorn går under 1100 RPM
        {
         fasttid = tid3;                        // används tid2 (1200 uS i grundinställning)
        }
       if (mduration <500)                      // Om motorn går över 1100 RPM
        {
          fasttid = tid4;                       // används tid3 (300 uS i grundinställning)
        }
       
        puls = pulseIn(vevpin, LOW, 30000);   // Ett färdigt kommando som väntar in nästa puls (tand = case).
                                              // vid stillastående motor blir det en timeout
                                              // efter 0,03 Sek
   //ex 1  if 12000 > 3000 + 2500    blir 12000 > 5500   sant
   // ex 2 if 12000 > 3000 + 8000 blir 12000 >  11000  sant               
      if  (puls > priv + fasttid)             // jämför om ny pulstid i uS är större än föregående + tid1 eller tid2.
       {
        digitalWrite (pulsutpin, HIGH);       // utpin blir hög när pulsluckan återgår till pulser
         
    tand = 0;         // resetar 0 till 28 räknaren som bara har hunnit räkna mellan 17, upp till 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
  {
    spridardiff = sprdiff4;                  // skall det individuella värdet för spridare 4 hämtas
  }

  if (pekare == 1)                           // om spridarpekaren pekar på 1
  {
    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;
  }

  if (pekare == 3)
  {
    spridardiff = sprdiff3;
  }



   // ex 1: 3000 < 12000 - 2500 blir    3000 <  9500   sant
   // ex 2: 3000 < 12000 - 8000 blir     3000 < 4000    sant     
       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()

Jag tror själv felet sitter allra längst ner i denna sketch "if (puls < priv -fasttid) digitalwrite = LOW." Där går det snett, den förblir hög i kanske 3-5 pulser för mycket innan den blir låg, den skall bli låg direkt efter att luckan är över och första tanden kommer. Jag funderar på att göra om "puls", "priv" från long till unsigned long, då kan det aldrig bli minustal vilket jag misstänker nu? Jag gjorde ett par räkneexempel här inne i koden men det ser faktiskt riktigt ut... Jag kan bara konstatera att det är här det går snett!!
Annars förstår jag nog inte riktigt vad du menar. Skulle du mrfenzy kunna gen en fördjupad förklaring?, dessutom till rätt kod!
Motorn går alltid ett halvt till två varv innan den börjar spruta in bränsle. Problemet uppstår precis när den skall till att starta, det blir en ordentlig skjuss precis när den tänder och det är då sista delen av koden gör fel, den går inte ur "if (puls > priv + fasttid) " och kommer således aldrig till "if (puls < priv - fasttid)" ...
edit: glömde ett ord: ner.

Författare:  Janson1 [ 05.54 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

svanted: Nu har jag lagt ut rätt sketch, men annars stämmer ditt resonemang. Egentligen är det bara två tidsluckor som jag håller reda på åt gången. Dom här 9 tidsluckorna är bara för att räkna ut är-varv och stör nog inte nåt annat. Jag känner jag har en flyktig idé om hur detta kan lösas, måste fånga den bara, eller få hjälp...

Författare:  mrfrenzy [ 08.00 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Felet är att du har vissa moment i loopen när inte pulserna från givaren övervakas. Så fort du gör beräkningar, analog read eller liknande och förflyttning sker fortare än du förutsett går det snett.

Detta beror på att du använder pulseIn som är en blockerande funktion. När den kör kan du inte göra nåt annat och därför kan den inte köras hela tiden.

Rätt metod är att använda ett interrupt, antingen ett timerinterrupt eller attachinterrupt.

Alternativ 1: Timerinterrupt
Du har en timer som snurrar i bakgrunden med hög noggrannhet
Din vanliga kod kör på som vanligt med beräkningar och states och events.
En gång per tidsenhet (exempelvis X µS) pausas din mainloop automatiskt och interruptet körs
I interruptkoden så kollas om ingången är hög eller låg.
Lite pseudokod:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. if (vevaxelpuls == low) //Vi befinner oss mellan två tänder, räkna upp räknaren
  2. {
  3.   counter++;
  4.   break;
  5. } else //Vi befinner oss vid en tand, kolla om detta är första gången eller om vi var här vid förra interruptet
  6. {
  7.   if (counter > 0) //Detta är första interruptet vid tanden
  8.   {
  9.     state++;
  10.     if (state == 26 || state == 58) //Vi är vid dubbelluckan så halvera tiden)
  11.     {
  12.       currentrpm = counter / (interrupttime * 2);
  13.       break;
  14.     }
  15.     else // Vi befinner oss vid en enkeltand
  16.     {
  17.       currentrpm = counter / interrupttime;
  18.       break;
  19.     }
  20.   } else //vi är kvar vid samma tand som förra gången
  21.   {
  22.     counter = 0;
  23.     break;
  24.   }
  25. }
  26.  

Är den låg så räknas ett värde upp med 1 och interruptet avslutas - din vanliga kod fortsätter
Är den hög och räknaren inte är 0 så används räknaren för att kalkylera hastigheten och spara i en variabel för hastighet, sedan nollas räknaren och interruptet avslutas - din vanliga kod fortsätter

På detta sättet har du alltid i din mainloop tillgång till ett pålitligt värde på state och currentrpm och du behöver aldrig hålla på och ändra räknesätt eller slösa tid på att sitta och vänta på en tand.
Se exempel 1 här: https://www.instructables.com/id/Arduin ... nterrupts/

Alternativ 2 har jag ingen pseudokod för men det fungerar omvänt. Istället för att det körs med bestämt tidsintervall så körs det varje gång ingången ändras från låg till hög. Sedan kollar man i interruptet hur lång tid som förflutit sedan förra gången. https://www.arduino.cc/reference/en/lan ... interrupt/

Samma sak gäller dina analogreads. Du startar en läsning i bakgrunden och fortsätter med din kod. Sedan när läsningen är klar triggas ett interrupt som hämtar värdet och sparar i lämplig variabel http://www.glennsweeney.com/tutorials/i ... atmega328p

Författare:  Bosen [ 09.13 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Om man kör alternativ 2 och kollar pulserna via interrupt så är nog interrupt på analogRead överflödig.

Författare:  Janson1 [ 11.32 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Den här pulsIn() har inga som helst problem med att hänga med på låga varv, jag har stresskört och runt 6000-6500 RPM börjar den krokna. I dag kör jag ju alla analogread på slutet efter det att insprutningen är klar och det inte har någon betydelse om en eller flera tänder missas då det blir en långlucka förr eller senare som resetar tandräknaren. Jag får ta mig en funderare om fortsättningen då jag tror jag inte riktigt fattar, än i alla fall...

Författare:  mrfrenzy [ 12.00 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Citera:
det blir en långlucka förr eller senare

Problemet är att vid ostabilt varvtal exempelvis start, misständning osv är det omöjligt att avgöra vad som är lång respektive kort lucka.

Med "min" metod så spelar varvtalets fluktuationer ingen roll då du alltid räknar alla tänder.

Hela programflödet blir mycket enklare att hantera när man sköter räkningen separat och kontinuerligt.

Författare:  svanted [ 15.57 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Citera:
Problemet är att vid ostabilt varvtal exempelvis start, misständning osv är det omöjligt att avgöra vad som är lång respektive kort lucka.

jag tror det,
om man alltid jämför två intilliggande luckor så hinner inte varvtalet variera så mycket att en kort blir 5 - 6 ggr längre.
siffrorna ovan
11310, 1804
för lång resp kort
det är mer än 6 ggr?
vilket är konstigt, det borde inte vara mer än 5 men det kan ha att göra med att koden för mätning tar lite tid från båda värdena vilket ökar differensen.
största skillnaden mellan två intilliggande korta är under 10%.
man kan tycka att "luckdetektorn" alltid ska vara aktiv, för om den av någon anledning tappar en lucka? hur det skulle kunna hända, kan man diskutera, glapp i elsystemet kanske?
går motorn skit då allt flyttas 6°,
tills man startar om den.

Författare:  mrfrenzy [ 17.32 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Min pseudokod är bara en startpunkt för att visa hur det funkar. Den behöver kompletteras med två saker:

Initieringsrutin:
Vid första tändning på är alltid sync = false
Så länge sync = false aktiveras inte spridarna, och istället för interruptet ovan körs en specialfunktion som räknar långa och korta luckor samt jämför med kamaxelgivaren.
När startpositionen hittats sätts sync = true. Då börjar "drftinterruptet" köra och spridarna aktiveras.

Korrigeringsrutin:
Om RPM ändras mer än 80% mellan två taggar så sätts sync = false och state = 0.
Spridarna stängs då av ett halvvarv tills det hela har synkroniserats igen.
Samtidigt loggas en felkod.

Överkurs för hög driftsäkerhet: fortsätt köra på endast kamaxelgivare.

Författare:  Janson1 [ 20.26 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det ända jag kan svara på exakt är att luckan är 5 gånger längre än en vanlig liten lucka mellan två tänder. Resten behöver jag nog klura på ett tag för att fatta... Så: Pass så länge.

Författare:  Janson1 [ 20.40 2018-09-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag kollade lite nu och gjorde en del räkneexempel och får ibland minustal på long nästan längst ner i sketchen
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  // if (10000 > 2000 + 2500 ) blir 10000 > 4500 SANT
     // if (2000 > 10000 + 2500)  blir  2000 > 12500 FALSKT             
      if  (puls > priv + fasttid)             // jämför om ny pulstid i uS är större än föregående + tid1 eller tid2.
       {
        digitalWrite (pulsutpin, HIGH);       // utpin blir hög när pulsluckan återgår till pulser


Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
// if (10000 < 2000 - 2500 ) blir 10000 < -500 FALSKT <<<<<<-------KOLLA
     // if (2000 < 10000 - 2500)  blir  2000 < 7500 SANT 
       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.
         } 

Kan det störa detekteringen?

Författare:  Janson1 [ 05.56 2018-09-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag ser antydan till inbyggda tankevurpor i våra tankesätt,(i alla fall i mitt), jag är väldigt inkörd i "mitt" tankesätt att tänka och lösa ett problem på. Jag har ju labbat fram denna kod under i princip ett och ett halvt år med mycket trail&error tills det till slut funkar i alla lägen, så kommer det ett nytt läge, ett dubbelmassahjul som ställer till det och i min värld så vill jag ju hitta en förbättring bara på ett specifikt ställe (jag TROR jag vet vilket?). När jag ber om hjälp så får jag verkligen hjälp men samtidigt så blir ju hjälpen efter er andras sätt att tänka och programmera, ibland inte ens i samma språk. Det är nog lika svårt för er att sätta er in i min kod som för mig att sätta mig in i eran kod. Så därför kan jag inte tillgodose mig av ett helt nytt sätt att se på problemet och ett helt annat sätt att programmera på. Jag ser ju att ni andra har kommit milsvidd längre i eran programmering än vad jag gjort samtidigt som jag ser mer motorns funktion fel och brister, jag är nog en mekanik-människa först och främst. Så med andra ord, fortsätt och hjälp mig men ge mig inte för svåra grejer med för mycket nytänk. Jag tror inte jag kan ta till mig det mer än med lång tids labbande för att själv få förståelsen...
Obs: Nu skall detta inte tas som något slags påhopp, jag bara inte förstår alla gånger.
mrfrenzy: Jag har kollat in ditt alster och jag tror jag förstår lite men att bara inplantera detta går nog inte sådär direkt, det kräver kanske ett helt nytt program.

Författare:  mrfrenzy [ 07.18 2018-09-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson: Jag försöker absolut inte klanka ner på ditt sätt att programmera vilket jag är glad att du ser. Det är mycket imponerande att du kommit så långt och att motorn fungerar såpass bra som den gör.

Eftersom du inte använder interrupt och timers så utnyttjar du bara en tiondel av processorns kapacitet, särskilt eftersom du utför en uppgift som skulle haft mycket stor nytta av detta.
Det sätt som du programmerat på nu är enda sättet att lösa det på om man hade haft en jättegammal processor som saknar interrupt. Om processorn är tillräckligt snabb och programmeraren har tillräckligt tålamod så går det att lösa på det sättet men det blir mycket krångligare.
Förutsatt att din processor är tillräckligt snabb så kanske det går med hjälp av tipsen som svanted gav, isåfall skulle man nog börja med att koppla upp ett oscilloskop och logga detta parallellt med utskriften av tidmätningen som processorn gör. Då finns det en chans att analysera vad som går fel och skriva en workaround. Detta känns för mig som "att gå över ån efter vatten" varför jag hellre skulle gjort om det hela med interrupt.

Jag tror inte att hela programmet behöver skrivas om, även om det i slutändan skulle bli effektivare efter det. Förmodligen räcker det med att göra om pulsmätningen och synkningen så fungerar det som tidigare men stabilare, sedan kan man förenkla efterhand.

För att komma igång när du läst lite så är det nog bäst att bygga några enkla exempel "blinka en led", "cykeldator" osv. (cykeldatorexemplet körs lämpligen med din vevaxelgivare som input)
Sen är jag övertygad över att du kommer klara att implementera det med motorn.
Här är en video som förklarar koncepten väldigt bra med liknelser mot verkliga livet: https://www.youtube.com/watch?v=QtyOiTw0oQc

Författare:  Bosen [ 09.05 2018-09-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har satt ihop ett litet exempel som jag tror borde funka. Jag måste påpeka att även jag är nybörjare på arduino så kodningen är säkert inte så snygg. Jag vet också att man skall försöka hålla ner koden i interrupten så mycket som det går, och det kanske jag inte har gjort här, men jag tror inte det ska vara någon fara eftersom det är såpass lång tid mellan varje puls.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. const int vevpin = 3;
  2.  
  3. int  tand = 0;  //Samma variabel som din egen. Räknar vilken tand du är på. startar vid en lång tandlucka
  4. long VEVTAND_langd = 0;  //Längden på luckan mellan tänderna
  5. long VEVTAND_start = 0;  //Starttiden för mätning mellan tänder
  6. long VEVTAND_1 = 0;  //används för att skapa en "referenstid" att jämföra tänder med
  7. long VEVTAND_2 = 0;  //används för att skapa en "referenstid" att jämföra tänder med
  8. long VEVTAND_referens = 0;  //referenstid skapad av de 2 föregående variablerna
  9. bool luckan_hittad = false;  //sätts till true när luckan är hittad. sätts aldrig till false igen i detta exemplet, men kanske man behöver göra.
  10.  
  11. int RPM = 0;  //Motorns varvtal
  12. long RPM_time; //En variabel för att mäta tiden för ett halvt varv.
  13.  
  14. void setup(){
  15.   pinMode(vevpin, INPUT_PULLUP);
  16.   attachInterrupt(digitalPinToInterrupt(vevpin), VEV_pulse, RISING);
  17. }
  18.  
  19. void loop(){
  20.  
  21.   //Här hamnar din egen kod
  22.  
  23. }
  24.  
  25.  
  26. //Varje gång det blir en puls på vevpin så hamnar man här
  27. void VEV_pulse(){
  28.   VEVTAND_langd = micros()-VEVTAND_start; //Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  29.   VEVTAND_start = micros();  //Börja mätning av lucka
  30.  
  31.   tand++;
  32.  
  33.   if( tand = 2 ){
  34.     VEVTAND_1 = VEVTAND_langd; //lagrar en lucklängd för bas till referenslucka
  35.   } else if( tand = 3 ){
  36.     VEVTAND_2 = VEVTAND_langd; //lagrar en lucklängd till för bas till referenslucka
  37.     if( VEVTAND_1 >  VEVTAND_2 * 3 or VEVTAND_2 > VEVTAND_1 * 2 ){
  38.       tand=0; //Är skillnaden för stor mellan VEVTAND_1 och VEVTAND_2 så börjar vi om på noll
  39.               //Detta kan ju bero på ett fel i läsningen eller att man påträffar luckan redan i de första pulserna
  40.     } else {
  41.       VEVTAND_referens = VEVTAND_1 + VEVTAND_2 / 2;  //Skapar en referenstand av VEVTAND_1 och VEVTAND_2
  42.     }  
  43.   } else {
  44.     if( VEVTAND_langd > VEVTAND_referens * 4){ //om luckan är mer än 3 gånger större än referenstanden så kan vi anta att vi har hittat luckan
  45.       luckan_hittad = true; //sätt flagga att luckan är hittad
  46.       tand = 1;  //Börja att räkna tänder igen. första tanden är redan hittad så vi börjar på 1
  47.       RPM_time = millis();
  48.       RPM = 60000 / (millis() - RPM_time * 2); //Hoppas jag har räknat rätt här 60000 delat med millis per varv borde bli RPM
  49.     }
  50.   }    
  51. }


koden ger dig följande variabler:
tandluckan_hittad = sätts till TRUE när luckan är hittad
tand = räknar varje tand efter tandlucka, nollställs vid nästa tandlucka
RPM = varvtalet, baserat på två pulser per varv (jag har uppfattat det som att det är 2 tandluckor per varv. Har jag missuppfattat?)

Koden börjar med att mäta två tänder efter varandra och använder dessa två som referens för att hitta den "långa luckan".
När luckan är hittad så sätts luckan_hittad till true och räknaren nollställs. Två nya tänder används som referens och räknaren räknar till nästa "långa lucka" där den nollställs igen.

EDIT:
Om man nu vill fortsätta med denna koden så undrar jag lite hur kamaxelgivaren ser ut? hur många pulser per varv?

Författare:  Bosen [ 16.32 2018-09-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

På sidan https://www.slideshare.net/shark79/19-vw-tdi-with-pumpe-duse så hittade jag denna infon om pulserna från kamaxeln och satte ihop ett exempel på interrupt där med:
Bilaga:
G40.png

Kod: [Expandera/Minimera] [Hämta] (exempel_kamaxel_interrupt.txt)
  1. const int kampin = 2;
  2. const int cylinderArray[]={2,1,1,3,3,4,4};
  3. long CAM_pulses[5];
  4. long CAM_pulse;
  5. long CAM_pulse_time;
  6. int  CAM_pulse_count;
  7. int  secondCylinder = 0;
  8. int  current_cylinder;
  9.  
  10. void setup() {
  11.   pinMode(kampin, INPUT_PULLUP);
  12.   attachInterrupt(digitalPinToInterrupt(kampin), camshaft_pulse, RISING);
  13.  
  14. }
  15.  
  16. void loop() {
  17.  
  18.   //Här hamnar din egen kod
  19.  
  20. }
  21.  
  22. //Varje gång det blir en puls på kampin så hamnar man här
  23. void camshaft_pulse(){
  24.   CAM_pulse=millis()-CAM_pulse_time; //Tid sedan förra pulsen
  25.   CAM_pulse_time=millis();  //starta tidmätning
  26.   CAM_pulse_count++;  //öka på räknaren
  27.  
  28.   if(CAM_pulse_count >= 2 and CAM_pulse_count <= 7){  // Mät längden mellan 5 pulser. Den pulsen som är längst är cylinder 2
  29.     CAM_pulses[CAM_pulse_count-2];   //Lägg till de 5 pulserna i en array
  30.   }
  31.  
  32.   if(CAM_pulse_count==7){  // När man har mätt den 5:e pulsen så hamnar man här.
  33.     for (int i=0; i <= 5; i++){
  34.       if(CAM_pulses[i] > CAM_pulses[secondCylinder]){  //Kolla om pulslängden vi mäter är längre än den längsta som är mätt
  35.         secondCylinder=CAM_pulses[i];  //Om pulslängden är längre så tror vi nu att detta är cylinder 2
  36.       }
  37.     }
  38.     //Vi har nu hittat cylinder 2, vilket är den längsta tiden. Efter Cylinder 2 så är varannan puls en ny cylinder tills vi stöter på cylinder 2 igen.
  39.     //Vi väljer nu att CAM_pulse_count skall vara 10 på cylinder 2. Om cylinder 2 är på secondCylinder[0] så måste lägga på 5 pulser till
  40.     //CAM_pulse_count=14 för att få CAM_pulse_count=10 som cylinder 2 t.ex.
  41.     CAM_pulse_count = 15 - secondCylinder;
  42.   }  
  43.  
  44.   if(CAM_pulse_count >=10){
  45.     current_cylinder=cylinderArray[CAM_pulse_count-10]; //Sätt currentCylinder till den cylindern det är just nu.
  46.     if(CAM_pulse_count==17){
  47.       CAM_pulse_count=9;  //Om vi har kommit upp till 17 pulser så börjar vi om och sätter cylinder 2 vid 10 igen.          
  48.     }
  49.   }
  50. }    
  51.  
  52.  
  53.  


Jag får det till att om man mäter tiden mellan 6 pulser (5 tider) så är den längsta tiden cylinder 2.
Efter att man har hittat cylinder 2 så slutar man helt enkelt kontrollera om det är rätt cylinder. Givetvis är detta dumt, så man borde väl kontrollera då och då att man verkligen är på den längsta pulstiden, alltså cylinder 2. Men det ger iallafall en hint om hur jag hade gjort...
variabeln du får ut av denna koden är current_cylinder som sätts till den cylindern den är på just nu.

koden är inte testad på något sätt, så jag kan absolut ha gjort någon form av beräkningsfel.

Författare:  Janson1 [ 05.32 2018-09-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tackar för erat engagemang och jag tror jag kommer att fatta faktiskt även om det är en bit kvar.
Bosen: En liten brasklapp, jag har filat bort alla tänder utom en på kamaxeln så dess givare detekterar bara 4:ans tand en gång vart annat motorvarv. Denna lösning kommer jag nog behålla både hård och mjukvarumässigt då den fungerar klanderfritt.
Men nu när denna motor hamnar i traktorn kanske det är läge att leta upp en till som programmeringsobjekt och på den behålla kamaxeltänderna som dom är. Jag har en annan idé, denna motor finns i helaluminium och då är den 5 cykindrig, i det fallet kommer mitt sätt att programmera ECU:n på inte att fungera. Då blir det ett delvis nytt projekt där man skulle prova ut en annan typ av tandräkning och använda interrupt på rätt sätt. Nu är jag på HV-övning och har ingen tid över för fördjupning i programmering men återkommer när jag landat igen.
mrfenzy: Jag skall senare när jag är hemkommen prova din kod i min artificiella motor och se vad som kommer ut...

Författare:  Janson1 [ 21.31 2018-09-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En kanske dum fråga, kan man ha två interrupt? Om man nu har två, vilket är först, går det att ange? Eller är lägsta eller högsta ingångssiffra först? Mao, vad gäller?

Författare:  mrfrenzy [ 21.36 2018-09-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Man kan ha många interrupt med olika prioritet.
När väl ett triggas så körs det färdigt, sedan när det är klart så tas nästa interrupt med högst prioritet om det är en eller flera andra som triggats. Annars återgår det till mainloopen.

En ISR ska inte ta mer än 10 µs att köra färdigt och på den tiden hinner inte någon tand passera givaren så det är inget problem i detta fall.

Här finns en väldigt bra men också väldigt lång FAQ http://www.gammon.com.au/interrupts

Författare:  Bosen [ 22.36 2018-09-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Skitbra FAQ!!! :tumupp:

Jag blev påmind av att i mina två exempel så har jag glömt volatile på mina variabler....

Författare:  Janson1 [ 20.10 2018-09-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nåt större programmeringsjobb är inte gjort, bara lösa tankegångar då och då. I dag kom det ett litet oscilloskop med betoning på litet. Det är bara 1 MHz bandbredd men det har två kanaler, ett måste för mig när jag mäter på ECU:n ute i garaget. Det är fullspäckat med finesser och funktioner men faktiskt ganska lättanvänt ändå tack vare två roterande switchar med tryckfunktion.
Bilaga:
20180927_191154.jpg

Författare:  Bosen [ 20.21 2018-09-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ska bli roligt att höra va du tycker om det... har nämligen funderat på att köpa ett likadant :D

Författare:  Janson1 [ 06.18 2018-09-30 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu kommer det bli lite mer jordnära grejer ett tag framåt... Motorn skall dockas fast i traktorn via en adapterplatta, För att kopplingen skall hamna lika så behövs det 14 mm tjocklek på själva adapterplattan, det får bli en 10 mm och en 4 mm som jag nu börjar med att passa in, när den passar är det bara att ritsa av den på den tjocka och sen med hjälp av borrmaskin och plasmaskäraren få till den tjocka plattan också. Nån bild lär väl komma på detta också.
Här är en bild från i går då bromseriet fick nytt liv.
Bilaga:
20180929_195427.jpg

Författare:  Janson1 [ 20.32 2018-09-30 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I dag kom motor och växellåda ihop och det mesta verkar funka så långt.
Bilaga:
20180930_100013.jpg

Författare:  baron3d [ 21.13 2018-09-30 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det blir ju bra. :tumupp: :tumupp: :tumupp:

Författare:  Janson1 [ 21.00 2018-10-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu är motorn på plats men framvagnsstagen och styrstagen tar i oljekylet på vänster sida och turbon på höger sida. Nåt behöver fixas där...
Bilaga:
20181001_172949.jpg


Nu har jag haft möjlighet att testa det lilla minsta oscilloscopet och det fungerar bra, om man kör på "djup " 1 kilo istället för 4 kilo så uppdaterar det mycket fortare och det blir mer rörligt/levande och till det jag skall mäta så passar det mig bra. Det följer med en x1 prob och en förenklad prob med bara två små klämmor för plus/minus. Jag saknar nog lite en x10 prob, själva oscilloskopet har meny för x1/x10 dämpfaktor och tar hänsyn till visningsresultatet. Den har även en signalgeneratorutgång där man kan ställa frekvens, vågform och pulsbredd, kan väl vara användbart nån gång... Trots att den är mindre än en mobiltelefon så syns det bra i displayen, både vågformer och text. Får försöka att skaffa en lämplig väska för den med allt som behövs i tillbehör. Visningsmässigt så ersätter den nästen ett stort scope men användarvänligt är det en bit kvar, den har bara två vred som man rattar mellan menyerna och sen trycker kort eller långt beroende på vad man vill, att hitta rätt är svårare än med ett stationärt dito där varje grundfunktion har en egen knapp/ratt. För en dryg tusenlapp så är jag helnöjd så här långt. Max insignal är +-40 volt, men x10 prob så blir +- 400 volt, så för 230 volt skulle det funka om man nu vill ha det i scopet?

Författare:  Magnus_K [ 22.59 2018-10-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Fasen vad häftigt det här är :tumupp:
Hejja hejja Janson1!

Författare:  Janson1 [ 06.17 2018-10-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag är på jakt efter en båge, helst en hytt som passar grålle, ja egentligen finns det nog inga hytter byggda som passar just urGrållen?
Men hör av dig om du har eller vet om en båge/hytt.

Författare:  verkstaden [ 21.23 2018-10-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Har du kollat med Brånstorps traktordemontering utanför Eksjö?

Författare:  Janson1 [ 06.18 2018-10-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kanske, kanske hittat en båge i grannbyn... Men tack i alla fall.

Författare:  Janson1 [ 19.01 2018-10-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Båge hittad och monterad (delvis, främre vänster sida saknas än så länge) Tanken är modifierad (med en slägga) så den passar numera bra. Huven är monterad provisoriskt och det är kollat så bågen inte tar emot när man skall öppna huven för tex tankning.
Bilder ja, varför kommer dom 90 grader fel? Finns de ingen funktion för detta?
Bilaga:
20181009_200703.jpg

Författare:  Janson1 [ 21.01 2018-10-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag gick i valet/kvalet om ag skulle byta olja i växellådan/bakaxeln. I förra veckan bestämde jag mig och hällde ur den och jösses vad vatten och skit det kom ut... Jag misstänkte att hydraulen inte funkade så jag passade på att ta ner pumpenheten när ändå oljan var avtappad. Pump och ventilpaket är sammanbyggt, själva pumpen drivs av kraftuttagsaxeln och ventilen styrs dels av höj/sänkreglaget och dels av ett automatiskt tryckstångsreglerat system som hjälper föraren vid tex plöjning att hålla exakt djup. I dag tog jag isär hela pump-paketet och gjorde rent och fixade, den behöver en ny reglerventil så den är beställd (148 kr + moms), annars var allt i hyfsat skick. En grej, jag hittade en kugge i den bakersta oljepluggen (under bakaxeln), det såg ut som den legat där åtskilliga år men den är alldeles för liten för att komma från bakaxeln, växellådan har mer den storleken på dreven men kunde inte se nåt drev som haltade eller lät konstigt. Detta kan ju vara en rest från en reparation för länge sedan? Bilder finns men jag kan inte vända dom rätt så allt blir fel.

Författare:  Janson1 [ 08.09 2018-11-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har fått hem reservdelen till hydraulen och fått ihop det, hällt på 20 liter olja. I går gjorde jag en gaspot, se bild
Bilaga:
20181101_102119.jpg


Jag har även hunnit få till den på traktorn och fått dit elektroniken i en gammal väska av nån polymerplast som verkar passa ganska väl. Jag är inte riktigt nöjd men hittar inget bättre just nu...
Bilaga:
20181029_213500.jpg


Efter detta så är grejerna monterade och ett elsystem börjar växa fram.

edit, det har kommit med en PDF-fil av misstag som jag inte kan ta bort för jag kan inte se den i "ändra" men det är bara ett kalibreringsprotokoll... nu kanske borta?

Författare:  Janson1 [ 09.43 2018-11-13 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Detta har hänt sedan sist. Jag har nu fått igång traktorn men dubbelmassasvänghjulet gör (förutom svårstartad) att traktorn småhoppar fram på back, 1: och 2:an så jag har beslutat mig för att antingen steloperera eller byta till ett massivt hjul. Nu är traktorn delad på igen för bla helsvetsning och målning. Min tandgivare har ju 28_2_28_2 drev osv men dom nya tandgivarna har 60_2 drev per varv istället och jag har fått tag på en sådan platta/givare så jag kommer att montera denna bakom svänghjulet parallellt med den gamla och när jag är nöjd med min från början programmering så kommer jag nog att göra ett nytt program för den nya givaren...

Författare:  Janson1 [ 20.51 2018-11-13 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det "nya" tandgivaren/drevet kom hem i dag men jag måste bygga om motorblocket för att få det att passa så jag väntar till nästa tillfälle. Nu i dag så blev svänghjulet steloperarat med svetsen och traktorn ihopsatt igen i ett stycke ståendes på egna hjul. I morgon (om jag hinner) skall jag försöka få till resten, typ bränsletank, kyl, div elkopplingar sen göra ett startförsök...

Författare:  Janson1 [ 19.15 2018-11-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Traktorn hopmonterad och provkörd. Som SEF:are så läser jag även andra inlägg mm. Och ang Arduino så kan man läsa både plus och minus om både hårdvaran och mjukvaran, mest minus på mjukvaran faktiskt... Det jag funderar på är om den är tillräckligt "tidsföljande" dvs. tar samma sak alltid samma tid eller har den nåt fuffens för sig då och då? Anledningen till att jag undrar är för att motorn går periodvis bra men andra perioder så går den dåligt, kan helt plötsligt börja ryka svart vid gaspådrag (tyder på för långa spridartider) och gå väldigt illa, det kan ta ett par sekunder för motorn att hämta sig efter detta. Jag har helt enkelt svårt för att avgöra om det är hårdvaran (motorns insprutningssystem) eller mjukvaran i Arduinon. Jag har kört denna sketch ganska länge på kammaren i dom flesta enskilda varvtal, enskilda "belastningar" (pulsbredder) fram och tillbaka och jag kan inte finna nåt anmärkningsvärt gitter/störningar/fel pulsbredd på nån spridare vid enstaka tillfällen eller dylikt. Kort sagt så gör den det den ska, dvs det som jag programmerat den till. Sen så kommer det alltid "fenomen" lite då och då som beror på av mig felprogrammering/dålig programmering. (jag är komplett nybörjare) Ang gitter vilket jag tolkar som lite labil i tiderna som det tar att göra en viss sak har jag blivit varnad för förut på denna tråd, att det skulle skilja så mycket som +-40 grader på vevaxeln... Jag har lagt in "tidsmarkörer" som ger en uS -tid varje varv som jag sen har kört väldigt länge vid olika tillfällen och sen kollat tillbaka på utskrifterna (serialmonitorn) Vissa saker tar tex 12-15 uS per varv varje gång, jag kan se nån antydan till uppåt 20 uS nån enstaka gång. ( totalt under 10 uS fel mellan varje gång) Men min motor börjar förmodligen klaga när tiderna övergår 50 till 80 uS fel och det har jag aldrig mätt upp totalt tidsfel till någon gång. Så min fråga till er: Kan jag fortsätta att programmera i Arduinokod? Jag hoppas på ett ja då det är en ganska stort steg till nästa. Men måste man så måste man...

Författare:  Klas-Kenny [ 19.39 2018-11-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror absolut att det hela är fullt lösbart i Arduino-kod.

Men, nu har jag inte kollat i din kod på länge, men förut har du ju inte kört någonting interrupt-drivet. Där tror jag att man har mycket att tjäna, på att skriva om de tidskritiska delarna i programmet.

Författare:  Janson1 [ 19.58 2018-11-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Senaste koden...
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
    // Förändrad 2018-11-16 och  inlaggd  11/17, aktiv/inaktiv fungerar
    // utmärkt. 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å 5 volt är tomgång och 0 volt fullfart Fungerar
    // ändrad till att bara läsa av tand 9. Skall provas
    // ändrad till max 2500 rpm om varvpin sätts låg. Skall provas
   
            // 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 = 13;         // totaltid för case 16: x * motorns duration (13)
    const int tryckminskn = 60;       // turbotrycket ställs in här, högre tal = mindre tryck (60)
    const int lagstavarv = 500;       // tomgångsvarvet 500 uS motsvarar ca 800 Rpm (500)
    byte hogstavarv = 100;            // fullgasvarvet 100 uS motsvarar ca 4200 RPM  (100)(160 = ca 2500 RPM)
    const byte aggrfaktorlag = 8;     // hur mycket spridar PWM skall öka vid belastning mellanvarv (8)
    const byte aggrfaktorhog = 20;    // hur mycket spridar PWM skall öka vid belastning högvarv (20)
    const int minfart = 3800;         // lägsta startvarv för spridarfunktion (3300 uS = 152 RPM)(3300)3800 nu
    const byte startmangd = 9;        // avgör max startmäng 9 = 1,5 vevaxelpulser = 9 grader ontid (9)
    const float maxdeltalag = 9.0;    // max insprutningstid mellanvarv mdutation * 6.0 ger 3 vevaxelpulser = 18 gr ontid (9.0)
    const byte lagmangd = 4;          // max lågvarvsmängd 4 =  2 vevaxelpulser = 9 grader ontid (under tomgångsvarv)(4)
    const int tid1 = 2500;            // tid 1 är för att hitta pulsluckan vid start/lågvarv < 300 RPM (400)                           
    const int tid2 = 1500;            // tid 2 är för att hitta pulsluckan i mellanvarv 1100--> (1200)
    const int tid3 = 1000;            // tid 3 är för att hitta pulsluckan i alla andra förekommande varv 1100--> (300)
    const int tid4 = 100;             // tid 4 är för att hitta pulsluckan på högsta varvtal
    const byte turbostartregl = 150;  // när tubotrycket börjar avläsas och bli aktivt (150 = uS mduration ca 3200RPM)(150)
    const float senasteinspr = 7.0;   // senaste insprutningstid (vid tomgång)(7.0 = 3,5 vevaxelpulser = 21 grader delaytid
    const byte tidigasteinspr = 60;   // kortaste insprutningsfördröjning (vid maxvarv)(60=t19=24grFödp)(30=t20=18grFödp)
    const int sprtroghet = 400;       // ett grundvärde för spridarnas påslagsfördröjning i uS.                           
    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;     //20  // 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)
    const int tandlasning = 3000;      // vid vilken tid på puls som läsning skall ändras mellan 1 tand = start och = /12 vid drift
   
    int vevpin = 2;                   // pulsingång vevaxelgivare, (aktivt hög).
    int kampin = 3;                   // kamaxelgivarens ingång, (aktivt låg).
    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)(inne i case 18)
    long puls, priv, delta;           // senaste, föregående och delta (totalöppningstid) i uS(mS)
    float error;                      // error = varvfelet 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 51 (max 255)tänder, startar på 0
    int fasttid = 300;                // Fasttid = tid,tid2 eller tid3 beroende på varvtal, startar alltid på 300 uS
    byte analogval;                   // En switch/case till analogread
    int turbotryck;                   // turbotryck
    int battVolt = 400;               // mäter systemspänning till spridare
    int variabel1;                    // bra att ha variabel 1
    int variabel2;                    // bra att ha variabel 2
    int ambTemp = 300;                // mäter omgivningstemperaturen
    int atmtryck = 330;               // mäter atmosfärstrycket
    int sprstartkorr = 50;            // spridarstartkorregering i uS, spänningsberoende
    int sprtroghetklar;               // korrektion för den inbyggda påslagströgheten i spridarna
    int spridardiff;                  // en ev. individuell spridartid korrigering (uS)
   

   
    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 17!
                                   
                                 
     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 4200 Rpm
     }
             
 
       
      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
          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,150,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
           bduration =map(gas,255, 0, lagstavarv, hogstavarv); // ställs in högst upp
           delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
     break;
       
     case 9:            // Detta case ger motorns verkliga fart baserat på dom 9 första tänderna eller bara tand 8
          if (priv <= tandlasning)    // Här väljs om man skall räkna på en tand vid start eller alla räknetänder/12
          {
           mduration = delvalue/12;   // Motorns totala pulstid i mikrosek dividerat med 12 ger motorns duration vid drift
          }

          else
          {
           mduration = priv;         // motorns pulstid i case 8 vid start får gälla för hela halvvarvet.
          }
     break;       
     
     case 10:          // 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;        // felet i uS mellan är och börvärde för motorns fart
     
     
     case 11:   // 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
               //       500      + (0 till 50) - (0 till 400)
     break;    //       500      +     0       -      50
                       
   
     case 12:           // 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. ställs högst upp
       if (starttandf >= senasteinspr)         // om fördröjning över målvärdet, som vid tex startvarv (ställs in högst upp)
        {                 
         starttandf = senasteinspr;            // blir det målvärdet ändå
        }
     break;
     
 
     case 13:                     // 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 14:          // 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 15:         // (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 ;                        // används ej än så delta förblir delta oförändrat           
       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
     break;
     
     
     case 16:    // 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.

                       // 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)
        {                         
         delta = 0;               // och delta(insprutningstid)resetas
        }
                // och startmängden vid motorstart
       if ((delta * 4)>= 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.
       }                                     // Detta paket används vid låga farter såsom start/lågvarv < 250 RPM
     
     else                                     // Eller om delay är mindre än 10000 uS. (> 300 RPM)
        {
        if (delta > 50)                       // Delta under 50 uS har inget värde
        {
        delta = delta + sprtroghetklar;       // Delta över 50 blir x delta + trögheten i spridaren (ca 250-500 uS)
        }
        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);  // 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 i on spridare 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.
       }                                      //Detta paket används vid varv (250 -> 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:                       // är mellan  tand 19 och 24
          switch (analogval)
      {
        case 0:   
           gas = analogRead(A0)>>2;           // analogingång för gasreglage 0 till 255( skiftad 2 gånger)
           turbotryck = analogRead(A4);
        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);            // skall vara 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)                        // 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)
       
        //Serial.println(priv);
       if (mduration >1800)                     // när motorn går på allra lägsta varv (start)
       {
        fasttid = tid1;                         // används tid1 (4000 uS i grundinställning)
       }
      if ((mduration > 1200)|| (mduration < 1800))
       {
        fasttid = tid2;
       }
       if ((mduration > 500)||(mduration < 1200)) // Om motorn går under 1100 RPM
        {
         fasttid = tid3;                        // används tid2 (1200 uS i grundinställning)
        }
       if (mduration <500)                      // Om motorn går över 1100 RPM
        {
          fasttid = tid4;                       // används tid3 (300 uS i grundinställning)
        }
       
        puls = pulseIn(vevpin, LOW, 30000);   // Ett färdigt kommando som väntar in nästa puls (tand = case).
                                              // vid stillastående motor blir det en timeout
                                              // efter 0,03 Sek
     // if (3800 > 3800 + 2500) blir 3800 > 6300 FALSKT                                     (-2500)
     // if (11400 > 3800 + 2500) blir 11400 > 6300 SANT luckan funnen!                      (+5100)
     // if (3800 > 11400 + 2500) blir 3800 > 13900 FALSK                                    (-10100)                                 
     // if (2000 > 2000 + 2500) blir 2000 > 4500 FALSKT  Detta är dom 28 vanligaste lägen   (-2500)                                   
     // if (10000 > 2000 + 2500 ) blir 10000 > 4500 SANT Luckan funnen, då det är lång tid till nästa tand (efter luckan)
     // if (2000 > 10000 + 2500)  blir  2000 > 12500 FALSKT  Nu är det vanlig tid igen, första tanden börjar om räkningen       
      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 bara har hunnit räkna mellan 19 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 (3800 < 3800 - 2500)  blir 3800 < 1300 FALSKT   (2500)
     // if (11400 < 3800 - 2500) blir 11400 < 1300 FALSKT  (10100)
     // if (3800 < 11400 - 2500) blir 3800 < 8900 SANT     (5100)
     
     // if (2000 < 2000 - 2500) blir 2000 < -500 FALSKT  Detta är dom 28 vanligaste lägen
     // if (10000 < 2000 - 2500 ) blir 10000 < -500 FALSKT
     // if (2000 < 10000 - 2500)  blir  2000 < 7500 SANT 
       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()
 


Jag har ju som sagt kört denna kod ganska länge under dom mesta kombinationer av fart och effekt. Jag kan inte se att den gör nåt konstigt... Men det är klart en motor lämnar inte ut en statisk signal, den vandrar både per varv och framförallt inom varvet. Men jag kan se att dels uppfattar programmet förändringarna och dels justerar den efter det.
Så frågan lite kvarstår om vilket...
Jag har tillfälligt gjort om programmet på en liten snutt så jag kan tidigarelägga spridarnas tillslagstid och duration per spridare med 4 potar, en för varje spridare men jag tycker mig inte märka att den går bättre vid något enskilt tillfälle. ja, här är filen för det också:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
    // Förändrad 2018-11-17 och inlagd 11/17, aktiv/inaktiv fungerar
    // utmärkt. 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.
    // ändrad i gasen så 5 volt är tomgång och 0 volt fullfart
    // hitat fel i analogRead glömt break, skiftat fel på gas i case 2: >>3 istället för >>2
   
            // 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 = 10;         // totaltid för case 16: x * motorns duration (13)
    const int tryckminskn = 60;       // turbotrycket ställs in här, högre tal = mindre tryck (60)
    const int lagstavarv = 500;       // tomgångsvarvet 500 uS motsvarar ca 800 Rpm (500)
    byte hogstavarv = 100;            // fullgasvarvet 100 uS motsvarar ca 4200 RPM  (100)(160 = ca 2500 RPM)
    const byte aggrfaktorlag = 8;     // hur mycket spridar PWM skall öka vid belastning mellanvarv (8)
    const byte aggrfaktorhog = 20;    // hur mycket spridar PWM skall öka vid belastning högvarv (20)
    const int minfart = 3800;         // lägsta startvarv för spridarfunktion (3300 uS = 152 RPM)(3300)skall vara på 3800
    const byte startmangd = 11;        // avgör max startmäng 9 = 1,5 vevaxelpulser = 9 grader ontid (9)
    const float maxdeltalag = 7.0;    // max insprutningstid mellanvarv mdutation * 6.0 ger 3 vevaxelpulser = 18 gr ontid (9.0)
    const byte lagmangd = 11;          // max lågvarvsmängd 4 =  2 vevaxelpulser = 9 grader ontid (under tomgångsvarv)(4)
    const int tid1 = 2500;            // tid 1 är för att hitta pulsluckan vid start/lågvarv < 300 RPM (400)                           
    const int tid2 = 1500;            // tid 2 är för att hitta pulsluckan i mellanvarv 1100--> (1200)
    const int tid3 = 1000;            // tid 3 är för att hitta pulsluckan i alla andra förekommande varv 1100--> (300)
    const int tid4 = 100;             // tid 4 är för att hitta pulsluckan på högsta varvtal
    const byte turbostartregl = 150;  // när tubotrycket börjar avläsas och bli aktivt (150 = uS mduration ca 3200RPM)(150)
    const float senasteinspr = 7.0;   // senaste insprutningstid (vid tomgång)(7.0 = 3,5 vevaxelpulser = 21 grader delaytid
    const byte tidigasteinspr = 60;   // kortaste insprutningsfördröjning (vid maxvarv)(60=t19=24grFödp)(30=t20=18grFödp)
    const int sprtroghet = 400;       // ett grundvärde för spridarnas påslagsfördröjning i uS.                           
     int sprdiff1 = 0;           // en ev tidigareläggning av spridare 1 om den avviker i startfördröjning (uS)
     int sprdiff2 = 0;           // en ev tidigareläggning av spridare 2 om den avviker i startfördröjning (uS)
     int sprdiff3 = 0;           // en ev tidigareläggning av spridare 3 om den avviker i startfördröjning (uS)
     int sprdiff4 = 0;     //20  // en ev tidigareläggning av spridare 4 om den avviker i startfördröjning (uS)                                 
   
   
    int vevpin = 2;                   // pulsingång vevaxelgivare, (aktivt hög).
    int kampin = 3;                   // kamaxelgivarens ingång, (aktivt låg).
    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)(inne i case 18)
    long puls, priv, delta;           // senaste, föregående och delta (totalöppningstid) i uS(mS)
    float error;                      // error = varvfelet 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 51 (max 255)tänder, startar på 0
    int fasttid = 300;                // Fasttid = tid,tid2 eller tid3 beroende på varvtal, startar alltid på 300 uS
    byte analogval;                   // En switch/case till analogread
    int turbotryck;                   // turbotryck
    int battVolt = 400;               // mäter systemspänning till spridare
    int variabel1;                    // bra att ha variabel 1
    int variabel2;                    // bra att ha variabel 2
    int ambTemp = 300;                // mäter omgivningstemperaturen
    int atmtryck = 330;               // mäter atmosfärstrycket
    int sprstartkorr = 50;            // spridarstartkorregering i uS, spänningsberoende
    int sprtroghetklar;               // korrektion för den inbyggda påslagströgheten i spridarna
    int spridardiff;                  // en ev. individuell spridartid korrigering (uS)
   
   
    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 17!
                                   
                                 
     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 + 60; // så blir maxvarv 2500 Rpm
      }

     else
     {
      // maxvarv blir 4200 Rpm
     }
             
 
       
      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
          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,150,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
           bduration =map(gas,255, 0, 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
     break;
       
     case 9:            // 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
     break;       
     
     case 10:          // 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;        // felet i uS mellan är och börvärde för motorns fart
     
     
     case 11:   // 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      + (0 till 50) - (0 till 400)
     break;    //       400      +     0       -      50
     
                     
   
     case 12:           // 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. ställs högst upp
       if (starttandf >= senasteinspr)         // om fördröjning över målvärdet, som vid tex startvarv (ställs in högst upp)
        {                 
         starttandf = senasteinspr;            // blir det målvärdet ändå
        }
     break;
 
     case 13:                     // 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 14:          // 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 15:         // (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 ;                        // används ej än så delta förblir delta oförändrat           
       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
     break;
     
     case 16:         // Detta case är insprutningsfasen "spridar-on-off-mode"
     if (ondelay >=8000)                     // 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.

                      //   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)
        {                         
         delta = 0;               // delta(insprutningstid)blir 0 vid för lågt varv
        }
                     // och startmängden vid motorstart
       if ((delta * 4)>= 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.
       }                                     // Detta paket används vid låga farter såsom start/lågvarv < 250 RPM
     
     else                                     // Eller om delay är mindre än 10000 uS. (> 300 RPM)
       {
        if (delta > 50)                       // Delta under 50 uS har inget värde
        {
        delta = delta + sprtroghetklar;       // Delta över 50 blir x delta + trögheten i spridaren (ca 250 uS)
        }
        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);  // 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 i on spridare 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.
       }                                      //Detta paket används vid varv (250 -> 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:                       // är mellan  tand 19 och 24
          switch (analogval)
           {
            case 0:   
            gas = analogRead(A0)>>2;           // analogingång för gasreglage 0 till 255( skiftad 2 gånger)
            //turbotryck = analogRead(A4);
            sprdiff4 = analogRead(A4)>>3;
            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)
            sprdiff1 = analogRead(A1)>>3;
            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)
            //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,
            sprdiff2 = analogRead(A2)>>3;
            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);
            sprdiff3 = analogRead(A3)>>3;
            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

   /*  case 18:
     Serial.print("cyl1  ");
     Serial.println(sprdiff1);
     Serial.print("cyl2  ");
     Serial.println(sprdiff2);
     Serial.print("cyl3  ");
     Serial.println(sprdiff3);
     Serial.print("cyl4  ");
     Serial.println(sprdiff4);
     break;
   */     
  }
     //______________________________________________________________________________________________________   
        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)
       
        //Serial.println(priv);
       if (mduration >1800)                     // när motorn går på allra lägsta varv (start)
       {
        fasttid = tid1;                         // används tid1 (4000 uS i grundinställning)
       }
      if ((mduration > 1200)|| (mduration < 1800))
       {
        fasttid = tid2;
       }
       if ((mduration > 500)||(mduration < 1200)) // Om motorn går under 1100 RPM
        {
         fasttid = tid3;                        // används tid2 (1200 uS i grundinställning)
        }
       if (mduration <500)                      // Om motorn går över 1100 RPM
        {
          fasttid = tid4;                       // används tid3 (300 uS i grundinställning)
        }
       
        puls = pulseIn(vevpin, LOW, 30000);   // Ett färdigt kommando som väntar in nästa puls (tand = case).
                                              // vid stillastående motor blir det en timeout
                                              // efter 0,03 Sek
     // if (3800 > 3800 + 2500) blir 3800 > 6300 FALSKT                                     (-2500)
     // if (11400 > 3800 + 2500) blir 11400 > 6300 SANT luckan funnen!                      (+5100)
     // if (3800 > 11400 + 2500) blir 3800 > 13900 FALSK                                    (-10100)                                 
     // if (2000 > 2000 + 2500) blir 2000 > 4500 FALSKT  Detta är dom 28 vanligaste lägen   (-2500)                                   
     // if (10000 > 2000 + 2500 ) blir 10000 > 4500 SANT Luckan funnen, då det är lång tid till nästa tand (efter luckan)
     // if (2000 > 10000 + 2500)  blir  2000 > 12500 FALSKT  Nu är det vanlig tid igen, första tanden börjar om räkningen       
      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 bara har hunnit räkna mellan 19 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 (3800 < 3800 - 2500)  blir 3800 < 1300 FALSKT   (2500)
     // if (11400 < 3800 - 2500) blir 11400 < 1300 FALSKT  (10100)
     // if (3800 < 11400 - 2500) blir 3800 < 8900 SANT     (5100)
     
     // if (2000 < 2000 - 2500) blir 2000 < -500 FALSKT  Detta är dom 28 vanligaste lägen
     // if (10000 < 2000 - 2500 ) blir 10000 < -500 FALSKT
     // if (2000 < 10000 - 2500)  blir  2000 < 7500 SANT 
       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()
 

Ingen större skillnad... men dom analoga här är spridarjusteringar istället för div temperaturer mm.
Och sen kan jag aktivera Serialen och få ut värdena per spridare för att sen lägga in dom i konstanterna. (sprdiff1-3)

Författare:  mrfrenzy [ 22.31 2018-11-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det spelar ingen roll om du använder Arduino, STM32 eller Infineon, det måste till interupptbaserad timing för att få det hela pålitligt med denna tidskritiska applikation.

Författare:  Janson1 [ 22.36 2018-11-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

To dä? Ok, jag har en logikanalysator för 8 kanaler som skall först, ja först få liv i den och sen spela in lite och gå tillbaka. Blev det rätt eller fel? Om det visar sig att det är tidsfel, då får jag tänka om!

Författare:  Janson1 [ 22.14 2018-11-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Alltså, jag har funderat fram och tillbaka på detta med interrupt och kommer fram till så som jag har programmerat idag så blir det aldrig tillfälle för interruptet att verka. Den gör en eller flera uträkningar per tand, jag får det till några få uS oavsett (förutom analogaRead som jag därför lagt i slutet där det kvittar vilket) om den räknar en eller flera grejer. Själva Serial.printen som jag använder för att se looptiden tar betydligt mer tid i anspråk än det processorn skall räkna ut per tand. Den kortaste tiden är lite under 100 uS som processorn har till förfogande per tand och samtliga uträkningar tar under 20 uS att utföra. Så om inte Arduino har nått fuffens för sig så är det "gott om tid" När uträkningarna per tand är gjort går den till pulseIn och väntar, mellan 75 uS (lite övervarv) och 480 uS beroende på varvtalet. När den sen kommer till tand 16 (insprutningsfasen) så får den tanden ta väldigt lång tid på sig att bli klar, jag har begränsat till tand 24 som längst vilket motsvarar 12 grader EÖDP. Sen nästa tand, processorn tror det är tand 17 men i verkligheten är det 17 till 24 och där ligger alla analogRead parvis, en tar lite mer än 100 uS och två tar ca 160 uS . När tand 17 (17-24) är klar går processorn ut och gör inte mer förrän sista tanden är lämnad och tandgapet kommer, då resetar den 28 räknaren och börjar på ny kula.
Om jag skall använda interrupt så måste jag nog göra på ett helt annat sätt. Jag var lite inne på att använda Micros() och göra olika markörer på en tidslinje som sen används för att starta, stoppa insprutningen med och låta vevaxelgivaren vara interruptstyrd och följa vevaxelpulserna även vid insprutning och låta analogRead köra när tid finnes.

Författare:  mrfrenzy [ 22.43 2018-11-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bäst skulle nog vara som du säger att börja om och göra på ett helt annat sätt men man behöver ju inte det.
Man kan börja med att göra ett nytt program som bara läser av vevgivare och kamgivare via interruptrutiner samt matar ut aktuell position på serieporten.

När det fungerar och är bombsäkert kan man kopiera in koden i ditt gamla program och behålla allt utom dom delarna som mäter position.
Har du laddat upp koden för din simulator nånstans ifall man vill prova hemma?

För ganska exakt ett år sen skrev basshead några inlägg på sidan 2 i denna tråd, det är så läsvärt så jag tar mig friheten att citera valda delar:
basshead skrev:
Själva svajet dvs jittret kommer just ifrån ... main loop. Kallas ibland för sekventiell exekvering.
...
Men när man kliver in och skall styra tidskritiska saker, tex köra en motor så räcker det inte till längre.
En motor på tomgång är inte så störd av lite fördröjningar. Inte heller på högre varv utan last.
Men den dagen du lägger last på motor och koden sitter och sover när det behövs bränsle då blir inte motorn gammal.
...
Så till interrupt. På Arduino har dom gjort det görenkelt att använda interrupt. Man ansluter en bit kod till en händelse. Tex öka en räknare varje gång man passerar en tand på triggerplattan. Här kan du använda alla sorters triggerkod precis som på oscilloskopet. Rising, falling, change.
Man lagrar därefter in detta i säg 4 olika variabler. Vi kallar dom cylinder cycles.
Nu har du en annan interruptkod som triggas av en sanningstabell som visar vart i cykeln motorn befinner sig.
Denna är livsviktig för motorn behöver olika mycket bränsle och tändvinkel beroende av varv och last.
...
Summa på vilka interrupt som man kan behöva så här i början är;
1. master counter. Dvs godtyckligt räknare för hela 720 graders otto cykeln.
2. Trigger interrupt.
3. Scheduler. Dvs schemaläggare. Detta är din sanningstabell.
4. Ny PWM-styrning för bla spridare.

För om du räknar på 1/4500 varv får du 222 microsekunder. Det blir värre, tro mig. Om vi då redan har 6 usec jitter åt båda håll. Dvs 12/222 ger 5,5% konstant fel per varv! Detta är enormt i motorsammanhang. Dvs 720*0,055 är 39,6 grader i båda riktningarna dvs både innan och efter dödläge. Ifall vi nu räknar med det som vår referens. Men det är detsamma vilken del av cykeln vi använder.

Med interrupt försvinner dessa problem nästan helt.

Författare:  Janson1 [ 23.13 2018-11-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

En fråga om interruptet: Kan ett interrupt agera snabbare än att processorn ligger och väntar på att ingången slår om? (Den här pulseIn gör så)
Jag hade också basshead´s inlägg i tankarna när jag skrev nu. Men jag får det inte till +- 40 grader jitter. Inte teoretiskt och framför allt inte praktiskt, när jag använder min motorsimulator och kör emot ECU:n så är alla tider exakta varje gång. Jag använder oscilloskopet för tidsmätningar och det skiljer inom någon enstaka uS, kan lika gärna vara skåpet i sig självt som Arduinon…
basshead: Men den dagen du lägger last på motor och koden sitter och sover när det behövs bränsle då blir inte motorn gammal.
Jag har faktiskt tvärtom problem, den får för mycket soppa men det beror nog på min programmering, jag har dålig aning om hur mycket extra den skall ha under acceleration/varvtalsökning och jag har ju programmerat för turbo men den ligger på golvet i garaget just nu så jag tror jag måste snåla ner maxmängd per slag på spridarna. Kan ju faktiskt vara detta som krånglar när man gasar på... Hmm, får nog dra ner maxmängen rejält och testa.

Författare:  mrfrenzy [ 23.25 2018-11-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Från dokumentationen av pulseIN:
Citera:
The timing of this function has been determined empirically and will probably show errors in shorter pulses.


Det är förmodligen det här jittret som basshead pratar om.

Om du gör en korrekt mätning med hjälp av interrupt och timers ser jag ingen anledning till att det inte ska bli exakt.

Att testa mot simulatorn är uppenbarligen för enkelt, den har inte dom plötsliga variationer och förändringar som finns i motorn pga förbränning och belastning.

Författare:  Janson1 [ 07.29 2018-11-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja det citatet är nog från pulseInLong, jag har pulseIn bara. Bägge fungerar inom 10 uS men pulseIn kan räkna fel på långa tider, jag anser mig ha korta tider (mellan 100 till 5-600 uS) Hade nu denna pulseIn räknat lite hips som haps så hade inte insprutningsstarttiderna och längderna på spridarpulserna varit så exakta gång efter gång. Vidare så används denna pulseIn i en annan sketch där man mäter avstånd med hjälp av en ultraljudsmodul och den fungerar ju med hög säkerhet och repeternoggrannhet även på kortaste avståndet. Jag antar att där sätts denna sketch mest på prov? Jag läser lite om attachinterrups som jag tror skulle vara rätt för mig vid en ev. omkonstruktion, där står inget direkt om onoggrannheter eller så. Men hur fungerar detta egentligen? Processorn måste väl ändå köra någon slags polling på bevakad ingång för den kan väl inte bevaka en ingång kontinuerligt samtidigt som den arbetar med annat (har ju bara en kärna) Sen när den väl märker att ingången förändras så kan den första lägge en tidsmarkör på förändringen och sen städa bort och spara det den höll på med och sen ta hand om den interruptade ingången. Detta tar väl ochså tid i anspråk?
Tusan, jag måste få ordning på min logikanalysator så jag kan göra IRL mätningar. Jag kommer att tro på min programmering tills motsatsen är bevisad, antingen av mig själv eller av någon annan som kan bevisa det.

Författare:  mrfrenzy [ 08.53 2018-11-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jo det fina med interrupt är att dom bevakas av hårdvara medan processorn håller på med annat.
Man behöver inte polla hela tiden.

Exempel
Du håller på i mainloopen att beräkna pi.
Du har just kommit till 3,141 när vevaxelgivaren skickar en puls.
Eftersom du har satt interruptbevakning på den ingången så reagerar hårdvaran direkt.
Mainloopen tar paus vid nästa klockcykel och interruptrutinen körs.
Den är väldigt kort och gör bara tand++
Interruptet avslutas och mainloop fortsätter exakt där den var på 3,141.
Den hinner räkna vidare till 3,141592 innan nästa tand kommer och cykeln repeteras.

Noggrannhet/jitter i denna mätning blir tiden för en klockcykel vilket är cirka 0,25 ųs
Det borde vara fullt tillräckligt för en motor, annars är till exempel Teensy3 10ggr snabbare.

Författare:  Bosen [ 11.50 2018-11-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Genom att köra ditt program som du gör nu så finns det så oroligt stora risker för fel vilket gör det väldigt svårt att felsöka. T.ex anledningen att du har fått steloperera svänghjulet tror jag beror på att du hamnar några kuggar fel under uppstart. Eftersom det är så många saker som skall köras igenom innan det felet kan rättas till så klarar motorn helt enkelt inte att starta. Om du kör interrupt som räknar, så kommer du få med ALLA pulser ALLTID, vilket tar bort väldigt många felkällor. du kan även samla ihop dina avläsningar av ingångar på ett sätt som gör att du läser in dom OM du har tid, om det inte finns möjlighet tidsmässigt så läser du inte in dom just då.
Du har så otroligt mycket att tjäna på i detta projektet med interrupt så jag kan inte förstå varför du hela tiden försöker måla in dig i ett hörn.

Författare:  Janson1 [ 13.08 2018-11-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja det är ju tusan att jag är så dålig på att programmera... Annars hade jag väl slängt ihop nåt för länge sedan. Men jag har lite börjat med att tänka om, men det är inte interrupt i sig som är största problemet utan tack vare just pulseIn så gör processorn det den skall göra en gång och väntar sedan på nästa grej osv. Det vill jag och förmodligen måste göra så vidare även utan pulseIn men med interrupt.

Författare:  Janson1 [ 21.46 2018-11-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja nu har jag börjat titta på interrupt och vad allt som följer med... Jag har börjat med bosens kod på sid 23 i denna tråd och lagt in den för en första test/utvärdering. (jag måste lära känna koden för att förstå den) Jag antar at jag kan ha kvar ganska mycket från min gamla kod men måste göra om insprutningsmodulen fullständigt, ta bort delay, delaymicros, och inte ha den låst till tand 16 (case 16) Jag antar att delayer måste bort för gott?

Författare:  Bosen [ 07.19 2018-11-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, delay ska du fösöka hålla dig ifrån. Varje gång du använder en "delay" så "stoppar" du processorn. Det vill säga att (i ditt program som du har nu) när du ligger i en "delay" så kan inte processorn använda PulseIn. Skulle det råka komma en tand just då så räknas inte den. Med interrupt så kommer tanden räknas oavsett var i programmet du ligger.
Du har alltså två felkällor i ditt nuvarande program:
1. Antagligen missar du vissa pulser på grund av att du inte kör ingången på interrupt.
2. Du använder delay som gör att du inte utnyttjar processorn med att köra annat samtidigt som du väntar.

Författare:  Janson1 [ 20.49 2018-11-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jahopp, nu har jag tagit steget till att bygga ett nytt program, kanske inte för att jag behöver det men jag kan nog ändå inte låta bli...
Och sen har jag två program, ett med interuptstyrning och ett utan så kan jag ju sen jämföra via ECU A/B.
En första snutt är nu löst, att räkna dom 28 tänderna och att hitta luckan. Jag har både satt lysdiod och använder Serial.print så jag verkligen se att rätt sak händer. Bosen: Jag har tagit din kod som en första starter men fick ändra jättemycket innan det blev någon funktion alls, men sen...

Författare:  Bosen [ 21.24 2018-11-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, koden va absolut inte testad utan jag bara drog den rakt från huvudet :D
...men ladda gärna upp den ändrade koden här så vi ser vad du kör med.

Författare:  Janson1 [ 23.04 2018-11-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ok, koden nästan utan kommentarer. Själva interruptet fungerar nog och tänder/släcker en lysdiod vid tandluckan. (tror jag)
Tandräknaren fungerar (tror jag med...)
Nu vill jag få motorns duration per tand baserat på en lucka plus 7 tänder tillsammans, där skiter det sig... Vid 12 som borde vara i närheten så blir det alldeles för höga tal, speciellt på riktigt låga varv. Dom blir typ 84000 uS, borde varit ca 4000 uS
Där måste jag felsöka vidare...

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
int inpin = 2;
int utpin = 10;
unsigned long VEVTAND_langd;
unsigned long VEVTAND_start;
unsigned long delvalue = 0;
int tand = 0;
unsigned long prev_langd;
unsigned long mduration;


void setup()
{
 pinMode(inpin, INPUT);
 attachInterrupt(digitalPinToInterrupt(inpin), VEV_pulse, RISING);
 pinMode(utpin, OUTPUT);
 Serial.begin(250000);
}

void loop()
 {
  Serial.println(mduration);
 
  switch (tand)
  {
   case 1:
   
   delvalue = VEVTAND_langd;
   break;

   case 2:
   delvalue = VEVTAND_langd + delvalue ;
   break;

   case 3:
   delvalue = VEVTAND_langd + delvalue;
   break;

   case 4:
   delvalue = VEVTAND_langd + delvalue;
   break;

   case 5:
   delvalue =  VEVTAND_langd + delvalue;
   break;

   case 6:
   delvalue = VEVTAND_langd + delvalue;
   break;

   case 7:
   delvalue = VEVTAND_langd + delvalue;
   break;

  case 8:
  mduration = VEVTAND_langd + delvalue;
  mduration = mduration/16;
  break;
 
  case 9:
 
  break;
 
  }
 
// Serial.println(mduration);
 }

 void VEV_pulse()
 {
  prev_langd = VEVTAND_langd;
  VEVTAND_langd = micros()-VEVTAND_start; //Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  VEVTAND_start = micros();  //Börja mätning av lucka
 tand++;
 
   if(VEVTAND_langd > prev_langd +150)
   {
    digitalWrite(utpin, HIGH);
    tand = 1;
   }
  if(VEVTAND_langd < prev_langd -150)
  {
   digitalWrite(utpin, LOW);
  }
 }


 

Författare:  Klas-Kenny [ 23.52 2018-11-22 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Prova med någonting så enkelt som att sätta volatile på tand och VEVTAND_langd.
Du bör använda volatile på alla globala variabler, som används i interrupt.

Annars kan det mycket väl bli så att kompilatorn optimerar bort läsningar av den variabeln, eftersom att koden inte någonstans ändrat på den variabeln (i main-loopen...) utan förutsätter att den är oförändrad. Då kan man få alla möjliga konstiga fel.


Sen gäller det alltid att hålla tungan rätt i mun i övrigt också, när det gäller dessa variabler.
Till exempel så kan du i ditt program komma i läget att programmet snurrar i loopen, och så är tand==8. Den går in där i switch-satsen, men sen innan den hinner exekvera nästa kodrad mduration = VEVTAND_langd + delvalue; så kommer interruptet. Då kommer VEVTAND_langd att ha skrivits över med ny data, för nästa tand. Men kopplas samman med den förra i programmet.

Finns en rad olika sätt att komma runt det problemet, beroende på omständigheterna..
Tex. sätta en flagga för "ny data" i interruptet, som kollas och nollställs i main-loopen före och efter läsning, eller att helt grovt temporärt inaktivera interruptet medan man läser data.



En annan liten detalj, du läser micros() två gånger i interruptet. Det är ju lite dumt om man vill ha riktig precision. Bättre är att tex göra
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1.  void VEV_pulse()
  2.  {
  3.   unsigned long current_micros = micros();
  4.   prev_langd = VEVTAND_langd;
  5.   VEVTAND_langd = current_micros-VEVTAND_start; //Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  6.   VEVTAND_start = current_micros;  //Börja mätning av lucka
  7.  tand++;


Det allra bästa vore att använda input capture i hårdvara, om Arduino har och stödjer detta. Då sparas automatiskt timervärde ner någonstans exakt vid flanken, sen gör det inget om det tar en liten stund innan interruptet sker (om man tex. inaktiverar det, eller har flera interrupt där något annat har högre eller samma prioritet). Eller om man då rent av skiter i interrupt för just den funktionen utan pollar capture-modulen istället.

Författare:  Janson1 [ 07.01 2018-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Klas-Kenny: Ja det är en bra iakttagelse med två Micros istället för att bara använda det en gång. Nu verkar hela denna VEV_pulse del fungera, jag har oscilliskopsmätt, och det funkar alldeles utmärkt, så här är PulseIn() ersatt. Jag trodde jag förstod problemet varför den räknar fel på låga varv, men egentligen borde det bli samma fel på höga varv? Jag har mätt med skopet samtidigt och det stämmer exakt på höga varv men visar många gånger fel på låga varv...

Författare:  Janson1 [ 07.32 2018-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror mig veta varför det blir fel på tidsräkningen. På Fullvarv så läser den case 1 en gång, case 2 en gång, case 3 en gång osv, det är vad den hinner. Men på lägre varv hinner den läsa case 1 två till tio gånger case 2 två till tio gånger osv och den plussar ihop hela skiten så ju mindre, inte mindre, mer tid processorn får att läsa ju mer fel blir totalsumman... Det måste göras på et bättre sätt men hur? egentligen vill jag bara ha räkna varje case en gång per tand om den hinner räkna fler gånger skall resultatet inte plussas.
Edit: både felstavning och fel: mindre skall vara mer!

Författare:  Bosen [ 07.52 2018-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Janson1 skrev:
Nu vill jag få motorns duration per tand baserat på en lucka plus 7 tänder tillsammans, där skiter det sig... Vid 12 som borde vara i närheten så blir det alldeles för höga tal, speciellt på riktigt låga varv.


Vad menar du med motorns duration?

Författare:  mrfrenzy [ 07.53 2018-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

I interruptrutinen sätter du flag=1
I dina case kör du bara om flag=1 och sen resetta till flag=0.

Författare:  Janson1 [ 15.56 2018-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: Duration är den tid varje tand tar i tid att passera, (det är jag som döpt det så) sen lägger jag ihop x antal tänder och dividerar sen i det antalet och får därmed en medeltid per tand, duration.
mrfrenzy: Jag förstår att det går lätt att avhjälpa med en flag men jag har ingen aning om hur, har du möjlighet att ge en liten hint?
Det finns ju en kopia på mitt försöksalster...

Författare:  Bosen [ 16.49 2018-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hmm... varför just 7 tänder. Medel på 3 tänder borde ju räcka?

Författare:  mrfrenzy [ 18.29 2018-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Typ såhär:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
void loop()
 {
  Serial.println(mduration);
 
  switch (tand)
  {
   case 1:
   if(flag == 1)
   {
     delvalue = VEVTAND_langd;
     flag = +0;
   }   
   break;

...


 void VEV_pulse()
 {
  flag = 1;
  prev_langd = VEVTAND_langd;
  VEVTAND_langd = micros()-VEVTAND_start; //Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  VEVTAND_start = micros();  //Börja mätning av lucka
 tand++;
 
   if(VEVTAND_langd > prev_langd +150)
   {
    digitalWrite(utpin, HIGH);
    tand = 1;
   }
  if(VEVTAND_langd < prev_langd -150)
  {
   digitalWrite(utpin, LOW);
  }
 }


Kan du ladda upp koden för din simulator så man kan labba lite "live"?

Författare:  Janson1 [ 18.39 2018-11-23 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: Genom praktiska försök har jag kommit fram till att ju fler tänder som beräkningsgrund, desto lugnare/bättre blir regleringen. Men, efter 9 tänder blir det inte så mycket bättre... (ganska noga testat)
BTW, jag har nu löst via en if-sats så varje case läses bara en gång. Jag tror inte alla case blir kritiska så jag kommer bara att ha if-satsen på dom som verkligen behöver det... Nu kan jag egentligen inte programmera så det finns förmodigen mycket bättre/lättare lösningar för detta. Men nu läser den rätt så summorna blir ochså rätt.

Författare:  Bosen [ 08.30 2018-11-24 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

De praktiska försöken gjorde du väl när du inte körde interrupt? Nu när du kör interrupt så har du en nogrannare mätning och andra förutsättningar.

Författare:  Janson1 [ 08.49 2018-11-24 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kan tänkas, men jag ser faktiskt inga som helst flaskhalsar just pga utebliven interrupt med tidsräkningen. Däremot har jag hittat felet varför den gick dåligt vid gaspådrag högre varv. Jag hade så långa insprutningstider (antagligen för långa även med fullt turbotryck) så motorn helt enkelt tjövde sig och behövde gå ett par sekunder utan belastning för att hämta sig. Nu har jag ställt ner dom parametrarna ganska rejält, aggfaktorhog 20 till 7 resp aggfaktorlag 8 till 6, (se min ECU-fil lite längre bak i tråden) Sen dess har jag bara provat runt lite på gården och nu är jag närmare rätt härad i insprutningsmängder per slag. Jag lämnade traktorn ute i natt för att kolla startvilligheten vid 0 grader. Jag har kopplat in glöden på Grållens gamla startkontakt som man aktiverade med växelspaken, det finns ett speciellt återfjädrande startläge på alla gamla Grållar så man kan inte glömma växeln i vid start...

Författare:  Janson1 [ 22.30 2018-11-24 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Den var inte speciellt lätt att få igång (-1 grad) men gick igång efter lite malande. Den ryker knappt alls vid start så jag tror startmängden skall ökas rejält.

Författare:  Janson1 [ 07.47 2018-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

mrfenzy: såg först nu ditt svar på läst/olästflagga. jag gjorde så själv men vände på 0 och 1... Jag har frågat den som gjorde motorsim-koden så jag återkommer där.

Författare:  Janson1 [ 19.54 2018-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Skit också, det funkar inte med caseRead == 0 och oläst == 1, det borde det göra?
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
const unsigned int hogstavarv = 200;                                       // div konstanta värden
const unsigned int lagstavarv = 1000;


int inpin = 2;
int utpin = 10;
unsigned long VEVTAND_langd;
unsigned long VEVTAND_start;
unsigned long delvalue = 0;
byte tand = 0;
unsigned long prev_langd;
float mduration;
int caseRead;
int gas;
float bduration;
int battvolt;
int sprstartkorr;
float error;
float starttid;
void setup()
{
 pinMode(inpin, INPUT);                                                 // satt inpin som ingång
 attachInterrupt(digitalPinToInterrupt(inpin), VEV_pulse, RISING);      // här blir inpin interruptstyrd
 pinMode(utpin, OUTPUT);                                                // satt utpin som utgång
 Serial.begin(9600);                                                  // initsierar serialprintfunktionen på 250000 b/sek
}

void loop()
{
 switch (tand)                                                          // här startar switch och case, tandräknaren stegar fram ett steg (case)
  {
   case 1:                                                              // Case 1:
   if(caseRead == 1)                                                    // om den inte redan är läst så läses case 1
   {
    delvalue = VEVTAND_langd;                                           // tandluckan läggs in som första delvärde
  //  gas = analogRead(A0)>>2;                                            // gaspot läses av här, skiftas två gånger (0-255)
   // bduration = map(gas, 0, 255, lagstavarv, hogstavarv);               // motorns börduration bestäms här (1000-100 uS)
   // Serial.println(delvalue);
   }
   caseRead = +0;                                                        // case 1 flaggas av som läst hä}                                                                     
   break;
   
   case 2:
   if(caseRead == 1)
   {
    delvalue = VEVTAND_langd + delvalue;
    //battvolt = analogRead(A7);
    //sprstartkorr = map(battvolt, 150, 700, 200, 800);
    //sprstartkorr = constrain(sprstartkorr,150,400);
  Serial.println(delvalue);
   }
   caseRead = +0;
   break;

   case 3:
   if(caseRead == 0)
   {
    delvalue = VEVTAND_langd + delvalue;
   }
    caseRead = 1;
   
   break;

   case 4:
    if(caseRead == 0)
   {
    delvalue = VEVTAND_langd + delvalue;
   }
    caseRead = 1;
   

   break;

   case 5:
    if(caseRead == 0)
   {
    delvalue = VEVTAND_langd + delvalue;
   }
    caseRead = 1;
   
   break;

   case 6:
    if(caseRead == 0)
   {
    delvalue = VEVTAND_langd + delvalue;
   }
    caseRead = 1;
 
   break;

   case 7:
    if(caseRead == 0)
   {
    delvalue = VEVTAND_langd + delvalue;
    //Serial.println(delvalue);
   }
    caseRead = 1;
   
   break;

  case 8:
   if(caseRead == 0)
   {
    mduration = VEVTAND_langd + delvalue;
    mduration = mduration/12;
   // Serial.println(mduration);
   }
    caseRead = 1;
   
  break;
 
  case 16:
   if(caseRead==0)
   {
       error = (mduration / bduration)-1;
    if (error <=0.)                       // om error under noll
     {
      error = 0.;                         // förblir error 0 för att ej få minusvärden
     }
     if(error >=6.)
     {
      error = 6.;
     }
     
     starttid = map(mduration, 2000, 200, 21., 17.);
     //starttid =constrain(starttid, 17,21);
     //Serial.println(mduration);
   }
     caseRead = 1;
   
  break;

 
  }
   

 //Serial.print(mduration);
 //Serial.print("  ");
 //Serial.println(starttid);
 
 }

 void VEV_pulse()                          // Den interruptstyrda delaen börjar här
 {
  caseRead = 1;
  prev_langd = VEVTAND_langd;              // nuvarande vevtands längd läggs in som föregående vevtandslängd (döper om)
 
  VEVTAND_langd = micros()-VEVTAND_start;  // Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  VEVTAND_start = micros();                // Börja mätning av lucka
   tand++;                                 // tandräknaren räknar upp en tand
  // caseRead = 0;                           // en "flagga" sätts till 0 = oläst case
   //Serial.println(tand);
   if(VEVTAND_langd > prev_langd +150)     // OM nyaste vevtands längd är längre än föregåendes + 150
    {                                     // då är luckan hittad
    digitalWrite(utpin, HIGH);             // Då går utpin hög
    tand = 0;                              // och tandräknaren resetas till 1 (början på tandräkningen)
    }
  if(VEVTAND_langd < prev_langd -150)      // OM nyaste vevtands längd är kortare än föregående -150
   {                                      // då är luckan slut
   digitalWrite(utpin, LOW);               // och utpin blir låg igen.
   }
 
 }


 

Vad tusan gör jag för fel?

Författare:  Janson1 [ 20.01 2018-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Här kommer motorsim alá JPD
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
    unsigned long now, last, last_read;
    boolean led_on;
    boolean adc_in_progress = false;


    int vevpin2 = 2; // vevaxelutgång, ger 28 pulser 2 luckor, 28 pulser 2 luckor ( 1 varv)
    int kampin = 3; // kamaxelutgång, ger 7 pulser per varv enligt ett fast mönster.


    unsigned long hz; // analogvärdet omsatt i frekvens
    unsigned long tid1;  // delaytid i us ontid == offtid
    byte x,temp;   // 1 till 120 räknare

    const byte adcPin = 1;
    const byte synkpin = 7;

    void setup() {
      last = 0;
      last_read = 0;
      pinMode(vevpin2, OUTPUT); // vevpin satt som utgång
      pinMode(synkpin, OUTPUT); // synkpinne för scopet
      pinMode(kampin, OUTPUT); // kampin satt som utgång
      Serial.begin(250000);
      x=1;
      adc_in_progress = false;

    // ADC setup
      ADCSRA =  bit (ADEN);   // turn ADC on
      ADCSRA |= bit (ADPS0) |  bit (ADPS1) | bit (ADPS2);  // Prescaler of 128
      ADMUX =   bit (REFS0) | (adcPin & 0x07);  // AVcc   
    }

    void handle_kampin(){
      if (x==4)// || x==13 || x==34 || x==37 || x==64 || x==94 || x==100)// här ändrat för att bara ha en puls/2 varv
          {
            digitalWrite(kampin, HIGH);
          } else {
            digitalWrite(kampin, LOW);
          }     
    }

    void oscilloskop_trig(){
        if (x==1){ // puls för att synka oscilloskopet på
            digitalWrite(synkpin, HIGH);
          } else {
            digitalWrite(synkpin, LOW);
          }       
    }

    void handle_tick(){ // körs varje gång en tidslucka har hänt - två gånger per kugg
      if (!led_on){
        x++;
        if (x>120){
          x=1;
        }
        temp = x % 30; // modulo - letar rätt på luckorna 29,30,59,60,89,90,119,120
        if (temp!=29 && temp!=0){
          digitalWrite(vevpin2, HIGH);
        }
        led_on=true;
        handle_kampin();
        oscilloskop_trig();
      } else {
        digitalWrite(vevpin2, LOW);
        led_on=false;
        }
    }

    void read_pot()
    {
      if (!adc_in_progress)
      {
        bitSet (ADCSRA, ADSC);
        adc_in_progress = true;
      }
      if (bit_is_clear(ADCSRA, ADSC))
      {
        int pot = ADC;  // read result
    /* ca 90 us:   
        hz = map(pot,0, 1023, 800, 4200); // här omvandlas fart till hz
        tid1 = map(hz, 800, 4200, 1250, 120); //  här omvandlas hz till tid on/off
        */
    /* ca 4us
        tid1 = 120 + pot;
        */
    /* ca 6us med bättre varvtalsområde:
        tid1 = 120 + ((pot*9)>>3);
        */   // 120
       // tid1 = 80 + ((pot*25)>>3);  //multiplikation med 9/8 som heltal. 60 eller 100 skall vara 120!!
       tid1 = pot;
     //  Serial.println(tid1);
       tid1 = map(tid1,0,1023, 4000, 125);  //4000, 100
      //  Serial.println(tid1);
        adc_in_progress = false;
      }
    }


    void loop()
    {
      now = micros();
      if ((now-last_read)>10000){
        read_pot(); // Läs poten 100 ggr/s
        last_read = now;
      }
      if ((now-last)>tid1){
        handle_tick();
        last = now;
      }
    }

// Fungerar väldigt bra!!
 

Författare:  Janson1 [ 21.18 2018-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det har blivit en liten filmsnutt på provkörningen...
https://www.youtube.com/watch?v=ZQ-nSAc ... e=youtu.be

Författare:  Klas-Kenny [ 21.41 2018-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Börja med att göra variabeln volatile, annars har du inte en aning om vad kompilatorn hittar på för dumheter. Kan mycket väl orsaka ett sånt fel.

Edit: Fast du sätter ju variabeln till 1 i de flesta case-fall, det är väl fel?

Författare:  mrfrenzy [ 22.08 2018-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja det måste blivit en miss i några av casen.
Du ska väl aldrig någonsin sätta caseRead=1 i mainloop, bara till 0.

för säkerhets skull kan du göra alla dessa volatile:
VEVTAND_langd
VEVTAND_start
tand
caseRead

Författare:  Janson1 [ 22.25 2018-11-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har nu provat lite olika kombinationer men det blir inte bra... Den läser ibland caset en gång ibland två, tre gånger och plussar ihop.
Jag kan se på Serialmonitorn att den går ojämnt, det kan liksom hänga sig ena stunden för att ge flera tal på en gång nästa stund. Det är nåt vajsing.

Författare:  Janson1 [ 21.33 2018-11-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag läser om "volatile" på Arduinos hemsida och dom skriver att det kan bli en del konstigheter. Man skall ev. de-aktivera interruptet precis efter det gjort sitt och sen aktivera det igen efter tex. delvalue-mätningen. Men jag är dålig på engelska och vet inte heller hur man bör programmera... Är det någon som känner sig manad?

Författare:  mrfrenzy [ 21.58 2018-11-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har bara en arduino här, har beställt en till för ett tag sen. Så snart den kommit ska jag göra en uppkoppling med din simulator och knacka ihop ett litet exempelprogram som fungerar.

Författare:  Klas-Kenny [ 22.01 2018-11-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Allt du behöver göra för volatile är att lägga till nyckelordet då variablerna deklareras.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. volatile unsigned long VEVTAND_langd;
  2. volatile unsigned long VEVTAND_start;
  3. volatile byte tand = 0;
  4. volatile int caseRead;


Det du kommer in på med att inaktivera interrupt är just det som jag skrev en del om några inlägg tillbaka. Men jag tror inte du kommer få några problem med just det, så som ditt program fungerar.
Så länge som main-loopen alltid hinner minst ett varv per interrupt så är det ju ingen risk att någon variabel skrives mitt i en läsning nu i och med din "caseRead".

Prova med volatile enligt ovanstående, se om det gör någon skillnad.

Författare:  Janson1 [ 06.29 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

mrfenzy: Jag kan skicka en arduinoklon direkt om du vill..
Klas-Kenny: Jag har gjort allt detta redan och resultatet är exakt samma. Jag har även provat caseRead som HIGH/LOW, det jag inte testat är TRUE/FALSE. En grej jag ser på din kodsnutt är att: tand = 0 där din nolla är blå, varför?

Författare:  Klas-Kenny [ 06.36 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Min nolla är blå för att jag slår på syntax highlight i forumet, dropdownmenyn "Syntaxmarkera kod" och väljer C. :D

Författare:  Janson1 [ 06.42 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror problemet ligger någonstans mellan dom två looparna. interruptloopen missar aldrig en puls (tand). Den räknar alltid upp en tand resp nollar. Den flaggar alltid av som oläst till main-loopen men mainloopen tappar kontakten lite sporadiskt?

Författare:  mrfrenzy [ 08.53 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det är lugnt Janson, är redan på ingång.

Författare:  Klas-Kenny [ 19.00 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Provkörde koden lite.

Fick fram följande:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. const unsigned int hogstavarv = 200;                                       // div konstanta värden
  2. const unsigned int lagstavarv = 1000;
  3.  
  4.  
  5. int inpin = 2;
  6. int utpin = 10;
  7. volatile unsigned long VEVTAND_langd;
  8. volatile unsigned long VEVTAND_start;
  9. unsigned long delvalue = 0;
  10. volatile byte tand = 0;
  11. unsigned long prev_langd;
  12. float mduration;
  13. volatile int caseRead;
  14. int gas;
  15. float bduration;
  16. int battvolt;
  17. int sprstartkorr;
  18. float error;
  19. float starttid;
  20. void setup()
  21. {
  22.  pinMode(inpin, INPUT);                                                 // satt inpin som ingång
  23.  attachInterrupt(digitalPinToInterrupt(inpin), VEV_pulse, RISING);      // här blir inpin interruptstyrd
  24.  pinMode(utpin, OUTPUT);                                                // satt utpin som utgång
  25.  Serial.begin(250000);                                                  // initsierar serialprintfunktionen på 250000 b/sek
  26. }
  27.  
  28. void loop()
  29. {
  30.   if(caseRead == 1) {
  31.     caseRead = 0;
  32.      switch (tand)                                                          // här startar switch och case, tandräknaren stegar fram ett steg (case)
  33.       {
  34.        case 1:                                                              // Case 1:
  35.  
  36.         delvalue = VEVTAND_langd;                                           // tandluckan läggs in som första delvärde
  37.       //  gas = analogRead(A0)>>2;                                            // gaspot läses av här, skiftas två gånger (0-255)
  38.        // bduration = map(gas, 0, 255, lagstavarv, hogstavarv);               // motorns börduration bestäms här (1000-100 uS)
  39.         Serial.println(delvalue);                                                                  
  40.        break;
  41.        
  42.        case 2:
  43.         delvalue = VEVTAND_langd + delvalue;
  44.         //battvolt = analogRead(A7);
  45.         //sprstartkorr = map(battvolt, 150, 700, 200, 800);
  46.         //sprstartkorr = constrain(sprstartkorr,150,400);
  47.       //Serial.println(delvalue);
  48.        break;
  49.    
  50.        case 3:
  51.         delvalue = VEVTAND_langd + delvalue;
  52.        
  53.        break;
  54.    
  55.        case 4:
  56.  
  57.         delvalue = VEVTAND_langd + delvalue;
  58.        
  59.    
  60.        break;
  61.    
  62.        case 5:
  63.  
  64.         delvalue = VEVTAND_langd + delvalue;
  65.        
  66.        break;
  67.    
  68.        case 6:
  69.  
  70.         delvalue = VEVTAND_langd + delvalue;
  71.      
  72.        break;
  73.    
  74.        case 7:
  75.  
  76.         delvalue = VEVTAND_langd + delvalue;
  77.         //Serial.println(delvalue);
  78.        
  79.        break;
  80.    
  81.       case 8:
  82.  
  83.         mduration = VEVTAND_langd + delvalue;
  84.         mduration = mduration/12;
  85.        // Serial.println(mduration);
  86.        
  87.       break;
  88.      
  89.       case 16:
  90.            error = (mduration / bduration)-1;
  91.         if (error <=0.)                       // om error under noll
  92.          {
  93.           error = 0.;                         // förblir error 0 för att ej få minusvärden
  94.          }
  95.          if(error >=6.)
  96.          {
  97.           error = 6.;
  98.          }
  99.          
  100.          starttid = map(mduration, 2000, 200, 21., 17.);
  101.          //starttid =constrain(starttid, 17,21);
  102.          //Serial.println(mduration);
  103.        
  104.       break;
  105.    
  106.      
  107.       }
  108.   }
  109.    
  110.  
  111.  //Serial.print(mduration);
  112.  //Serial.print("  ");
  113.  //Serial.println(starttid);
  114.  
  115.  }
  116.  
  117.  void VEV_pulse()                          // Den interruptstyrda delaen börjar här
  118.  {
  119.   long thisLength = micros();
  120.   caseRead = 1;
  121.   prev_langd = VEVTAND_langd;              // nuvarande vevtands längd läggs in som föregående vevtandslängd (döper om)
  122.  
  123.   VEVTAND_langd = thisLength-VEVTAND_start;  // Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  124.   VEVTAND_start = thisLength;                // Börja mätning av lucka
  125.    tand++;                                 // tandräknaren räknar upp en tand
  126.   // caseRead = 0;                           // en "flagga" sätts till 0 = oläst case
  127.    //Serial.println(tand);
  128.    if(VEVTAND_langd > prev_langd +150)     // OM nyaste vevtands längd är längre än föregåendes + 150
  129.     {                                     // då är luckan hittad
  130.     digitalWrite(utpin, HIGH);             // Då går utpin hög
  131.     tand = 1;                              // och tandräknaren resetas till 1 (början på tandräkningen)
  132.     }
  133.   if(VEVTAND_langd < prev_langd -150)      // OM nyaste vevtands längd är kortare än föregående -150
  134.    {                                      // då är luckan slut
  135.    digitalWrite(utpin, LOW);               // och utpin blir låg igen.
  136.    }
  137.  
  138.  }
  139.  


Vilket printar ett mycket stabilt värde på tand 1 med tandluckor från ~200us upp till väldigt långt.

Författare:  Janson1 [ 21.59 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

jadå, tand ett är inga problem, den kan bara bli ett tal då det är första läsningen, men andra tanden blir mer känslig för hur många gånger delvalue blir plussat... I mitt fall räknar den en gång (rätt) för det mesta men helt random kan den räkna 2 gånger sen en gång flera varv och så två gånger igen osv. Så prova gärna vidare...
edit: det ser ut som koden är lite omgjord? ser jag nu. Jag hoppas detta är medicinen! Nu har jag tyvärr ingen simulator jämte mig men jag tar en test i morgon. Men som sagt prova gärna case 2 med Serialen.

Författare:  Klas-Kenny [ 22.07 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Samma kod men där jag skriver ut delvalue i case 1,2,3,4, ger följande utskrift:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
4848
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4848
2284
3136
3992
4848
2284
3136
3996
4848
2280
3132
3992
4844
2280
3132
3992
4844
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4848
2284
3136
3992
4848
2284
3136
3996
4848
2284
3136
3996
4848
2280
3136
3992
4844
2280
3132
3992
4844
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4848
2284
3136
3992
4848
2284
3136
3996
4848
2280
3132
3992
4844
2280
3132
3992
4844
2280
3132
3992
4844
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4848
2284
3136
3992
4848
2284
3136
3996
4848



Det får väl ses som ganska stabilt? :)

Edit: Kör inte med din simulator för att generera signal, utan tar från en funktionsgenerator... Så vet inte om siffrorna blir något du inte känner igen pga det. Vågformen jag testar med ser ut så här (lite skräpig i mätningen, den är fyrkantig egentligen):
Gul är signal till Arduinon, och blå är utsignal ifrån densamma.
Bilaga:
DS1Z_QuickPrint6.png

Författare:  Janson1 [ 22.14 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Klas_Kenny: ja för tusan, fick tänka lite men du har en frekvensgenerator med en liten tandlucka? Och jag antar du lagt Serial.printen utanför case men i mainloop. Men det ser verkligen rätt ut! Tack!!

Författare:  Klas-Kenny [ 22.16 2018-11-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Har arbiträr funktionsgenerator, så satte samman en enkel (valfri) vågform. Orkade dock inte lägga in riktigt alla tänderna. :P Men bör ju vara tillräckligt för att se att mätningen fungerar stabilt.

Författare:  Janson1 [ 20.08 2018-11-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Klas-Kenny: Nu är det testat och det fungerar alldeles utmärkt! Så tack än en gång, denna lösning hade jag nog inte kommit på i första hand... Nu så kan jag gå vidare i min interruptprogrammering!

Författare:  Janson1 [ 09.56 2018-12-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har nu labbat med traktorn och den gamla vanliga ECU- filen och fått till insprutningstillfällena ganska bra nu. Vid startvarv upp till tomgångvarv ca 750 RPM börjar insprutningen på tand 19,5 vilket ger ca 15 grader BTDC (hmm konstigt, jag fick det till 9 grader förut men motorn går betydligt bättre med lite högre förtändning) Sen backar insprutningsbörjan allteftersom varvtalet ökar till 20 grader BTDC vid 4000 RPM men här tror jag ytterligare förtändning skulle göra gott. Mitt nuvarande program måste modifieras lite om det skall gå att backa tändläget ytterligare då jag har en variabel som justerar strömsättningen av spridarna med hänsyn till drivspänningen och den spökar lite vid tidiga tändlägen... Men nu går traktorn riktigt bra, jag har nu ställt maxvarvet till ca 3800 Rpm och detta ger en fart av ca 40 km/h. Traktorn går i princip lika fort uppför som nerför (den har samma maxvarv obelastad som belastad men går med lite övervarv nerför) och startar bra varm som kall. Jag har ett klingande ljud i förmodligen det svetsade dubbelmassahjulet? Det har inte ökat något på den timmen motorn har gott hittills. Just nu skall traktorn få Ljus och blinkers och även elfläkten skall kopplas in. Jag beställde en ny huv som jag väntar på och även två nya framlampor. Jag skaffade en 1,3 tums OLED-display med seriellt snitt som jag tänker operera in i Biltemas oljetrycksmätare, ja oljetrycksinredning får flytta ut och OLED:en flyttar in. Om jag lyckas med detta så behöver jag inte göra hål för någon display eller så utan kan använda original 52 mm hål i panelen, jag vill göra så lite åverkan som möjligt i traktorn.
Förra gången jag grejade med en seriell display var det ett helsike innan jag fick till det, jag hade för mig jag fick hämta en H-fil någonstan? Hur har ni andra löst detta? Jag har för mig att jag hittade en fil som man lätt kunde mjuvarustyra runt SDA-SCL från Ax +Ax till vilka lediga pinnar som helst. Känns detta igen?
https://www.youtube.com/watch?v=ZQ-nSAcrDWI En liten snutt från förra veckan vid provkörning...

Författare:  Janson1 [ 22.38 2018-12-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Den nya huven kom idag som byggsats, fick ihop den efter en del meck. Den passar sådär, men lite färg på så blir det nog bra...
Bilaga:
20181205_193653.jpg


Nu har den bakljus och blinkers men framlamporna lyser med sin frånvaro, dom bör väl dyka upp snart nu?

Författare:  Magnus_K [ 22.43 2018-12-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

:wave:

Vad bra det blir Janson1! Vilken resa. Och vilken traktor! :tumupp:
Verklig inspiration!

Författare:  Janson1 [ 23.07 2018-12-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Tackar! den längsta resan har varit motorstyrningen!! Alla kategorier... Att få till traktorn är väl mest "a walk in the park" Nej, inte riktigt men det mesta där beror bara på tid, fri-tid, det blir färdigt bara man håller på.

Författare:  baron3d [ 01.26 2018-12-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det blir riktigt bra!

Författare:  Janson1 [ 22.47 2018-12-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Tackar baron3d!
Mrfrenzy: Hur går det med den andra arduinon och motorsim? Har du hunnit få nåt liv i prylarna?

Författare:  Janson1 [ 19.29 2018-12-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag passade på att göra om mitt program lite idag. Nu börjar jag min "insprutningsmodul" på tand 15 istället för på tand 16, detta ger mig mycket större möjlighet till rätt förtändning utan att det tar i botten, dvs. nu kan jag ställa förtändningen tidigare än vad motorn behöver men samtidigt så fungerar den automatiska tidskorrigeringen med hänsyn till batterispänningen bättre. Nu har jag ställt tändningen så man precis börjar höra diesel-knacket på alla varvtal. Mer vetenskapligt blir det inte i dag... Tidpunkten för tändning vid start är på tand 19,5 dvs ca 15 grader FÖDP som jag skrev förut. Just detta verkar var känsligt, några grader tidigare den bankar ganska hårt på startern, några grader senare, den startar inte alls, tvärdöd. Förtändning= insprutnings början. Det är lite svårt att få ett exakt gradtal på motorn då vevaxelgivarens känselkropp inte sitter i mitten utan vid sidan, så hur man vrider den påverkar också. Just nu kör jag mina två program samtidigt, det ena på ECU A och det andra på ECU B så jag kan jämföra. I dag när jag kom hem från jobbet passade jag på att köra lite rejälare med traktorn, den kom upp i temp så termostaten öppnade så nu vet jag att det funkar i alla fall. Däremot så läcker givetvis kylet… Nästa grej blir nog att byta ut gasen från typ volymkontroll till den riktiga handgasen, få till detta på nåt sätt står ganska högt på önskelistan just nu.

Författare:  mrfrenzy [ 22.50 2018-12-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Har du fått Klas-Kennys kod att funka alltså?

Själv har jag inte varit pigg så har inte orkat mecka något med det ännu.

Författare:  Janson1 [ 06.43 2018-12-11 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, så långt att den alltid räknar tänderna rätt och läser case:en rätt (en gång per tand)
Just nu har jag lagt mer energi på att justera min egen fungerande kod.

Författare:  Janson1 [ 23.12 2018-12-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, lite har hänt sen sist. Jag har bytt bägge slangarna i bakdäcken, ett halvt träningspass per hjul... Men med hjälp av grävmaskinen så pressade jag loss däcket från fälgen sen är det ren muskelkraft och lite list för att få av/på däcket igen. Vidare har jag gjort om gasen så originalhandtaget är kopplat via ett par kugghjul till poten, jag tror jag fått till detta bra nu.
Bilaga:
20181213_190125.jpg


Ytterligare vidare så har jag kommit fram till att jag måste ha olika förtändning vid start resp tomgång. Den skall vara ganska tidig vid startmotorvarv för att sen bli senare på tomgång för att sen bli tidigare igen vid ökat varv. Att köra tändkurvan linjärt med varvtalet funkar fint mellan 400-3800 RPM. Så nu har jag gjort om programmet igen, vet inte vilken gång i ordningen. så ä den tidig vid start och senarelägger sen vid drift för att aldrig gå tillbaka till det tidigaste läget med mer än att man stänger av och startar om igen.

Författare:  Janson1 [ 07.42 2018-12-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nåt är fel, efter ca 15-25 minuter börjar den hacka/missa en insprutning då och då helt slumpartat. Felsökningen hittills är att jag kan se via kontroll-lysdioden att det saknas en spridarsignal ut då och då, jag fick för mig främst då på ECU-B Men det gäller nog ECU-A också.
Jag bytte ECU-B Arduinon men samma sak. Det som dom ECU:erna delar på är vevaxelgivare och kamaxelgivare men jag tror kamaxelgivaren går bort då den ändå kopplas döv efter en stund. Drivspänning kommer från två håll så försvinner en så gör det ingen skillnad, detta är testat och man kan inte förstå att en spänning saknas mer än dess indikering försvinner och jag får en felflagga i min logg. Man kan stänga av och starta igen, felet är kvar så nåt mjukvarufel borde det inte vara? Den här vevaxelgivaren kanske inte lämnar rätt och då uteblir det ett halvvarv= ingen insprutning detta halvvarv. Ja nåt är det...

Författare:  larky [ 08.44 2018-12-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ingen timer/räknare som slår över någonstans om det alltid händer efter en viss tid?

Författare:  Janson1 [ 10.19 2018-12-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Millis tar mer än 50 dygn och Micros tar ca 70 minuter innan det börjar på nytt. Dessutom om man startar om så resetas alla register men felet fortsätter en liten stund till för att sen förvinna...

Författare:  Bosen [ 11.15 2018-12-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det bästa vore väl att ”resetta” själv var 5:e minut. (Helst oftare) för att se till att allt är synkroniserat.

Men kan det inte vara så att efter 20 minuter så är motorn fullvarm och då gäller inte dina värden längre?

Författare:  Janson1 [ 14.26 2018-12-21 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Den blir ju bra igen om man fortsätter att köra... Jag kan se via kontrollutgången (digital 12 built_in_LED) när den inte behagar lämna ut spridarplus.

Författare:  Janson1 [ 23.07 2018-12-25 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tror det är vevaxelgivaren som börjar ge upp? Jag har bestämt för att försöka få till original VR-givare och en Schmitt-trigger.
Baron3d ritade ett enkelt schema som jag nu gjort, i morgon blir det testing...

Författare:  Janson1 [ 23.36 2018-12-29 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har väl lite kört fast, har inte haft motivationen heller på några dagar... Men nu tog jag tag i det och kom fram till att tidsluckan som förut var motsvarande två tänder lång blir nu med VR-givaren bar en tand lång. Så jag gjorde först om min motorsimulator så den lämnar nu ut 28 t 1 lucka, 28 t en lucka osv. Nu kommer det att bli ett tidsfel åt något håll men jag tror jag vet hur det skall hanteras... Passade även på att göra om simulatorn så den ger aktivt låg istället för aktivt hög ut på vevaxelsignalerna. Sen gjorde jag om ECU:programmet till att passa med bara en lucka i tiden och har nu kört det hemma på kammaren. I morgon skall (om jag nu inte blir förkyld på riktigt) detta testas om det ver huvudtaget funkar? Ja, en ny vevaxelgivare av hallelementtyp är beställd också för säkerhets skull!

Författare:  Janson1 [ 09.45 2019-01-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det är svårt att få till VR-givaren att fungera från 130 hz till minst 4500 hz utan att luckan byter polaritet, blir kortare, blir två halvluckor mm. Fungerar den på låga varv så fungerar den inte på höga och vice versa... Finns det inte någon färdig lösning på detta? Hur gör dom "stora"? Jag har testat två kretsar som är gjorda för detta men dom uppvisar samma problem med just tandluckan. Att få till själva pulserna är inte nått som helst problem men tandluckan är inte stabil!! Om den godtyckligt ser lite olika ut så är det svårare att programmera nåt vettigt...

Författare:  Bosen [ 12.34 2019-01-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Använd max9924 till VR-givare! Inget annat funkar bättre än det.

Författare:  Janson1 [ 21.27 2019-01-02 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: Maximkretsen är väl utprovad utan att funka, det den kunde, kunde jag få till med en NPN småsignaltransistor... Men i dag löste det sig! En ny givare från HonneyWell och allt blev bra, till sist... Den passar hyfsat rent mekaniskt, den lämnar fin signal, traktorn startar och fungerar! När jag hade VR-givaren med eller utan Maximkretsen så gick det att få rätt signal på ett begränsat varvtalsområde tex från start upp till 7-800 varv, sen ändrade signalen form och det sket sig. Om nu giveriet kommer att funka i längden så rör jag inte detta mera! Jag lovar!

Författare:  Janson1 [ 16.29 2019-01-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Larky: Du hade rätt om att en räknare slår över då och då. Första felet var faktiskt vevaxelgivaren och nu är den bytt. Felet som kvarstod var att den utelämnade en insprutning då och då... Jag hade under tiden som jag väntade på givaren gjort en "startalättfunktion" vilket innebär att först måste kamaxelgivaren detektera cyl 4, sedan börjar insprutningen med cyl 4 osv. En annan grej jag byggde in för nåt halvårsedan var att göra kamaxelgiven "döv" efter upp till max 255 pulser. Nu valde jag bort den grejen genom att skriva in 258, då blir aldrig kamaxelgivaren urkopplad och räknaren börjar om på 0 igen osv. Grejen var den att jag hade gjort "startalättfunktionen" på denna räknare så vid < 1 (0) är ingen insprutning och detta återkommer ju nu var 511 motorvarv...
Nu är det annorlunda programmerat och testat en halvtimma-trekvart och den har inte missat en ända gång hittills.

Författare:  larky [ 21.34 2019-01-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Kul med framsteg!

Författare:  Janson1 [ 22.47 2019-01-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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???

Författare:  farskost [ 00.58 2019-01-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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 :)

Författare:  Janson1 [ 09.40 2019-01-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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!

Författare:  farskost [ 12.14 2019-01-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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?

Författare:  Janson1 [ 18.13 2019-01-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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?

Författare:  Janson1 [ 18.20 2019-01-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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: [Expandera/Minimera] [Hämta] (Untitled.txt)
    // 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()
 

Författare:  farskost [ 19.41 2019-01-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ah, förlåt, glömde lägga med länken :)

https://sensing.honeywell.com/sndh-t-se ... 3dec09.pdf

https://sensing.honeywell.com/SNDH-T4C- ... on-sensors

Författare:  Janson1 [ 21.10 2019-01-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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.

Författare:  Janson1 [ 21.58 2019-01-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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...

Författare:  Bosen [ 06.36 2019-01-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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.

Författare:  Janson1 [ 13.07 2019-01-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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...

Författare:  Janson1 [ 20.11 2019-01-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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?

Författare:  Janson1 [ 22.56 2019-01-20 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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.
Bilaga:
20190107_205908.jpg

Författare:  Janson1 [ 07.53 2019-01-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

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.

Författare:  Bosen [ 09.22 2019-01-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Har en PD-motor inga glödstift?

Författare:  Janson1 [ 19.03 2019-01-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jo, den har ett stift i varje cylinder, totalt 4 stycken.

Författare:  Magnus_K [ 19.15 2019-01-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vet inte om det bidrar med något, men kan ändå nämna det.

Jag har alltid bytt kamrem själv och gjorde även så på PD-motorn som satt i min gamla Passat. Som vanligt följde jag alla markeringar och låste allt som skulle låsas.
Efteråt startade motorn jättefint, men på besiktningen 6 månader senare fick jag smisk på fingrarna - på tok för högt K-värde.

Efter en hel del felsökande och byte av diverse dyra komponenter så läste jag någonstans att man helst "riggar" motorn med VCDS och justerar kamremshjulet så "torsion"-värdet hamnar inom tolerans.
Jaha, kopplade in datorn och se på tusan, värdet var utanför sin tolerans.
Justerade detta men blev ganska uppgiven då märkte ingen skillnad alls på motorgången.
Väl på ombesiktningen så var K-värdet nu alldeles perfekt, nästan som när bilen var ny. Jättebra tänkte jag, tills vintern kom.. JÖSSES vad svårstartad den var nu istället!

När jag hade klurat lite så pluggade jag in datorn, ställde tillbaka "torsion"-värdet en aning och vred på nyckeln. Ja, den startade på första varvet oavsett hur kallt det var ute.

Det här var en lång saga till det jag försöker berätta, dvs att det kanske kan vara värt att kolla över riggningen på motorn en extra gång? :)

Författare:  Bosen [ 19.57 2019-01-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vid kallstart, hur kör du glödstiften? Är dom 12v eller 5v?
Kör du dem samtidigt som du kör startmotorn?
Anledningen att jag frågar är att glödstiften är helt klart det viktigste vid en kallstart!

Författare:  Janson1 [ 22.31 2019-01-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Magnus K: Intressant infallsvinkel! Nu har jag ju en egen styrning till motorn så jag tror inte kamtiderna påverkar lika mycket. Dessutom har jag inget digitalt verktyg att ställa emot då original ECU är väck. Men jag skall snart byta kamrem på den, får se om det går att luska ut om den kan justeras in bättre?
Bosen: Från början körde jag glödstiften först och sen under glödning startade jag (försökte). Kom ganska snart på det den kunde med glöden gick lika bra utan... dvs ingen skillnad. Det är 12 volts glödstift på denna motor, dom är parallella. Nu när jag monterat thermostartern så verkar den komma igång lättare, detta är inte utprovat än. Men anledningen till att den inbyggda glöden inte gör nån nytta borde bero på att det inte finns nåt brännbart... Alltså antingen för lite soppa eller soppa vid fel tillfälle eller en kombination? Men pga av allt bök med trasig vevaxelgivare så har mina så fint uppmätta tidsvärden havererat totalt, jag är lite lost just nu. Jag tror jag behöver mäta upp alltihopa från början igen så de finns något slags 0-läge att utgå ifrån...

Författare:  Bosen [ 08.18 2019-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Glödstiftet är ju till för att värma upp förbränningsrummet, inte för att värma upp bränslet. Att du värmer upp bränslet är ju bara en positiv sidoeffekt. Har du någon koll på hur glödningssekvensen funkar normalt på just den motorn?
Är du säker på att glödstiften är hela?

Författare:  Janson1 [ 10.11 2019-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Normalt sett så startar glöden vid en viss temperatur (några plusgrader) när man öppnar dörren för att stiga in. Om man inte startar så stängs glöden av efter en tid, annars så startar man motorn och glöden fortsätter en stund efter mes för avgasvärdenas skull. Alla fyra glödstiften är verifierat hela. Jag funderar vidare på om det kan bero på låg drivspänning vid startsekvensen som gör att spridarna blir strömsatta men det händer inget? Dom är rent matematiskt på i ca 30 grader på vevens rörelse.

Författare:  Janson1 [ 10.12 2019-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: Jag ser att du bor ju nästan nästgårds, kanske ett studiebesök och lite fika?

Författare:  Bosen [ 13.16 2019-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hehe, jo jag har funderat på det :D

Att glödningen bara är igång 30 grader låter väldigt lite... normalt sett på de vanliga äldre tdi-motorerna så är ju glödningen igång tills motorn startar.
Den delen du pratar om som håller dom igång en stund när motorn startas är ju upp till 4 minuter fast dom stängs av om man höjer varvtalet över en viss gräns. Att du bara kör glödstiften mindre än ett varv på motorn låter ju väldigt lite. Det tar ju runt 7-8 sekunder innan glödstiften är varma...

Författare:  Janson1 [ 15.05 2019-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det var nog inte så jag skrev, menade i alla fall inte... Spridarna är igång ca 30 grader vid start, själva glöden går för fullt innan och under start och om man vill en stund efter, min glöd är kopplad till växelspakens startläge.

Författare:  Bosen [ 15.06 2019-01-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Aha

Författare:  Janson1 [ 21.33 2019-02-04 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har jag kommit så långt att jag insett att jag måste ha en temperaturkännare till motorns temperatur. När den är kall skall den ha soppan väldigt tidigt för att starta, startar man motorn varm med samma insprutningsbörjan så startar den men bankar hårt några gånger innan den kommit över startfasen. Så jag har lagt in en analogmätning i setupen så det första den gör innan nåt annat är att just ta reda på motortempen. Detta blir mer och mer avancerat... Samtidigt hittade jag ett programmeringsfel/tankevurpa som jag levt med ganska länge. Jag har väl mest tänkt det som ett "fenomen", men nu är det fixat och mycket blev väldigt bättre. Tempgivaren då? Ja har ett Biltema instrument med en liten M-10 fingängad givare som jag gängar om och sen i i ett ledigt hål i blocket. Jag har testat den på några olika temperaturer och den verkar vara lätt att få till rätt värden motsvarande rätt insprutningsbörjan.

Författare:  Bosen [ 07.43 2019-02-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

...men det måste väl sitta minst en tempgivare orginal på den motorn?
De flesta vw-motorer brukar ha 2 tempgivare :humm:

Författare:  Janson1 [ 11.23 2019-02-05 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jodå, den har en egen givare, minst, men för att slippa släppa ut vattnet för att testa givarens kurva är det faktiskt mycket enklare med en lös och sen bara trycka dit i närmaste förborrat/gängat hål. Nu visade det sig dessutom att Biltemas givare stämmer mycket gott till mitt alster rakt av.
Edit: Men ja skulle ju kunna göra en jämförande mätning vid aktuell temp och se originalgivarens mätvärden, är det något så när lika så är det nog värt att testa..

Författare:  Janson1 [ 17.14 2019-02-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Bosen: jag testade original tempgivare som är dubbel, först lite handpåläggning. Hmm ljummen motor, om jag får ett värde på 17-1800 ohm så tänker jag prova att använda den. Först ca 800 ohm, för lite, sedan 1750 ohm, Bingo. Bra att du gav förslaget Bosen, den verkar kunna ligga i rätt härad i alla fall och det är inte superkritiskt på nåt sett. Starteriet då? Jo som ljummen så slutade den att banka precis mellan startvarv och tomgång så nåt har blivit bättre. Nu så står den medvetet ute för ett nytt startförsök i morgon. Nu har jag ju termostarten inkopplad och kan få igång den ändå men det är alltid trevligt om man vet att man hamnat rätt i tid och startmängd. Och, nu när programmeringsfelet är åtgärdat så har jag mycket mer justeringsmöjligheter så det bör gå att hitta rätt?

Författare:  Janson1 [ 21.56 2019-02-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Hänt nåt? Ja lite... Jag har använt original tempgivare och försökt mapa om den till att bli rätt men jag lyckas inget vidare. Nu i dag/kväll så gick jag på djupet och har nu stuvat om lite i koden så först strömsätts ECU:n, sen på slutet av setup så först en delay på 250 mS och sen avläsning av motortemp, får se om detta gör någon skillnad. Jag har även gjort tändförställningen lite annorlunda vilket jag tror passar motorn bättre? Sedan har jag dels ändrat "aggresionsfaktorn" (eget påhittat ord?) och dels maxmängd bränsle på höga varv så nu har jag fått tillbaka krämen! Nu verkar vevaxelgivaren lämna stabila, bra pulser så nu kan jag finlirprogrammera på riktigt.

Författare:  Janson1 [ 20.35 2019-03-10 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har tillfälligt gett upp det här med att mäta motorns temp precis innan start. Jag har nu valt en fast tid som funkar alltid. (Sen har jag ju thermostartern i insugningsröret som backup, en liten dieselbrännare för 150 kr helt enkelt...) Jag har tänkt om ang den här aggresionsfaktorn, dvs hur mycket mer soppa motorn bör ha vid undervarv och gaspådrag. Från början hade jag två värden, ett vid lågvarv och ett vid högvarv med brytpunkt runt 2400 rpm. Det har antingen visat sig för hysteriskt eller för lamt hur jag än programmerat. Så nu har jag byggt en reglering i % istället som tar hänsyn till varvtalet och gasens förflyttning, det blir mer som en bil, ju mer gas ju fortare accar den, men i mitt fall till ett fast målvarv. Jag använder ett kommando som heter delayMicroSeconds() och det har visat sig att det högsta talet (tiden) som detta kommando klarar är 16383 uS vilket inte alltid har räckt till vid dom låga varven över start så nu har jag gjort om sketchen så jag kallar helt enkelt på delayMicoSeconds() två gånger och vips så räcker insprutningstiderna till vid dom lägsta varven över start. (Vid startvarv gör jag om uS till mS och dividerar alla värden med 1000, det blir lite oexakt men motorn startar ändå) Vidare så har jag nu varvtalsbegränsat motorn till 3200 rpm för jag tycker det är lite för mycket obalans i motorns svänghjul. Jag är på jakt efter ett likadant fast utan dubbelmassaenhet, det lär finnas som passar rakt av. Är det någon som vet?
Edit: felstavat...

Författare:  Janson1 [ 09.35 2019-03-30 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har jag lyckats använda traktorn lite aktivt utan att göra om programmet hela tiden, faktiskt klarat mig mer än två veckor nu... Den sista omprogrammeringen gjorde nog susen, nu startar den bra kall som varm, kan göra ett spikande vid varmstart. Jag har monterat på skogskranen och vinschat stock, då går traktorn på tomgång hela tiden och inga problem med orken fast stockarna väger 100-200 kg styck? Däremot så har jag ingen vanlig kylfläkt som drivs av remmen utan bara en elfläkt, i dag kör jag den manuellt då och då. Jag funderar på att antingen köra den på lågfart hela tiden eller kanske låta ECU:n köra den via PWM? Det är inte kylvattnet som behöver kylas först utan det är bränslet... Kanske skulle fixa ett riktigt bränslekyl istället för en rörslinga framför befintligt kyl och sen en liten separat kylfläkt för bränslekylet.

Författare:  Janson1 [ 09.09 2019-04-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag provade att lägga in en PWM utgång till elkylfläkten på ECU:n och provkörde, ta mig tusan så funkar det att köra allt samtidigt, både alla livsuppehållande motorstyrfunktioner och 980 hz PWM utan att dom stör varandra. (jag trodde inte det gick faktiskt...) Nu kör jag utgången parallellt med gasen, jag börjar på 50 (20%) vid tomgång och sen 255 (100%) vid fullgas. Nästa steg är att koppla in en MOS-FET transistor för att få liv i fläkten. Totalt sett så har jag nu fått till starten, både kall (provat -6 gr.) och varm, fått till regleringen jämnt och fint från lägsta till högsta varvtal. Traktorn och dess VW-motor är nu faktiskt fullt användbar av alla som orkar och kan köra traktor...

Författare:  Janson1 [ 21.03 2019-04-06 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag funderar: Jag tror att både ECU:n och PWM-styrningen delar på en och samma timer, det blir en liten interferens då och då, nätt och jämt hörbart?

Författare:  Bosen [ 09.44 2019-04-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Vilken arduino kör du?
Vilken pin kör du elfläkten på?
Är det millis() eller micros() som du anväder i ”ecu”?

Till viss del skulle det kunna påverka om du inte kör ecu interruptstyrt. Jag kommer intr ihåg om du hade börjat med interruptstyrt eller om du fortfarande använder din ”gamla kod”?

Författare:  Janson1 [ 20.40 2019-04-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag använder pin 6 för elfläkten (980 hz PWM frekvens) Och jag har modell NANO Atmega328.
Vid startvarv använder jag millis och vid drift Micros.
Detta alster är utan interrupt men som du kanske vet så har jag börjat på en interruptstyrd ECU också. Jag har ju lovat att när denna ECU är fullt körbar och jag kan släppa den, då skall jag ta tag i nästa generation ECU...

Författare:  Bosen [ 20.48 2019-04-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/
Citera:
Notes and Warnings

The PWM outputs generated on pins 5 and 6 will have higher-than-expected duty cycles. This is because of interactions with the millis() and delay() functions, which share the same internal timer used to generate those PWM outputs. This will be noticed mostly on low duty-cycle settings (e.g. 0 - 10) and may result in a value of 0 not fully turning off the output on pins 5 and 6.


Pin 5 och 6 använder samma timer som micros och millis, men det borde inte märkas på micros och millis-delen utan snarare att pwm-utgångens dutycycle inte riktigt är konsekvent. Det är så jag uppfattar det iallafall. Du kan ju testa en annan pwm-pin istället 5 eller 6 och se om du får samma problem...

Författare:  Janson1 [ 05.53 2019-04-08 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja enligt Arduino själva så verkar det vara ev. problem med PWM delen men den kan jag omöjligt höra under drift och jag har kört denna kombination ECU/PWM på scopet länge under olika varvtal och olika "belastningar" och kan inte finna nåt som sticker ut. Nu har vi använt traktorn i helgen till vedkörning mm och allt funkar så totalt sett är jag ganska nöjd, det är bara svänghjulet som skall bytas och balanseras sen... Denna pinne 6 är den enda pinnen som var ledig så prova någon annan pinne går inte. Om jag inom snar framtid hittar nåt riktigt dåligt med denna uppkoppling så har jag ju ECU-kontroll NANO:sarna kvar att attackera med PWM till elfläkten…

Författare:  Janson1 [ 21.52 2019-04-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja nu blev det ett nytt svänghjul i helgen. Jag beställde ett begagnat från Spanien som dök upp i fredags. Det passade på motorn men hade en annan delning på tryckplattans bultar så jag skaffade en ventilerad bromsskiva till nån Volvo av nåt slag då den hade rätt tjocklek och rätt diameter nästan från början. Sen var det "bara" lite svarvande, fräsande och allmän inpassning så ihop med traktorn igen. Nu är oljudet i svänghjulet borta men nu tycker jag den låter lite i från topplocksregionen istället, hmm, får nog ta loss kåpan och titta efter vad som fattas... Däremot blev det ingen balansering denna gången, tveksamt om det behövs?

Författare:  Bosen [ 05.45 2019-04-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det räcker säkert med en statisk balansering. Det är ju väldigt enkelt när man har hjulet löst.... men nu har du ju satt fast det :)

Författare:  Janson1 [ 21.03 2019-04-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja från början vad det tänkt att göra en statisk balansering men jag hittade inga grejer som passade överhuvudtaget. Det hade nog gått att få till om det bara gällde svänghjul och bromsskiva men med tryckplattan på blir det mycket bökigare. Men som sagt, det kanske inte är så känsligt. Nu har jag i kväll bytt kamrem och oljefilter, passade även på att kontrollera kamaxeln och spridarna och det såg bra ut. Efter detta så är det läge att ställa upp varvtalet...

Författare:  Janson1 [ 22.42 2019-05-11 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Totalt sett så är jag ganska nöjd nu, den startar från -6 grader till fullt varm motor i alla lägen, den går bra på hela varvregistret, kylfläkten verkar inte störa den övriga funktionen alls, jag har nog hört fel förut? Nu väntar jag på en annan nästan likadan motor som jag skall labba vidare på. ev så har den ett annat tandhjul, 60-2 tänder istället för 30-2+30-2 som det nuvarande hjulet har.
Så nu blir jag kanske tvungen med interruptbaserat program i framtiden...

Författare:  Janson1 [ 21.54 2019-05-15 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu har jag fått till en interruptbaserad ECU. Det var faktiskt enklare än vad jag trodde från början, jag bytte helt enkelt ut puleIn() mot den interruptrutinen som klas-kenny gjorde för ett tag sen och sen fick jag göra om på en del värden och vips så funkar det på kammaren mot oscilloskopet i alla fall... Jag tycker den ser mer stabil ut, signalen. Men den största vinsten blir ju att i framtiden kvittar det om den har 30-2+30-2 tandhjul eller 60-2 tandhjul och 3, 4, 5 eller 6 cylindrar blir ganska lätt att få till med en liten förändring i programmeringen. Nästa grej är att testa på traktorn...

Författare:  Bosen [ 10.25 2019-05-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, interrupt är ett "annat tänk", men om man bara får "in tänket" så är det nästan lättare att få till :)

Författare:  Janson1 [ 20.53 2019-05-16 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Nu är det testat på traktorn, förutom att jag missade att dubbla/halvera några parameter så fick jag till det mesta på första försöket... Jag märker ingen skillnad på gången men jag hoppas den blir bättre på högvarv sen när jag fått till en balansering av svänghjulet och sen ställer upp maxvarvtalet till rätt tilltänkt maxvarv (4200 rpm)
Nu är det väl dags att programmera om motorsimulatorn till att lämna ut 60-2 pulser istället...
Å så lite stresskörning med för att se när ECU:n kroknar...

Författare:  Janson1 [ 12.14 2019-05-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Tack vare interrupt så blev det "sketenkelt" att programmera om för det nya tandhjulet, 60-2 och om cylinderantalet skulle skilja sig så är det inte heller några större problem att få till... Däremot så märker jag ingen som helst skillnad i motorgång mellan interuptprogrammet och det "gamla vanliga" jag har ju en knapp så jag kan skifta program i farten, behöver inte stänga av eller nåt sånt, bara att skifta mellan A och B. Det enda negativa för interruptprogrammet är att det är nåt vid starten som inte är perfekt, förmodligen har jag missat/felberäknat nåt viktigt värde?

Författare:  Janson1 [ 21.22 2019-05-20 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag tog mig tid att programmera om min av en från början annan forumsmedlems motorsimulator. Jag vill ju att den skall bli lite mer "multi" Så nu har jag programmerat om den så den kan ge två olika vevaxelpulser 30-2+30-2 och 60-2. Även kamaxelpulserna har fått två lägen för en med en puls per 720 grader och en med 7 pulser per 720 grader. Vidare har jag gjort fyra olika varvtalsområden till poten, start/lågvarv, normalt varvtalsområde, normalt arbetsvarvsområde och stressvarvtalsområde för att se när ECU:n kroknar... Nu gäller det bara att bygga in detta i en för mig lämplig låda, inte det lättaste att hitta.

Författare:  Janson1 [ 06.55 2019-05-26 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag fick till en låda till sist, jag är väl egentligen inte speciellt nöjd men det är bättre än inget och jag har fått till allt som behövs, tror jag?
Bilaga:
20190526_074539.jpg

Författare:  Bosen [ 08.00 2019-05-27 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Snyggt! :tumupp:

Författare:  Janson1 [ 21.19 2019-05-28 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag beställde hem en ny Arduinokompatibel modul och till det ett måsteinterface. https://eu.banggood.com/Wholesale-Wareh ... ds=myorder och https://eu.banggood.com/Wholesale-Wareh ... ds=myorder Jag fick hem korten idag och gjorde ett programmeringsförsök Jag konfigurerade en port och la in ett litet blinkprogram som faktiskt fungerade direkt. Glad i hågen så gjorde jag om alla I/O på ECU-programmet så dom skulle passa det nya STM-kortet. Att kompilera går bra fast det tar mellan 2 till 5 minuter, (jag hinner bre mig en macka under tiden). Sen har jag inte lyckats programmera in nåt nytt, den klagar på: Kan inte hitta DFU delen, fast på engelska. Så nu kan jag inte programmera in nåt mera... Jag flyttar en bygel, trycker på reset, jag kan se att den går ur blinkprogrammet och ställer sig förmodligen i programmeringsmode? Men sen skiter det sig. Efteråt så ligger blinkprogrammet kvar.
Vad göra? (Jag har en STM-modul och interfacemodul om det är någon som vill testa)

Författare:  Janson1 [ 20.17 2019-06-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag hittade felet, jag skulle valt seriellt men hade valt nåt annat... Nu funkar programmeringen och t.o.m. alstret fungerar som jag tänkt. Jag går i valet och kvalet om jag skulle hoppa på ett nytt IDE, typ Atollic eller så och byta till STM32? Jag vet inget om detta så jag kanske är ute och seglar? Jag har fått en hint om att skaffa en Nucleo av något slag och jag har siktat in på STM32F103RBT6 då den liknar mest min "Blue pill"? Så, är det dags att lämna Arduinos IDE?

Författare:  mrfrenzy [ 21.22 2019-06-01 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

St10f var ju väldigt populärt när din motor byggdes bland OEM.
Numera är det bara 32-bit som gäller typ TC1797, MPC5556 och framåt.

Författare:  Janson1 [ 05.55 2019-06-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja, det har i alla fall blivit STM32CubeMX som programmeringsmiljö och två st Nucleo är beställda. Jag är tveksam till att jag fixar detta...

Författare:  mrfrenzy [ 07.57 2019-06-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Du kommer säkert lösa det galant. Grunderna och logiken i programmeringen har du ju uppenbart behärskat. Det är bara frågan om att läsa datablad för stm32 och lära sig ett nytt IDE.

Författare:  mankan [ 17.31 2019-06-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Det finns ju Arduino till STM32 också, http://www.stm32duino.com/.

Författare:  Janson1 [ 21.25 2019-06-03 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Oj, ett helt forum om bara STM32...

Författare:  Janson1 [ 10.00 2019-06-12 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har nu skaffat en VW CR-diesel. Det blir nog en del bita i, den har förutom fyra spridare att styra så även styrning och mätning av railtrycket, och en bränslebegränsningsventil skall styras också förutom turbotrycksventilen, så totalt 7 utgångar varav 3 med PWM. Ev så kan man även lägga till en reglering av insugningsspjäll som bestämmer om den skall suga in luft via en eller två insugningsventiler (den har fyrventilsteknik), man kan nog lämna detta spjäll vidöppet? Railtrycket skall vara mellan 230-1800 Bar beroende på varvtalet och mängdregleringsventilen skall justeras så att pumpen bara pumpar lite mer än vad som behövs. Jag har väl en liten idé om hur det skall göras...

Författare:  adent [ 12.15 2019-06-13 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Du får masa dig på tisdagsträff på Makers Jönköping nån gång! Vi är ett gäng som kan STM32. En styrelsemedlem jobbar på Atollic (numera uppköpt av ST).

Vi har kört en STM32-kurs för inte så länge sen, inte omöjlígt att det kommer i repris!

Kul projekt!

MVH: Mikael

Författare:  Janson1 [ 07.38 2019-06-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ja det låter ju ganska bra, lite långt bort bara. Men som en engångsgrej kan jag ju komma upp. Egentligen vill jag behålla min Arduinomiljö och bara få till interruptdelen att fungera med Arduino-STM32 modulen. Jag fick hem två Nucleo-moduler i veckan, en STM32F103 och en STM32F404? (blev det rätt där?) Dom kräver helt ny miljö (IDE) men där har jag bestämt mig för att det får bli till hösten när tid och inspiration för innesittande finns, nu är jag alldeles för splittrad för att kunna tänka en tanke hela vägen. (Jag servar och lagar folks privat och klubbflygplan sommartid). Men till hösten mattas flygsverige av och då finns tid igen. Men nåt som jag verkligen skulle vilja få till i sommar är just interrupfunktionen i Arduinomiljö och STM32 modulen, den fungerar riktigt med mitt ECU-program utan Interrupt men vägrar kompilera med, inga specifika varningar, bara tvärstopp, vad göra?

Författare:  Janson1 [ 23.03 2019-06-14 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Felet är nog hittat, själva kompilatorn hade hängt sig, efter en "master reset" (ryckte ur sladden) så funkar det igen, så... pååt igen!!

Författare:  Janson1 [ 22.16 2019-06-19 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Sitter just nu och klurar med STM32 modulen "blue pill". Den har 12 bitars analogconverter istället för 10 bitars som på Nano:n. Jag blir nu tvungen att bitskifta 2 resp 4 gånger för att få rätt upplösning men det är inga problem. Jag har även provat interruptprogrammet men det är nåt som går snett där. Den funkar men jag tror att när intrruptrutinen kallas. Spridarutgångarna får en felsignal då och lite random, speciellt på högre varvtal. Jag misstänker själv att jag behöver göra ett nytt program med ett annat tänk lite här och var?

Författare:  Janson1 [ 06.16 2019-06-24 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har fått lite hjälp med programmeringen/felsökningen nu och fyra ögon ser mer och förstår mer än två. Om jag inte lyckas med att få "Blue Pill" modulen att fungera som jag vill så har jag en idé om att köra vidare med Nano-modulen och köra förutom dom fyra spridarutgångarna även använda tre PWM utgångar för att styra bränsletryck, bränslemängd och turbotryck. Denna sista motor har inte någon spjällmotor mellan fyra eller åtta insugningsventiler så den styrningen bortfaller. En Nano skulle klara detta precis om den rent kapacitetsmässigt klarar allt på en gång?
Då jag är "inkörd" på Nano-Uno moduler så kommer jag i alla fall att försöka lösa detta på mitt sätt så långt det går. Interrupt blir tvunget...

Författare:  Janson1 [ 08.29 2019-07-07 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Min hjälpare har nu gjort om coden från Arduino:n till att passa Nucleomodul STM32F446 och det har varit en del flaskhalsar på vägen... Nu skall vi göra en adapter från NANO:ns 30 poler till Nucleos många mera poler och ett annan storlek och utförande på inkopplingen.

Författare:  Janson1 [ 00.33 2019-07-18 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Ett annat problem som dykt upp är att NANO:n är 5 voltsdriven medans STM32Fxxx är 3,3 voltsdriven. Detta innebär andra MOS-transistorer och en annan analog referensspänning. Ev så skulle man kanske bygga nån slags push-pull drivsteg till MOS:arna och behålla dom här IRFZ44N som jag kör i dag? Nu har jag inga som helst värmeproblem på spridarslutstegen men den MOS:en som driver elfläkten blir ljummen... (Det går ca 10 Amp hackad ström genom den kontinuerligt) Är det någon som har förslag på push-pull lösning? Skall man göra den med nån färdig ic eller med transistorer/motstånd?

Författare:  Janson1 [ 19.42 2019-09-17 ]
Inläggsrubrik:  Re: ECU- styrning till en VW pumpdysediesel.

Jag har nu tillfälligt i alla fall bestämt mig för att köra vidare med NANO:n. Har nu försett den med två PWM utgångar, den ena får fortsätta driva kylfläkten och den nya PWM skall driva bränslehögtryckventilen (HPFV) PWM för kylfläkt som följer gasläget (poten) och PWM hpfv som följer varvtalet (via motorns duration), ju högre varvtal ju högre tryck pga kortare möjlig insprutningstid. Sedan finns en analog tryckgivare som känner trycket i högtrycksröret (railen) Ett ev problem med denna högtrycksgivare är att pga av att högtryckspumpen är encylindrig och har två nockar så ger den bara bränsle/tryck precis vid insprutningstillfället vilket ger en ganska kort tid att mäta trycket på. Jag funderar på att göra en RC-krets där och få ett medelvärde som sen läses när ECU:n har tid? Får tänka vidare.... Förslag?

Alla tidsangivelser är UTC + 1 timme
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/