Despre Computer de bord
-----------------------------------------------
Vazand ca este dificil (poate chiar imposibil) de gasit computer de bord original de 405 (dar nu numai din acest motiv) am trecut la proiectarea si realizarea unui computer de bord. Nu exista o legatura prea stransa cu PUG 405 dar aceasta este masina pe care am facut testele si deci la ea ma refer concret. Exista conditionarea ca masina sa fie cu injectie (din cauza modului cum este rezolvat senzorul de fuel consumat).
Proiectul este acum in faza de testare pe masina.
Am avut in vedere cateva computere de bord existente, cum ar fi cel de pe Citroen C3.
Pentru inceput, in "varianta 1 daca vreti" este vorba de un computer de bord "minimal" (ce va putea fi dezvoltat ulterior) care afiseaza urmatoarele:
- consum mediu de fuel, in L/100Km
- consum instantaneu, in L/H sau in L/100Km dupa cum viteza este mai mica decat 20 Km/H sau mai mare
- durata calatorie, HH:MM
- distanta parcursa, sub forma 12.34 sau 123.4 sau 12345 cu semnificatiile 12Km si 340 metri, 123Km si 400 metri respectiv 1234Km si 500 metri; alegerea unui anumit format de afisare se face automat.
- viteza medie de la inceput calatorie, in Km/H
- viteza instantanee, in Km/H
- autonomia, in Km, reprezentand distanta care mai poate fi parcursa cu combustibilul existent in rezervor.
S-ar mai putea adauga un ceas de 24 ore, sub forma HH:MM:SS.
In general, pentru a face un computer de bord sunt necesare urmatoarele.
1. senzor de distanta parcursa si viteza (cel putin 2000 impulsuri pe kilometru)
2. senzor de fuel consumat
3. baza de timp
4. intrare de la litrometru.
Consideram ca masina este cu injectie.
Unele dintre informatiile necesare pot fi obtinute prin interogarea computerului de injectie dar aici nu avem in vedere aceasta varianta ci va fi vorba de citire de la senzori. Exista anumite masini, pe injectie, care nu au senzor de viteza deci ECU NU cunoaste viteza de deplasare a vehiculului - caz in care tot la senzor separat ajungem. Oricum, "discutia cu ECU" ramane pentru viitor.
Senzorul de fuel nu este o componenta separata ci se poate realiza prin contorizarea timpilor de injectie, asa cum este descris mai jos.
Montajul cuprinde un controller PIC16F876 si un LCD alfanumeric de 2x16 caractere.
Cerinta ar fi urmatoarea.
Avem o masina cu injectie monopunct al carei injector corespunde diagramei atasate. Pentru mai multe injectoare se va putea face la fel dar va exista undeva in soft o inmultire cu numarul injectoarelor.
Ca hardware folosim o schema cu optocuplor 4N35. Tensiunea care se aplica pe bobina injectorului este utilizata si pentru aprinderea ledului din interiorul optocuplorului, desigur cu o rezistenta corespunzatore in serie. Colectorul optocuplorului se duce direct pe pin de PIC cu o rez de 2k2 spre +5V. S-a tinut seama ca injectorul stropeste (pulverizeaza) benzina atunci cand firul lui de comanda (care vine direct din ECU, pin 18 la Magneti Marelli G6) este trecut in 0 si s-au aranjat lucrurile sa fie la fel si pentru PIC, anume 0 logic citit in PIC inseamna ca injectorul stropeste.
Se cere sa se determine consumul instantaneu de benzina exprimat in Litri pe ora.
Acest consum este afisat atunci cand vehiculul se deplaseaza cu o viteza mai mica de 20 Km/H si este util, de exemplu, atunci cand masina sta pe loc, cu motorul pornit iar soferul efectueaza unele reglaje sau experimente, caz in care poate sa urmareasca si valoarea consumului instantaneu pe LCD-ul computerului de bord, ca “feedback” la experimentul pe care il face.
Mai multe masini procedeaza astfel, anume sub 20 Km/H afiseaza consumul instantaneu in L/H iar peste aceasta viteza afiseaza consumul instantaneu in L la 100 Km. Mai multe dar nu si Logan-ul care, sub 20 sau 25 Km/H, nu afiseaza nimic (ce rau sunt! ).
Am imaginat acest enunt (fara sa ma refer deci la modul cum se calculeaza consumul instantaneu in Litri la 100 Km) pentru a nu fi nevoie sa fac referire la senzorul de distanta, la distanta parcursa, la viteza - deci pentru a simplifica povestirea. Despre consum de fuel exprimat in Litri la 100 de Km parcursi va fi vorba mai tarziu (mai jos).
Intrucat vom dori ca orice consum de fuel sa fie afisat sub forma ##.# si tinand seama ca nu dorim sa utilizam virgula flotanta (care este o pacoste pentru orice program si orice programator – scuze pt aceasta afirmatie) vom lucra cu acest consum inmultit cu 10.
Deci se cere sa se determine CI_LPHx10 (succesiunea x10 face parte din numele variabilei) care este de tip unsigned int de 16 biti.
De exemplu daca valoarea acestei variabile este 12 aceasta inseamna un consum instantaneu de 1.2 L/H si la afisare se va avea grija (lucrand numai cu intregi) ca valoarea sa arate in acest fel, afisand mai intai CI_LPHx10/10, apoi caracterul punct si apoi CI_LPHx10%10. Este vorba de scriere ca in C, deci "A%B" (cu A si B intregi) inseamna "A modulo B" adica restul impartirii intregi a lui A prin B.
(Dupa cateva variante si incercari) am decis sa am o singura intrerupere in sistem, la evenimentul TMR1 overflow (65535 -> 0) iar la intrarea in isr (interrupt service routine) am grija sa reincarc timerul cu o valoare care sa asigure aparitia evenimentului (intreruperii) la 100 microsec.
In isr se citeste starea injectorului intr-o variabila de tip BIT numita INJ. Deci avem starea curenta a injectorului, anume INJ = 0 sau 1 dupa cum injectorul stropeste benzina / (nu stropeste).
Mai exista in program un vector VEC cu 2 componente intregi pe 16 biti.
Apoi se executa instructiunea (esentiala pt metoda folosita):
VEC[INJ]++;
Aceasta se intampla la fiecare 100 microsec un anumit interval de timp pe care l-am ales sa fie 1000 milisec, interval la care recalculez (updatez) valoarea lui CI_LPHx10. In afara de aceste valori care apar la fiecare secunda exista si valori intermediare, obtinute prin interpolare.
VEC[0] si VEC[1] reprezinta numarul care arata de cate ori (in intervalul de 1000 milisec) injectorul a fost surprins ca stropeste, respectiv nu stropeste.
Am avut grija sa desconsider intervalul de timp de circa 600 microsec in care avem paraziti de la bobina injectorului (vezi diagrama de osciloscop), anume in acest interval de timp sa consider ca INJ este in 1 indiferent cum este in realitate.
La fiecare granita de 1000 milisec se pozitioneaza un flag (bit) pentru ca bucla principala a programului sa stie ca are de efectuat updatarea valorii marimii in cauza (calculul - updatarea - si afisarea pe LCD nu se fac in isr).
Calculul este:
CI_LPHx10 = ( VEC[0]*CONSTANTA ) / ( VEC[0]+VEC[1] );
VEC[0] = VEC[1] = 0; // reinitializare
Bineinteles ca numitorul in impartirea de mai sus este constant si egal cu 10000 (pentru ca intreruperea apare la 100 microsec iar la fiecare intrerupere se face o incrementare, fie a unei componente a vectorului fie a celeilalte) dar sa lasam asta acum.
Deci se observa ca de fapt se calculeaza un fel de procent (subunitar) din CONSTANTA.
Etalonarea senzorului de fuel se reduce la a determina valoarea corecta pentru CONSTANTA. Valorile plauzibile, ca ordin de marime, sunt intre 200 si 500. O valoare plauzibila concreta (pentru masina mea, de 1600 cc) este de 350.
Cunoasterea debitului injectorului o consider doar orientativa si NU am utilizat aceasta valoare. Sunt posibile schimbari dupa ani si ani de functionare, sunt posibile schimbari dupa o curatare a injectorului etc..
Cat priveste presiunea benzinei in amonte de injector, la multe masini este de 3 bar iar la altele este de 0.8 bar. Eu spun ca regulatorul de presiune isi face datoria, pot sa spun ca la mine am masurat-o (cu un manometru la care am atasat un T si 2 furtune) si am vazut ca acul ramane nemiscat la valoarea de 0.8 bar.
In lipsa altor echipamente de masura, soferul poate sa determine (daca cumva nu stie) cat consuma masina pe highway, in mers constant cu 90 sau 100 Km/H si sa modifice (folosind anumite facilitati ale sistemului: jumperi, setari din taste in sesiunea de setup) valoarea pentru CONSTANTA pana cand LCD-ul arata (in aceleasi conditii de drum si de mers) consumul care trebuie (cel stiut, determinat fara referire la computerul de bord).
Ca rezultat final pot sa mentionez ca, la pornirea motorului rece, valoarea acestui consum este stabila si scade treptat, pe masura ce motorul se incalzeste iar la 90 grade (cand turatia deja a scazut la valoarea nominala de 850 rpm) indicatia de consum este fie 1.0 L/H fie 1.1, valoare destul de stabila, ceea ce consider satisfacator. Urmeaza sa vad cum va fi la temperaturi exterioare mai "extreme" sau in alte situatii.
Daca CI_LPHx10 este corect (deci dupa etalonare) atunci celalalt consum instantaneu, anume CI_LPER100KMx10 este corect “de la sine”, conform cu formula:
CI_LPER100KMx10 = ( CI_LPHx10*100 ) / VI_KMPERH ;
cu conditia ca si etalonarea senzorului de distanta sa fie facuta. Mentionez din nou ca succesiunea x10 care apare mai sus face parte din numele variabilelor respective, avand rolul sa aminteasca doar faptul ca variabila respectiva nu retine consumul instantaneu ci consumul instantaneu inmultit cu 10.
Etalonarea in cazul senzorului de distanta este mai simpla. Lucrurile “se reduc” tot la determinarea valorii unei anumite constante dar in acest caz se poate lua ca etalon insusi bordul masinii: cat arata kilometrajul clasic (sau acul indicator al vitezometrului sau afisajul de la Arcul de Triumf ) tot atat trebuie sa fie si valorile afisate pe LCD pentru distanta parcursa, respectiv viteza instantanee. Sigur ca dupa ce "electronicele" merg bine tinem minte valorile constantelor de etalonare (care, foarte probabil, sunt specifice tipului de masina) si ne putem gandi chiar la eliminarea sistemelor vechi (bordului clasic).
Cam asta este.
In imaginea de LCD atasata se observa urmatoarele marimi:
- consum mediu de fuel: 7.1 Litri la 100 Km
- consum instantaneu de fuel: 9.2 Litri la 100 Km
- durata calatorie: 13 minute 34 secunde (in final va fi in ore si min)
- distanta parcursa: 10Km si 260 metri
- viteza medie: 50 Km/H
- viteza instantanee: 89 Km/H.
[attachmentid=324][attachmentid=326]
-----------------------------------------------
Vazand ca este dificil (poate chiar imposibil) de gasit computer de bord original de 405 (dar nu numai din acest motiv) am trecut la proiectarea si realizarea unui computer de bord. Nu exista o legatura prea stransa cu PUG 405 dar aceasta este masina pe care am facut testele si deci la ea ma refer concret. Exista conditionarea ca masina sa fie cu injectie (din cauza modului cum este rezolvat senzorul de fuel consumat).
Proiectul este acum in faza de testare pe masina.
Am avut in vedere cateva computere de bord existente, cum ar fi cel de pe Citroen C3.
Pentru inceput, in "varianta 1 daca vreti" este vorba de un computer de bord "minimal" (ce va putea fi dezvoltat ulterior) care afiseaza urmatoarele:
- consum mediu de fuel, in L/100Km
- consum instantaneu, in L/H sau in L/100Km dupa cum viteza este mai mica decat 20 Km/H sau mai mare
- durata calatorie, HH:MM
- distanta parcursa, sub forma 12.34 sau 123.4 sau 12345 cu semnificatiile 12Km si 340 metri, 123Km si 400 metri respectiv 1234Km si 500 metri; alegerea unui anumit format de afisare se face automat.
- viteza medie de la inceput calatorie, in Km/H
- viteza instantanee, in Km/H
- autonomia, in Km, reprezentand distanta care mai poate fi parcursa cu combustibilul existent in rezervor.
S-ar mai putea adauga un ceas de 24 ore, sub forma HH:MM:SS.
In general, pentru a face un computer de bord sunt necesare urmatoarele.
1. senzor de distanta parcursa si viteza (cel putin 2000 impulsuri pe kilometru)
2. senzor de fuel consumat
3. baza de timp
4. intrare de la litrometru.
Consideram ca masina este cu injectie.
Unele dintre informatiile necesare pot fi obtinute prin interogarea computerului de injectie dar aici nu avem in vedere aceasta varianta ci va fi vorba de citire de la senzori. Exista anumite masini, pe injectie, care nu au senzor de viteza deci ECU NU cunoaste viteza de deplasare a vehiculului - caz in care tot la senzor separat ajungem. Oricum, "discutia cu ECU" ramane pentru viitor.
Senzorul de fuel nu este o componenta separata ci se poate realiza prin contorizarea timpilor de injectie, asa cum este descris mai jos.
Montajul cuprinde un controller PIC16F876 si un LCD alfanumeric de 2x16 caractere.
Cerinta ar fi urmatoarea.
Avem o masina cu injectie monopunct al carei injector corespunde diagramei atasate. Pentru mai multe injectoare se va putea face la fel dar va exista undeva in soft o inmultire cu numarul injectoarelor.
Ca hardware folosim o schema cu optocuplor 4N35. Tensiunea care se aplica pe bobina injectorului este utilizata si pentru aprinderea ledului din interiorul optocuplorului, desigur cu o rezistenta corespunzatore in serie. Colectorul optocuplorului se duce direct pe pin de PIC cu o rez de 2k2 spre +5V. S-a tinut seama ca injectorul stropeste (pulverizeaza) benzina atunci cand firul lui de comanda (care vine direct din ECU, pin 18 la Magneti Marelli G6) este trecut in 0 si s-au aranjat lucrurile sa fie la fel si pentru PIC, anume 0 logic citit in PIC inseamna ca injectorul stropeste.
Se cere sa se determine consumul instantaneu de benzina exprimat in Litri pe ora.
Acest consum este afisat atunci cand vehiculul se deplaseaza cu o viteza mai mica de 20 Km/H si este util, de exemplu, atunci cand masina sta pe loc, cu motorul pornit iar soferul efectueaza unele reglaje sau experimente, caz in care poate sa urmareasca si valoarea consumului instantaneu pe LCD-ul computerului de bord, ca “feedback” la experimentul pe care il face.
Mai multe masini procedeaza astfel, anume sub 20 Km/H afiseaza consumul instantaneu in L/H iar peste aceasta viteza afiseaza consumul instantaneu in L la 100 Km. Mai multe dar nu si Logan-ul care, sub 20 sau 25 Km/H, nu afiseaza nimic (ce rau sunt! ).
Am imaginat acest enunt (fara sa ma refer deci la modul cum se calculeaza consumul instantaneu in Litri la 100 Km) pentru a nu fi nevoie sa fac referire la senzorul de distanta, la distanta parcursa, la viteza - deci pentru a simplifica povestirea. Despre consum de fuel exprimat in Litri la 100 de Km parcursi va fi vorba mai tarziu (mai jos).
Intrucat vom dori ca orice consum de fuel sa fie afisat sub forma ##.# si tinand seama ca nu dorim sa utilizam virgula flotanta (care este o pacoste pentru orice program si orice programator – scuze pt aceasta afirmatie) vom lucra cu acest consum inmultit cu 10.
Deci se cere sa se determine CI_LPHx10 (succesiunea x10 face parte din numele variabilei) care este de tip unsigned int de 16 biti.
De exemplu daca valoarea acestei variabile este 12 aceasta inseamna un consum instantaneu de 1.2 L/H si la afisare se va avea grija (lucrand numai cu intregi) ca valoarea sa arate in acest fel, afisand mai intai CI_LPHx10/10, apoi caracterul punct si apoi CI_LPHx10%10. Este vorba de scriere ca in C, deci "A%B" (cu A si B intregi) inseamna "A modulo B" adica restul impartirii intregi a lui A prin B.
(Dupa cateva variante si incercari) am decis sa am o singura intrerupere in sistem, la evenimentul TMR1 overflow (65535 -> 0) iar la intrarea in isr (interrupt service routine) am grija sa reincarc timerul cu o valoare care sa asigure aparitia evenimentului (intreruperii) la 100 microsec.
In isr se citeste starea injectorului intr-o variabila de tip BIT numita INJ. Deci avem starea curenta a injectorului, anume INJ = 0 sau 1 dupa cum injectorul stropeste benzina / (nu stropeste).
Mai exista in program un vector VEC cu 2 componente intregi pe 16 biti.
Apoi se executa instructiunea (esentiala pt metoda folosita):
VEC[INJ]++;
Aceasta se intampla la fiecare 100 microsec un anumit interval de timp pe care l-am ales sa fie 1000 milisec, interval la care recalculez (updatez) valoarea lui CI_LPHx10. In afara de aceste valori care apar la fiecare secunda exista si valori intermediare, obtinute prin interpolare.
VEC[0] si VEC[1] reprezinta numarul care arata de cate ori (in intervalul de 1000 milisec) injectorul a fost surprins ca stropeste, respectiv nu stropeste.
Am avut grija sa desconsider intervalul de timp de circa 600 microsec in care avem paraziti de la bobina injectorului (vezi diagrama de osciloscop), anume in acest interval de timp sa consider ca INJ este in 1 indiferent cum este in realitate.
La fiecare granita de 1000 milisec se pozitioneaza un flag (bit) pentru ca bucla principala a programului sa stie ca are de efectuat updatarea valorii marimii in cauza (calculul - updatarea - si afisarea pe LCD nu se fac in isr).
Calculul este:
CI_LPHx10 = ( VEC[0]*CONSTANTA ) / ( VEC[0]+VEC[1] );
VEC[0] = VEC[1] = 0; // reinitializare
Bineinteles ca numitorul in impartirea de mai sus este constant si egal cu 10000 (pentru ca intreruperea apare la 100 microsec iar la fiecare intrerupere se face o incrementare, fie a unei componente a vectorului fie a celeilalte) dar sa lasam asta acum.
Deci se observa ca de fapt se calculeaza un fel de procent (subunitar) din CONSTANTA.
Etalonarea senzorului de fuel se reduce la a determina valoarea corecta pentru CONSTANTA. Valorile plauzibile, ca ordin de marime, sunt intre 200 si 500. O valoare plauzibila concreta (pentru masina mea, de 1600 cc) este de 350.
Cunoasterea debitului injectorului o consider doar orientativa si NU am utilizat aceasta valoare. Sunt posibile schimbari dupa ani si ani de functionare, sunt posibile schimbari dupa o curatare a injectorului etc..
Cat priveste presiunea benzinei in amonte de injector, la multe masini este de 3 bar iar la altele este de 0.8 bar. Eu spun ca regulatorul de presiune isi face datoria, pot sa spun ca la mine am masurat-o (cu un manometru la care am atasat un T si 2 furtune) si am vazut ca acul ramane nemiscat la valoarea de 0.8 bar.
In lipsa altor echipamente de masura, soferul poate sa determine (daca cumva nu stie) cat consuma masina pe highway, in mers constant cu 90 sau 100 Km/H si sa modifice (folosind anumite facilitati ale sistemului: jumperi, setari din taste in sesiunea de setup) valoarea pentru CONSTANTA pana cand LCD-ul arata (in aceleasi conditii de drum si de mers) consumul care trebuie (cel stiut, determinat fara referire la computerul de bord).
Ca rezultat final pot sa mentionez ca, la pornirea motorului rece, valoarea acestui consum este stabila si scade treptat, pe masura ce motorul se incalzeste iar la 90 grade (cand turatia deja a scazut la valoarea nominala de 850 rpm) indicatia de consum este fie 1.0 L/H fie 1.1, valoare destul de stabila, ceea ce consider satisfacator. Urmeaza sa vad cum va fi la temperaturi exterioare mai "extreme" sau in alte situatii.
Daca CI_LPHx10 este corect (deci dupa etalonare) atunci celalalt consum instantaneu, anume CI_LPER100KMx10 este corect “de la sine”, conform cu formula:
CI_LPER100KMx10 = ( CI_LPHx10*100 ) / VI_KMPERH ;
cu conditia ca si etalonarea senzorului de distanta sa fie facuta. Mentionez din nou ca succesiunea x10 care apare mai sus face parte din numele variabilelor respective, avand rolul sa aminteasca doar faptul ca variabila respectiva nu retine consumul instantaneu ci consumul instantaneu inmultit cu 10.
Etalonarea in cazul senzorului de distanta este mai simpla. Lucrurile “se reduc” tot la determinarea valorii unei anumite constante dar in acest caz se poate lua ca etalon insusi bordul masinii: cat arata kilometrajul clasic (sau acul indicator al vitezometrului sau afisajul de la Arcul de Triumf ) tot atat trebuie sa fie si valorile afisate pe LCD pentru distanta parcursa, respectiv viteza instantanee. Sigur ca dupa ce "electronicele" merg bine tinem minte valorile constantelor de etalonare (care, foarte probabil, sunt specifice tipului de masina) si ne putem gandi chiar la eliminarea sistemelor vechi (bordului clasic).
Cam asta este.
In imaginea de LCD atasata se observa urmatoarele marimi:
- consum mediu de fuel: 7.1 Litri la 100 Km
- consum instantaneu de fuel: 9.2 Litri la 100 Km
- durata calatorie: 13 minute 34 secunde (in final va fi in ore si min)
- distanta parcursa: 10Km si 260 metri
- viteza medie: 50 Km/H
- viteza instantanee: 89 Km/H.
[attachmentid=324][attachmentid=326]

Comment