W najprostszym wydaniu sterujemy dwoma parametrami - czasem trwania wtrysku benzyny oraz kątem wyprzedzenia zapłonu. Oczywiście wartości tych parametrów zależą od wielu czynników jak aktualnie ciśnienie, temperatura w dolocie, temperatura płyny chłodzącego, ciśnienie w kolektorze ssącym, ciśnienie atmosferyczne, położenie przepustnicy, opóźnienie otwarcia i zamknięcia wtryskiwacza zależne od aktualnego napięcia w instalacji elektrycznej czy w końcu opóźnienia w module zapłonowym. Zapomniałbym jeszcze o wskazaniach z sondy wąsko lub szerokopasmowej oraz kilku innych nieznanych mi zależnościach stosowanych we współczesnych silnikach mających na celu spełnianie norm emisji spalin czy zapewnienia niskiego spalania. Na szczęście dla mnie silnik który mnie interesuje pochodzi z lat 90-tych tak więc nie ma zbędnych elementów.
Tyle tytułem wstępu, w tym poście skupię się na wtrysku paliwa a kwestie związane z zapłonem zostawię na później.
Wartość która jest potrzebna to czas otwarcia wtryskiwaczy w milisekundach który pozwala dostarczyć taką ilość paliwa aby zapewnić wymagane AFR (stosunek paliwa do powietrza) przy obecnych warunkach (ciśnienie, temperatura, sprawność).
$$PulseWidth = InjectorOpeningTime + BatteryCorrection + \\ \frac{RequiredFuelMass}{InjectorFlowRate} + CustomLinearCorrection$$
Na razie pominiemy jednostki ale od razu uprzedzam, że z przeliczeniami będzie trochę roboty. Na wielu stronach stosowane są amerykańskie jednostki do tego czasami wymieszane z układem SI.
Zakładając, że podczas otwierania wtryskiwaczy paliwo jest już jednak częściowo wtryskiwane powyższe równanie można skorygować dodając dodatkowy współczynnik (więcej tutaj):
$$PulseWidth = 0.67*(InjectorOpeningTime + BatteryCorrection) + \\ \frac{RequiredFuelMass}{InjectorFlowRate}+CustomLinearCorrection$$
Gdzie:
- PulseWidth - czas otwarcia wtryskiwacza
- 0.67 - współczynnik wynikający z tego, że podczas otwarcia wtryskiwacza paliwo już jednak płynie (ale jedynie w ⅓ normalnej przepustowości)
- InjectorOpeningTime - czas bezwładności/otwarcia wtryskiwacza
- BatteryCorrection - wydłużenie lub skrócenie czasu otwarcia wtryskiwaczy wynikające z innego napięcia w instalacji
- RequiredFuelMass - masa potrzebnego paliwa przy aktualnych warunkach panujących w silniku i założonym AFR
- InjectorFlowRate - wydajność wtryskiwaczy
- CustomLinearCorrection - np. wzbogacenie związane z przyspieszaniem
We wzorze nie ma czasu zamknięcia wtryskiwaczy, który także jest niezerowy ale o tym można poczytać tutaj.
Największą niewiadomą jest RequiredFuelMass który można uzyskać na dwa sposoby, stosując Speed Density lub algorytm bazujący na MAF sensorze. Galant używa MAF do sterowania 4G63, tak samo robi Evo w przypadku 4G63T. Natomiast większość Hond z tamtego okresu działa na MAP i zmodyfikowanej wersji Speed Density w której liczba obliczeń jest zredukowana do minimum.
MAP Sensor - Speed Density
Nie będę opisywał dokładnie teorii na jakiej zasadzie działa ten algorytm gdyż można ją znaleźć na wielu stronach (np. tutaj). W skrócie algorytm wywodzi się z równania stanu gazu doskonałego i sprowadza się do poniższego stwierdzenia “wymagana ilość paliwa zależy od gęstości powietrza, ciśnienia, sprawności oraz oczekiwanego AFR”. Można to zapisać za pomocą poniższego wzoru:
$$RequiredFuelMass = BaseRequiredFuelMass*VE(MAP,RPM) \frac{MAP}{MAP(WOT)}\frac{14.7}{AFR}$$
Gdzie:
- VE - volumetric efficiency, wydajność gdzie 0 = 0%, 1 = 100%
- 14.7 - stechiometryczne AFR
- AFR - współczynnik nadmiaru powietrza
W którym współczynnik BasReqFuelMass jest bezpośrednio zależy od gęstości powietrza.
$$BaseRequiredFuelMass =D(Bar,IAT) \frac{V_{engine}}{N_{cyl}} \frac{l}{14.7}$$
Gdzie:
- D - gęstość powietrza
- Vengine - pojemność silnika
- Ncyl - liczba cylindrów
- 1/14.7 - normalizuje stosunek paliwo powietrze do stechiometrycznego
- MAP - ciśnienie w kolektorze ssącym
- MAP(WOT) - ciśnienie w kolektorze ssącym przy maksymalnie otwartej przepustnicy, zazwyczaj jest równe ciśnieniu atmosferycznemu, czyli około 100kPa
Łatwo można zauważyć, że VE(MAP, RPM), MAP/MAP(WOT) oraz 14.7/AFR to tak naprawdę korekty. Z powodu ograniczonej mocy obliczeniowej zazwyczaj BaseRequiredFuelMass jest liczone raz a później stosowane są jedynie m.in. powyższe korekty (robi tak np. Megasquirt, GM czy Honda).
Gęstość powietrza
Wracając do wzoru, niewiadomą wciąż jest gęstość powietrza, którą wyliczamy korzystając z prawa idealnego gazu (szczegóły tutaj).
Wychodząc od równania dla idealnego gazu:
$$P*V=n*R_g*T$$
Gdzie:
- P - ciśnienie
- V - pojemność
- n - liczba moli
- Rg - uniwersalna stała gazowa
- T - temperatura w kolektorze [Kelvin] lub [Rankine], zależnie od pozostałych współczynników
- 1 mol = 6.023x10^23 molekułów gazu
A następnie używając wzoru na gęstość (i dwóch innych):
dostajemy:
$$D=\frac{m}{V}=\frac{n*MM}{\frac{n*R_g}{T*P}}=\frac{MM*P}{R_g*T}=\frac{MM*P}{R*MM*T}=\frac{P}{R*T}$$
Gdzie:
- D - gęstość
- m - masa
- V - objętość
- n - liczba molekuł
- MM - masa molekułowa
- R - stała gazowa konkretnego gazu
- Rg - uniwersalna stała gazowa
Po dodaniu korekty związanej z parą wodną i wilgotnością mamy:
Gdzie:
- D - gęstość powietrza
- P - sumaryczne ciśnienie, Pd + PV
- Pd - ciśnienie suchego powietrza
- Pv - ciśnienie pary wodnej
- Rd - stała gazowa dla suchego powietrza 287.05[J/kgK]
- Rv - stała gazowa dla pary wodnej 461.495[J/kgK]
- T - tempetura [K]
Wilgotności nie da się łatwo zmierzyć w samochodzie, dlatego zakłada się wilgotność na poziomie 75% przy 85F tak więc 0.378 Pv wyniesie 3.1[kPa] (wg EFI332 oraz wg MegaSquirt Manual).
$$D(Bar,IAT) = \frac{1}{R_d}\frac{Bar - 3100[Pa]}{IAT[K]} \\ \rightarrow [\frac{1}{\frac{J}{kgK}}][\frac{Pa}{K}]=[\frac{kg*K}{kg\frac{m^2}{s^2}}][\frac{\frac{kg}{ms^2}}{K}] =[\frac{kg}{m^3}]$$
W tym momencie mamy już wszystkie składowe więc możemy wrócić do wzoru na ilość paliwa:
$$RequiredFuelMass = BaseRequiredFuelMass* \\ VE(MAP,RPM)\frac{MAP}{MAP(WOT)}\frac{14.7}{AFR} = \\ = \frac{1}{R_d}\frac{Bar - 3100[Pa]}{IAT[K]} \frac{V_{engine}}{N_{cyl}} \frac{1}{14.7}* \\ VE(MAP,RPM)\frac{MAP}{MAP(WOT)}\frac{14.7}{AFR}$$
$$PulseWidth = 0.67* (InjectorOpeningTime + BatteryCorrection) + \\ \frac{RequiredFuelMass}{InjectorFlowRate}+CustomLinearCorrection$$
Wzbogacenia i dodatkowe korekty
Mamy już czas trwania wtrysku, pozostaje wprowadzić wzbogacenia bez których samochód nie będzie dobrze przyspieszał czy kompensował wpływu niskiej temperatury, czyli RequiredFuelMass zamieniamy na RequiredFuelMassEnriched:
$$PulseWidth = 0.67* (InjectorOpeningTime + BatteryCorrection) + \\ \frac{RequiredFuelMass_{Enriched}}{InjectorFlowRate}+CustomLinearCorrection$$
$$RequiredFuelMass_{Enriched} = RequiredFuelMass *F_{Enrichments}$$
Jeśli chodzi o współczynnik to można stosować kilka różnych wariantów:
$$F_{Enrichments} = \frac{100 + Start_{E} + AfterStart_{E} + Warmup_{E} + O2_{E}}{100}$$
lub
$$F_{Enrichments} = \frac{Start_{E} [\%]}{100}\frac{AfterStart_{E} [\%]}{100}\frac{Warmup_{E} [\%]}{100}\frac{O2_{E} [\%]}{100}$$
Ciekawym tematem jest korekta związana z przyspieszaniem/hamowaniem. W zależności od podejścia zależy od zmiany w położeniu przepustnicy (stare położenie - nowe położenie odpowiednio wygładzone) lub od szybkości zmiany położenia przepustnicy (czyli delta TPS / s). Po wyliczeniu samej korekty w zależności od wariantu dodaje się ją do CustomLinerCorrection lub do FEnrichments. Do tego tematu wrócimy później.
Powyższe wyliczenia vs MegaSquirt vs EFI332
Łatwo także zauważyć, że dzieląc BaseRequiredFuelMass przez InjectorFlowRate otrzymujemy REQ_FUEL używane w MegaSquirt.
$$ReqFuel = \frac{BaseRequiredFuelMass}{InjectorFlowRate}=D(Bar,IAT)* \\ \frac{V_{engine}}{N_{cyl}} \frac{1}{14.7}\frac{1}{InjectorFlowRate}$$
Tak więc równania zdają się mieć sens. Jedyna różnica jest taka, że równanie z EFI332 używa AFR przy wyliczaniu RequiredFuelMass natomiast MegaSquirt nie. Pytanie czy VE powinno być skalowane przez AFR? Jestem skłonny założyć, że nie gdyż to VE definiuje pośrednio AFR chociaż z drugiej strony można założyć, że table VE jest zbudowana dla AFR równego 14.7.
Kolejna różnica to wzbogacenie przy przyspieszaniu. EFI332 mnoży prze jakiś współczynnik natomiast MegaSquirt dodaje czas.
W sumie to tyle jeśli chodzi o podstawy Speed Density, przejdźmy do wersji z MAF sensorem.
Źródła:
- http://www.megamanual.com/v22manual/ve_tuner.pdf
- http://wahiduddin.net/calc/density_altitude.htm
- http://www.diy-efi.org/efi332/equations/algorith.htm
- http://www.megamanual.com/v22manual/mfuel.htm
- http://support.moates.net/theory-speed-density
- http://pl.wikipedia.org/wiki/Równanie_Clapeyrona_(stan_gazu_doskonałego)
- http://code.google.com/p/open5xxxecu/wiki/Injector_driver_theory
W przypadku MAF sensora nie musimy wyliczać masy powietrza które zostało dostarczone do silnika, możemy je po prostu odczytać (pośrednio) z czujnika. W takim przypadku dużo prostsze staje się wyliczenie masy potrzebnego paliwa:
$$M_{Fuel}=\frac{M_{Air}}{14.7 \frac{AFR_{Required}}{14.7}}=\frac{M_{Air}}{AFR_{Required}}$$
Gdzie:
- Mfuel - masa potrzebnego paliwa
- Mair - masa dostarczonego powietrza do jednego cylindra, to nie jest wskazanie MAF sensora gdyż czujnik podaje przepływ, czyli masa w czasie
- AFRrequired - wymagany stosunek powietrza do paliwa
Obciążenie silnika
Używając jedynie MAF sensora pojawia się problem z obliczeniem obciążenia silnika. Normalnie do indeksowania tablicy z VE (dla Speed Density), AFR czy kątami zapłonu używa się ciśnienia pochodzącego z MAP sensora które pełni funkcję obciążenia. W instalacjach pozbawionych MAP sensora, obciążenie musi zostać wyliczone wg specyfikacji SAE OBDII PID$43 - Absolute Load Value (wyrażone w procentach):
$$Load_{Absolute} = 100\% \frac{M_{Air}[\frac{g}{stroke}]}{M_{AirMax}[\frac{g}{stroke}]}$$
Gdzie:
- MairMax- wartość przy standarowej temperaturze i ciśnieniu (STP), czyli 25C, ciśnieniu 101.3kPa, przy w pełni otwartej przepustnicy i VE równym 100%
LoadAbs jest pomiędzy 0% do 95% dla silników N/A i od 0% do 400% dla silników doładowanych.
Inne warianty równania wg S4Wiki:
$$M_{Air}[\frac{g}{stroke}]=\frac{MAF[\frac{g}{s}]}{RPM[\frac{rev}{min}]\frac{1[min]}{60[sec]}\frac{1}{2}}$$
$$M_{AirMax}[\frac{g}{stroke}]=V_{Engine}[cc] * 0.00122521[\frac{g}{cc}]=V_{Engine}[l] * 1.2251[\frac{g}{l}]$$
$$Load_{Absolute} =100\%*\frac{\frac{MAF[\frac{g}{s}]}{RPM[\frac{rev}{min}]\frac{1[min]}{60[sec]}\frac{1}{2}}}{1.2251 [gl]VCylinder[liter]}$$
Inne warianty równania wg OBDCON:
$$M_{Air}[\frac{g}{stroke}]=\frac{MAF[\frac{g}{s}]}{RPM[\frac{rev}{min}]\frac{1[min]}{60[sec]}\frac{N_{cyl}}{2}[\frac{strokes}{rev}]}$$
$$M_{AirMax}[\frac{g}{stroke}]=V_{Engine}[cc] * 1.184[\frac{g}{stroke}]$$
$$LoadAbsolute =100\%*\frac{MAF[\frac{g}{s}]}{\frac{RPM[\frac{rev}{min}]\frac{1[min]}{60[sec]}\frac{N_{cyl}}{2}[\frac{strokes}{rev}]}{1.184[\frac{g}{liter}]V_{Cylinder}[liter]}}$$
Problem taki, że oba mają inny współczynnik i jedno zależy od liczby cylindrów a drugie nie. Dodatkowo wg wpisu na forum DiyEfi RPM należy jeszcze podzielić przez 2.
Czas wtrysku paliwa
W każdym razie równanie na długość czasu wtrysku ma poniższą postać:
$$PulseWidth = 0.67 * (InjectorOpeningTime + BatteryCorrection) + \\ \frac{RequiredFuelMass}{InjectorFlowRate}+CustomLinearCorrection$$
$$RequiredFuelMass = \frac{M_{Air}}{AFR_{Required}} =\frac{MAF[gs]}{RPM[\frac{rev}{min}]\frac{1[min]}{60[sec]}\frac{N_{cyl}}{2}[\frac{strokes}{rev}]}\frac{1}{AFR_{Required}}$$
Różnica jest tak, że po prostu podajemy jakie AFR chcemy mieć i na podstawie odczytu z MAF dostajemy wymaganą wielkość paliwa. Oczywiście do tak wyliczonej masy możemy stosować różne korekty. Dodatkowo sam odczyt z MAF sensora może wymagać korekt (w zależności od typu czujnika), ale tego tematu jeszcze nie zbadałem dokładnie.
Źródła:
- http://www.microsquirt.info/mafmap.htm
- http://obdcon.sourceforge.net/2010/10/about-pid-calculated-load-value
- http://forum.diyefi.org/viewtopic.php?f=8&t=1704&start=10
- http://s4wiki.com/wiki/Mass_air_flow
- http://support.moates.net/theory-mass-air-flow
MAP Sensor + MAF Sensor
Mając w samochodzie zarówno MAF jak i MAP sensor można pokusić się o stworzenie hybrydy. Ogólnie przyjęte jest, że MAF sensor jest dokładny przy wolnych obrotach i traci na dokładności wraz ze wzrostem RPM. W takiej sytuacji można stosować MAF np. do 3000rpm lub dopóki nie pojawi się doładowanie a w przeciwnym wypadku używać Speed Density.
Na razie to tyle, ciąg dalszy nastąpi...
Brak komentarzy:
Prześlij komentarz
Reklamy będą usuwane.