Sari la conținut
ELFORUM - Forumul electronistilor

Proiect extindere computer bord


DarkAngel_Bv

Postări Recomandate

as avea nevoie totusi de ajutor in privinta unui algoritm de masurare a carburantului injectat.

Lumea nu prea este familiara cu procedeul prin care se injecteaza carburantul. Vorbesti de niste impulsuri, de factor de umplere, de faptul ca un surplus ajunge inapoi la retur.Ar trebui dat un link catre o schema de functionare ca altfel nu stim despre ce este vorba.
Link spre comentariu
  • Răspunsuri 41
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • DarkAngel_Bv

    19

  • matache

    10

  • nickrvl

    3

  • stefan_k

    3

Top autori în acest subiect

Ideea este in felul urmator.

Motorul are 4 injectoare comandate electronic.

Exista o rampa comuna in care se pompeaza combustibil si este tinut la o presiune constanta X (cam toate masinile pe benzina au intre 2 si 3 bari in rampa de injectie).

In cazul masinii mele injectoarele sunt de 380cc. Aceasta valoare reprezinta cantitatea de combustibil ce este pulverizabila in unitatea de timp(pe minut) la acea presiune.

Deci, am CC-ul, am presiunea, mai trebuie sa masor doar timpul cat sta injectorul deschis pentru a determina consumul. La diesel non-commonrail este ceva mai complicat deoarece presiunea nu este aceiasi mereu si in functie de presiune se dozeaza combustibilul.

 

In cazul meu inseamna 380 centimetri cubi de combustibil intr-un minut de tinut injectorul deschis.

Daca presiunea se schimba, la, sa zicem 5 bari, atunci injectorul va functiona ca unul de 633 folosit la presiunea de 3 bari.

 

Am facut un mic programel care este destul de aproape de ce vreau eu, dar nu chiar :d (sa calculez factorul de umplere pentru moment)

$regfile = "m8def.dat"                                      ' specify the used micro$crystal = 1000000                                          ' used crystal frequency$hwstack = 32                                               ' default use 32 for the hardware stack$swstack = 10                                               'default use 10 for the SW stack$framesize = 40                                             'default use 40 for the frame spaceConfig Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2On Int0 ImpulsconsumEnable Int0Config Int0 = RisingEnable InterruptsConfig Timer0 = Timer , Prescale = 1Stop Timer0Dim Impulsurijos As Single , Impulsurisus As Single , Flow As IntegerDim Lengthup As Long , Lengthdown As Long,Dim Umplere As SingleDim Temps As Single , Tempj As SingleFlow = 0DoTempj = Lengthdown / ImpulsurijosTemps = Lengthup /  ImpulsurijosUmplere = Tempj + TempsUmplere = Temps / UmplereUmplere = Umplere * 100   Locate 1 , 1   Lcd Fusing(umplere , "##.##") ; "               "   Locate 2 , 1   Lcd LengthupLengthdown = 0Lengthup = 0Impulsurisus = 0Impulsurijos = 0  Waitms 500LoopImpulsconsum:Stop Timer0   If Flow = 0 Then        Config Int0 = Falling        Incr Impulsurijos        lengthdown = lengthdown + Timer0        Flow = 1   Else        Config Int0 = Rising        Incr Impulsurisus        Lengthup = Lengthup + Timer0        Flow = 0   End IfTimer0 = 0Start Timer0Return
Link spre comentariu

Iti trebuie doua timere, unul care da o intrerupere o data pe secunda (de ex.) si celalalt care este pornit atunci cind injectorul se deschide si oprit cind se inchide, dupa care este repornit de unde a ramsa la o noua deschidere a injectorului, reoprit si tot asa.La fiecare secunda o intrerupere generata de timerul 1 declanseaza citirea valorii cumulate in timerul 2 care inmultita cu perioada ceasului ce incrementeaza timerul 2 da exact timpul total cit injectorul a stat deschis care mai departe inmultit cu o constanta, dependenta de constructia si presiunea fixa din injector, da cantitatea de combustibil arsa pe timp de o secunda, adica debitul.Nota: Acele timere 1 si 2 trebuie sa ti le faci din doua timere fizice ale AVR-ului legate in cascada sau un timer si o locatie de memorie care sa inregistreze numarul de dari peste cap.

Link spre comentariu

Calculele respective sunt mult prea complexe pentru ce am nevoie. Pe simulare "sare" de la o valoare la alta total aiurea, dar cele mai multe valori se invart in jurul celei setate din generator. Trebuie sa scriu codul intr-un uC si sa verific cu osciloscopul daca semnalul masurat corespunde cu ce afiseaza.

Link spre comentariu

Calculele respective sunt mult prea complexe.

Fa abstractie de adresa aceea cu socoteli complexe. Am vrut sa o sterg dar nu a mai fost posibil.Mesajul meu scris dupa ea nu are nici o legatura cu formulele acelea complicate. Descrie o metoda simpla de aflare a debitului.
Link spre comentariu

Da, am mai avut o tentativa asa, cu 2 timere. Nu mai stiu exact de ce a esuat la momentul respectiv, dar probabil scapasem ceva din vedere.la 6500 rpm ar insemna ca avem 3250 de deschideri ale injectoarelor intr-un minut, adica ~813 deschideri ale fiecarui injector.Asta ar insemna 60/3250 = 0.01846 secunde/injectare cu DC de 100%.Luand un duty cycle de maximum 80% (desi in general DC-ul nu depaseste 50%)0.01846 secunde ~= 18.5 ms cu DC 100%, 1.85ms la DC 10%, 0.185ms la DC1% (poate doar in frana de motor sa fie DC-ul asta :d ).Luand in calcul turatia de ralanti, avem 375 deschideri pe minut, adica 60/375 = 0.16 secunde, adica 160 ms. Dar cum la turatii mici cantitatea injectata este si ea mica, DC-ul nu sare de 35-40% nici cu acceleratia la podeaDeci rezolutia de masurare trebuie sa fie de minimum 0.185 ms si maximum 80ms. Calcule se pot face multe. Stiind cantitatea maxima de combustibil injectat pe ciclu (dupa o tura cu masina si testerul conectat) pot sa calculez si DC-ul maxim, dar vreau totusi sa las o marja mare de eroare, in caz ca voi muta computerul pe alta masina sa nu trebuiasca sa modific foarte multe...

Link spre comentariu

Nu. Pentru ca:1. Nu cred ca poate masura consumul de 2-3Mg de combustibil consumat per ciclu.2. Nu cred ca poate masura consumul la o presiune de 5 bari.3. Exista si retur. Ar trebui sa masor turul si returul si sa fac scaderea, doar ca diferenta intre tur si retur ar fi foarte mica (in principiu pompa ajunge si la 15 bari, deci tot surplusul peste cei 5 bari ii da inapoi pe retur).

Si totusi exista astfel de debitmetre: http://lirast.com/
Link spre comentariu

Dupa cum spuneam, motoarele moderne au tur si retur.Degeaba masori debitul pe tur cand nu iei in considerare debitul de retur.Plus de asta, nu este foarte simplu sa modifici instalatia de alimentare cu combustibil, si nici safe. In schimb o mufa suplimentara intercalata intre instalatia electrica a masinii si unul din injectoare (in general este suficient sa monitorizezi unul din injectoare ca sa aflii consumul) nu are atatea neajunsuri. Daca vrei sa deconectezi jucaria scoti pur si simplu firul/mufa sumplimentara si gata, ai masina stock.

Link spre comentariu

Dupa cum spuneam, motoarele moderne au tur si retur.Degeaba masori debitul pe tur cand nu iei in considerare debitul de retur.Plus de asta, nu este foarte simplu sa modifici instalatia de alimentare cu combustibil, si nici safe. In schimb o mufa suplimentara intercalata intre instalatia electrica a masinii si unul din injectoare (in general este suficient sa monitorizezi unul din injectoare ca sa aflii consumul) nu are atatea neajunsuri. Daca vrei sa deconectezi jucaria scoti pur si simplu firul/mufa sumplimentara si gata, ai masina stock.

Acolo au toate configuratiile, tur, retur, etc...Personal sint curios cu evolutia proiectului tau, cindva vroiam sa-mi fac si eu la masina mea, de atunci stiu de acele debitmetre, chiar am luat legatura cu ei insa m-am oprit din lipsa timp si altele....De asemenea nu am mare incredere in determinarea debitului "citind" injectia dar probabil ca totusi e o metoda sigura, nu stiu la masinile cu afisarea consumului daca au debitmetru sau citirea se face cum prezinti tu, oricum e ceva de munca si-ti doresc succes.
Link spre comentariu

Deci rezolutia de masurare trebuie sa fie de minimum 0.185 ms si maximum 80ms.

Daca procesorul lucreaza la 16 MHz atunci ai 16 tacti pe us si deci 2960 la minimul de 185 us, suficient cit sa masori intervalul cu rezolutie temporala foarte buna. Chiar daca divizezi frecventa ceasului cu 8 ca sa nu se incrementeze timerul asa repede si sa nu se dea peste cap atit de des, tot ai 370 tacti, adica o rezolutie de 0.5 us ceea ce la 185 us este 0.2%.

 

Acum ca stim durata minima a pulsului deschis, 0.185 ms, algoritmul descris intr-unul din mesajele mele precedente se poate simplifica ca mai jos:

 

1) Setezi timer1 si timer2 pe tact de 2 MHz si le programezi sa inceapa numararea cind apare tranzitia 0->1 a semnalului care comanda deschiderea injectorului.

2) La tranzitia inversa 1->0 care determina inchiderea injectorului citesti valoarea acumulata in timer2, il opresti si il resetezi.

3) La urmatoarea tranzitie din 0->1 citesti cit este in timer1, il opresti si il resetezi.

 

Consumul pe secunda este durata totala cit a stat injectorul deschis multiplicata cu o constanta, deci:

 

Perioada injectorului = nr_tacti_timer1*0.5us

Nr. deschideri injector pe secunda = 1 / Perioada injectorului

Durata pulsului deschis = nr_tacti_timer2*0.5us

 

Consumul instantaneu = k * Durata pulsului deschis * Nr. deschideri injector pe secunda

 

Consumul (masurat in L/s) = k * nr_tacti_timer2 / nr_tacti_timer1

unde k = consumul cind injectorul este tinut tot timpul deschis.

 

De exemplu: Ai puls de 0.185 ms care se repeta la 18.5 ms.

Perioada repetitie = 18.5 ms -> nr_tacti_timer1 = 37000

Durata pulsului deschis = 0.185 ms -> nr_tacti_timer2 = 370

 

Consumul = k * 370/37000

 

Nota: Nici nu iti trebuie doua timere, te poti descurca cu unul singur care masoara atit timpul cit injectorul sta deschis cit si perioada sa. Citesti valoarea timerului la tranzitia 0->1 il lasi sa mearga si mai citesti o data valoarea la tranzitia 1->0, dupa care il resetezi.

Cel mai probabil timerul acesta este facut din legarea in cascada a unui timer fizic de 16 biti cu unul de 8 pentru ca la 80 ms ajungi deja la 160 000 cu numaratoarea si deci sari de 2^16.

Link spre comentariu

La Nota, in loc de:

Citesti valoarea timerului la tranzitia 0->1 il lasi sa mearga si mai citesti o data valoarea la tranzitia 1->0, dupa care il resetezi.

a se citi:

"Pornesti timerul din zero la o tranzitie 0->1 (injector deschis), ii citesti valoarea la tranzitia 1->0 (injector inchis), il lasi sa mearga si mai citesti o data valoarea sa la urmatorul salt 0->1 (injector redeschis), dupa care il resetezi."

Link spre comentariu

Daca presiunea nu este constanta atunci consumul are valoarea:

 

Q = k'*p*Nd/Ntot

 

unde

- Q=consumul (L/s),

- Nd = durata in tacti a pulsului "injector deschis",

- Ntot = perioada injectiei, masurata in tacti,

- p = presiunea, care trebuie fie calculata din alte marimi daca este posibil sau citita cu un senzor si convertita cu DAC-ul microcontrolului intr-un numar,

- k' o constanta care se determina tinind injectorul deschis continuu la o presiune oarecare si masurind consumul pe un interval de timp cunoscut.

 

S-a presupus ca persiunea este constanta pe durata unei injectii, a unui puls in 1, putind insa varia de la puls la puls. De asemenea, debitul injectorului este considerat proportional cu presiunea iar injectorul isi mentine debitul constant pe durata unui puls.

Link spre comentariu

Presiunea de injectie nu am cum sa o masor (e vorba totusi de cateva sute de bari). in schimb il pot etalona cu o constanta, asta dupa mai multe plinuri.Eu ma gandeam asa:Timer0 - timer de referinta, cu apelarea unei functii o data pe secunda (pentru update valori).In acelasi timer bag si o variabila care se incrementeaza pana la 2, ca sa actualizez datele pe ecran o data la 2 secunde.Timer1 - Il folosesc pentru contorizarea timpului pentru consumINT0 - folosit pentru determinarea vitezeiINT1 - folosit pentru determinarea valorii pe injector (LOW/HI)As mai avea nevoie de inca un interrupt pentru turatie (pot folosi ICP1 pentru asta?).Frecventa vreau sa o aleg in asa fel incat sa nu am overflow pe timer/counter, ca si asa am putina memorie pe uC.

Link spre comentariu

1)

Eu ma gandeam asa:Timer0 - timer de referinta, cu apelarea unei functii o data pe secunda (pentru update valori).In acelasi timer bag si o variabila care se incrementeaza pana la 2, ca sa actualizez datele pe ecran o data la 2 secunde.

Daca ai trei semnale dreptunghiulare, unul a carui frecventa este proportionala cu turatia motorului, celalalt fiind semnalul din care se determina consumul iar ultimul fiind responsabilul cu viteza atunci INT0, INT1 si ICSP1 sunt suficiente.In acord cu ce scrie aici:http://www.avrfreaks.net/index.php?name ... c&p=180613ICSP1 pare sa poata numara niste pulsuri.Pe de alta parte, desi sunt necesari trei pini, nu ai nevoie de trei timere/countere ca sa masori factorul de umplere si/sau frecventa a trei semnale dreptunghiulare distincte. Un singur timer pe care il tot reconfigurezi este suficient.Masori, in tacti de ceas, durata pulsului High si perioada primului semnal dreptunghiular (High + Low), apoi te muti la a doilea cu acelasi timer, la al treilea, revii la primul si tot asa.Mereu marimea masurata: viteza, turatia sau consumul vor fi de tipul k*Np/Ntot unde Np = numarul de tacti ceas pe High iar Ntot = tactii pe High + Low.Ca o remarca, daca la un semnal dreptunghiular ii stii factorul de umplere atunci pentru masurarea frecventei sale nu este necesara decit masurarea numarului de tacti ceas pe High.2) Daca presiunea in injector se schimba continuu si nici nu ai cum sa o masori sau sa o calculezi, iar cantitatea injectata pe puls High este functie de presiune atunci nu prea vad cum ai putea afisa consumul instantaneu. Poti determina prin masuratori de calibrare constanta k' folosita in formula Q = k'*p*Nd/Ntot dar nu ai cum sa-l calculezi pe Q in timp ce motorul merge la presiune variabila in injector.
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări