På volvo trucks så har pumpedyseinjektoren brukt å ha 80-90V spenning til styring av dem.
Sent fra min SM-G950F via Tapatalk
#include <PureAtmega328.h>
// här är 13 olika justerbara parametrar som påverkar enligt följande:
const int tryckminskn = 60; // turbotrycket ställs in här, högre tal = mindre tryck (60)
const int lagstavarv = 580; // tomgångsvarvet 580 uS motsvarar ca 800 Rpm (580)
const byte hogstavarv = 90; // fullgasvarvet 100 uS motsvarar ca 4200 RPM (100)
const byte aggrfaktorlag = 8; // hur mycket spridar PWM skall öka vid belastning mellanvarv (8)
const byte aggrfaktorhog = 12; // hur mycket spridar PWM skall öka vid belastning högvarv (12)
const int minfart = 3300; // lägsta startvarv för spridarfunktion (3300 uS = 152 RPM)(3300)
const byte startmangd = 5; // avgör max startmängd 5 = 0,75 vevaxelpulser = 4,5 grader ontid (5)
const float maxdeltalag = 6.0; // max insprutningstid mellanvarv mdutation * 6.0 ger 3 vevaxelpulser = 18 gr ontid (6.0)
const float maxdeltahog = 8.0; // max insprutningstid högvarv mdutation * 8.0 ger 4 vevaxelpulser = 24 gr ontid (8.0)
const byte lagmangd = 2; // max lågvarvsmängd 2 = 1 vevaxelpuls = 6 grader ontid (under tomgångsvarv)(2)
const byte turbostartregl = 150; // när tubotrycket börjar avläsas och bli aktivt (150 = uS mduration ca 3200RPM)(150)
const float senasteinspr = 8.0; // senaste insprutningstid (8.0 = 4 vevaxelpulser = 24 grader delaytid =6 grader FÖDP) (8.0)
const float tidigasteinspr = 60; // kortaste insprutningsfördröjning (60)
// 60 motsvarar tand 19 = 24 grader FÖDP
// 30 motsvarar tand 20 = 18 grader FÖDP
int debuggpin = 4; // debuggpin startar Serial.printfunktionen vid behov
int kampin = 3; // kamaxelgivarens ingång, (aktivt låg).
int vevpin = 2; // pulsingång vevaxelgivare, (aktivt låg).
int pulsutpin = 7; // pulsutgång 2 pulser per varv (kontrollutgång för övervakningen).
int sprpins [] ={8,9,10,11}; // 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 turbokorr, turbovalue; // felkorrigeringsvärde turbo och turbovärde
int turboAirTemp, engineTemp; // turbo in temp och motortemp.
unsigned int delvalue; // delvärde av pulstid i uS.
unsigned int ondelay; // tillslagsfördröjning spridare i uS.
long puls, priv, delta; // senaste, föregående,total och finkorrigeringstid i uS,
float error; // error = varvfelet i decimalform
float starttandf, finKorr; // starttand i decimalform för att få startfördröjningstid.
float mduration, bduration; // varvfelet = motorduration/börduration i decimalform
byte x = 0; // vevpin2 räknare 0 till 28, i alla fall till 26
byte gas, turbo, pekare; // gas 0-255, turbo 0-127, pekare för att välja rätt spridarutgång
byte kamtand = 0; // Kamtand för att sluta detektera kamaxelgivaren efter några tänder
int atmpress; // atmosfärstrycket i mBar
void setup()
{
pinAsInput(vevpin); // satt vevpin som ingång
pinAsInputPullUp(kampin); // satt kampin som ingång
pinAsOutput(sprpins[pekare]); // 8,9,10,11 satta som utgångsarrey
pinAsOutput(sprControl); // en spridarutgång som blir hög varje gång en spridare öppnas.
pinAsInputPullUp (disable); // ECU väljare Hög = on, Låg = off.
pinAsOutput(pulsutpin); // satt pulsutpin som utgång (2 pulser per varv).
pinAsInputPullUp (debuggpin); // debuggpin väljer serial.printfunktionen Låg = on.
Serial.begin(250000); // bra att ha.
}
//______________________________________________________________________
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 19!
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*
x ++ ; //räkna upp ett steg för varje ny puls, kommer via pulseIn()funkt.
if (kamtand <= 50) // när tand 51 är räknad slutar den detektera kampin.
{
if (digitalRead(kampin)== LOW)//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 (x) // här startar switch och case, x räknaren stegar fram per tand
{
case 1: // Vid första vevpinpuls Gör:
delvalue = priv; // Första pulstid läggs in som deltid 1
break;
case 2: // Vid andra vevpinpuls Gör:
delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
break;
case 3: // Vid tredje vevinpuls Gör: osv
// turbotrycket ställer ner motorns PWM signal til spridarna vid måltrycket
turbokorr = map(turbo, 0, 127, 0, tryckminskn); // tryckminskningen ställs högst upp
delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
break;
case 4: // motorns börvärde från gaspoten blir lägsta varvtal och högsta varvtal
bduration =map(gas,0, 255, lagstavarv, hogstavarv); // ställs in högst upp
delvalue = priv + delvalue; // föregående pulstid + föregående deltid läggs ihop
break; // (660 - 115 uS = ca 800 till 4200 rpm)
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 9:
mduration = delvalue/12; //motorns totala pulstid i mikrosek dividerat med 12 (6x2).
if(mduration >= minfart) // motorn måste upp i x varv för att få bränsle, ställs högst upp
{
mduration = 0;
}
break; //ger motorns verkliga fart baserat på dom 8 första tänderna. 660 - 115 uS vid normalvarv ca 800 till 4200 rpm.
case 10:
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; // felet i uS mellan är och börvärde för motorns fart baserat på pulslängderna över 9 tänder
case 11:
// finKorr = finKorr - ; // som exempel men nu ledigt
break;
case 12:
// ledigt
break;
case 13:
starttandf = 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 (starttandf >= senasteinspr) // om över målvärdet (som ställs in högst upp)
{
starttandf = senasteinspr; // blir det målvärdet ändå
}
break;
case 14:
ondelay = mduration * starttandf;// tillslagsfördröjning = motorns duration * starttandsfördröjning (decimaltal)
break; // Ondelay uS = mduration uS * starttandf i decimalform (från case 13)
case 15: //en ev. finjustering av spridarnas tillslagstid med hänsyn till
// ondelay = ondelay +-*/ engineTemp +-*/ turboTemp +-/* turboKorr;//ledig. än så länge...
break; //motorn temp, turboluftens temp och turbotrycket, ev atm trycket.
case 16:
if (mduration >=151)
{
delta = mduration * error * aggrfaktorlag; // Felkorrigeringsvärde som ger spridaröppningstid i uS (mS)
if (delta >= maxdeltalag * mduration) // om delta är mer än max tillåten delta x mduration
{
delta = maxdeltalag * mduration; // förblir delta max tillåten
} // detta är inställningen för absolut senaste avstängningstid
}
if (mduration <= 150)
{
delta = mduration * error * aggrfaktorhog;
if (delta >= maxdeltahog * mduration)
{
delta = maxdeltahog * mduration;
}
}
break;
case 17:
if (mduration <= turbostartregl) // här bestämms varvtalet när turbon skall börja regleras ner
{ // ställs högst upp
delta = delta - turbokorr; //korrigering för måltryck genom att minska öppningstiden i uS
if (delta <=0)
{
delta = 0;
}
}
if (mduration >= 700) // för att få mjukstart vid motorstart.
{
delta = lagmangd * mduration; // mjukstarten justeras via lågmängd högst upp
}
break;
case 18: // När puls 18 är räknad, gå in i "spridar-on-off-mode"
if (ondelay >=14000) // Om ondelay är mer än 14000 uS. ( < 250RPM )
{ // 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 >= 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.
} //Detta paket används vid låga farter såsom start/lågvarv
else //Eller om delay är mindre än 14000 uS. (> 250 RPM)
{
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.
} //Detta paket används vid varv (250 -> RPM)
break; //Dessa paket tar 1 till 6 pulser att genomföra beroende på varvtal och belastning
case 19: // x är mellan 19 och 24
gas = analogRead(A1)>>2; // analogingång för gasreglage 0 till 255( skiftad 2 gånger)
turbo = analogRead(A0)>>3; // analogingång för turbotryck 0 till 127 (skiftad 3 gånger)
engineTemp = 10 * analogRead(A2)>>1; // 0 till 512 0,1 Volt/10 grad använder LM-35 tempgivare
turboAirTemp = 10 * analogRead(A3)>>1;// 0 till 512 0,1 Volt/10 grad använder LM-35 tempgivare
atmpress = analogRead(A4)>>3; // analogingång för lufttrycket
break; // dessa fem analalogRead tar ca 600 uS att läsa = 3-4 tänder vid fullvarv
case 20: // x är mellan 20 och 28
if (digitalRead(debuggpin) == LOW) // detta case 20 fungerar bara på låga varvtal!!
{ // aktiveras via debuggpin (aktivt låg)
Serial.print("ondelay "); // Isprutningsfördröjning i uS
Serial.print(ondelay); // hämtar ondelay-värdet och skriver ut
Serial.print(" = "); // =
Serial.print(mduration); // hämtar Motorns duration per tand i us och skriver ut
Serial.print(" * "); // *
Serial.println(starttandf); // hämtar aktuell Multiplikationsfaktor för insprutningsfördröjning
Serial.print(" starttandfin "); // skriver ut "starttand fin"
Serial.print(delta); // hämtar Insprutningslängd i uS eller mS
Serial.println(" uS/mS"); // skriver ut " milli eller mikrosekunder"
}
else // om debuggerpin hög så skrivs inget ut
{ // detta är normalläget då hela serieprintfunktionen tar kapacitet från resten
}
break;
}
//______________________________________________________________________________________________________
priv = puls; // lägger in den förra pulstiden i värdet "priv" (uS)
puls = pulseIn(vevpin, HIGH, 30000); // Ett färdigt kommando som väntar in nästa puls.
// vid stillastående motor blir det en timeout
// efter 30000 uS vilket motsvarar < 30 RPM.
if (puls > priv + 300 ) // 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
x = 0; // resetar 0 till 28 räknaren som bara har hunnit räkna mellan 22 och 27 pulser
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 (puls < priv - 300) // 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.
}
}
// end void loop()
13 - 260µs Conversion Time
Återgå till [Allmänt] El/elektronik
Användare som besöker denna kategori: Inga registrerade användare och 3 gäster