MirceaM Posted November 4, 2005 Share Posted November 4, 2005 Despre Computer de bord ----------------------------------------------- Dupa cum am spus in postul anterior, avand in vedere si comp de bord de pe C3 (care este montat si pe PUG 406) ne gandim la un computer de bord minimal (ce va putea fi dezvoltat) 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 12345, cu semnificatia 123Km si 450 metri - 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 ar fi 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. 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 260 metri - viteza medie: 50 Km/H - viteza instantanee: 89 Km/H. Link to comment
valiman Posted November 11, 2005 Share Posted November 11, 2005 Poza este a unui afisaj de computer real? Daca DA, pe ce masina este montat? Pe ce masini ar merge instalat? Link to comment
MirceaM Posted November 30, 2005 Share Posted November 30, 2005 Imaginea LCD de mai sus este obtinuta in ecranul de pc cu un simulator care interpreteaza fisierul in format Intel HEX al aplicatiei (comp de bord). Aparatul se afla in teste pe o masina Peugeot 405 cu injectie monopunct, ECU Magneti Marelli G6.10. Nu exista o dependenta prea stransa de aceasta masina dar este o conditie ca masina sa fie cu injectie, din cauza modului cum este rezolvat "senzorul de fuel" (contorizare timpi de injectie, cum am descris). Nu am experimentat nimic cu vreun debitmetru si nici nu intentionez. LCD-ul este obisnuit, paralel, alfanumeric de 2x16 caractere. Mai sunt de rezolvat unele chestiuni, in special de aspect. Voi reveni cu o poza reala sau mai multe. Link to comment
Abram Burel Posted December 1, 2005 Author Share Posted December 1, 2005 (edited) Bravo Mircea! Cam piesele alea stau si la mine intr-o cutiuta de un an de zile si asteapta sa le bag in seama. Intre timp insa m-am mai tot gandit si mi-am schimbat putin... strategia. Initial am zis ca iau cel mai tare PIC din parcare si 876 nu e departe de chestia asta. Si l-am luat (nu-mi pare rau ). Ideea era ca fac, tot asa "in timp" o super-scula cu tot felul de functii. Adica, incep mic si cresc... mare. Toate bune si frumoase, numai ca experienta mi-a aratat ca o astfel de abordare conduce la una din urmatoarele doua situatii: - ramai fix cu ce-ai facut prima oara (caz in care investitia initiala nu prea are sens) - transformi masina intr-un laborator permanent (ceea ce nu e chiar intentia mea) Daca prima varianta e o chestie tipica de... automultumire si lene, cea de-a doua merita comentata un pic mai mult. Aparent, "dezvoltarea" se poate face simplu: PIC-ul se poate programa "in circuit", iar hardul il poti concepe modular. Prima e clara si probabil ca dupa ceva teste chiar o sa mearga. Dar cum faci cu cea de-a doua? Aici existau doua variante: - o constructie gen... PC, cu un soi de placa de baza in care se infig tot felul de module de intrare (si poate chiar de iesire) - o unitate centrala cu un "connector" I/O la care se conecteaza diferite cutiute periferice care, fiecare in parte isi rezolva conversia la semnale logice Prima varianta, e simpatica in teorie, dar in practica va conduce sigur la... laboratorul auto. Cea de-a doua imi... suna bine, dar atunci ma loveste ideea (care ar realizat ca e aplicata pe scara larga in domeniul electronicii auto moderne) ca nu are rost sa fac un "urias" cu un creier la fel de mare, ci mai bine o colectie de "pitici" cu creiere mici si o "Alba ca zapada" cu rol de... public relations. Adica, don'soara sa se ocupe cu afisarea informatiilor, iar piticii sa "sape" fiecare la cate o chestie si sa... raporteze cand sunt intrebati (daca sunt si evident daca sunt intrebati ). Si asa s-a nascut topicul asta. Imi dadea timp sa ma lamuresc cu problema comunicarii... interne (intre pitici si frumoasa) si modul in care se gestioneaza relatiile... externe, pe urma selectam si implementam diversi pitici care-mi stateau pe creier. Sa traducem putin in limbaj "profesional": - un controler central responsabil cu afisarea, selectarea modului de lucru, gestionarea comunicatiilor cu perifericele - o serie de controlere periferice, fiecare responsabil pentru o functie sau un grup de functii - comunicatia s-ar realiza pe un bus I2C cu masterul implementat probabil soft (probabil ca un 16F628 s-ar descurca), iar slave-ii probabil hard (sunt multe controlere mici care au aceasta functie) In incheiere as avea totusi o nelamurire la optiunea lui Mircea de a face polling la 100 microsec. Sunt de acord ca tot iti trebuie o intrerupere "de ceas", dar mi se parea mai "eleganta" o intrerupere direct pe semnalul de comanda a injectiei pentru scopul masurarii. Si, aproape evident, semnalul ala ar trebui conditionat*. Ah, si mai era ceva, n-am prea priceput cum adica numeri de cate ori prinzi semnalul de comanda activ. Asta ar insemna, daca ne luam si dupa graficul ala, ca aproximexi un impuls de ordinul x00 microsec la o rezolutie de 100microsec, ceea ce eu zic ca e o eroare mult prea mare. * Eu as face o smecherie cu semnalul asta. Zgaibele care apar sunt in mod sigur de la inductanta bobinei injectorului. Ca sa scap de ele, as pune un buffer. Trebuie calculat cu grija ca sa nu introduca intarzieri semnificative, dar mi-ar oferi un "super-semnal" de comanda. Altfel, oricum "oscilatiile" alea ar trebui "curatate" in circuitul de interfata spre PIC (un simplu cond si un trigger Schmidt ar fi poate -zic: poate- de ajuns). P.S. He, he, he! Ce mesaj aniversar mi-am tras Edited December 1, 2005 by Abram Burel Link to comment
tyranus Posted March 13, 2006 Share Posted March 13, 2006 (edited) In sensul celor scrise mai sus, supun spre studiu o posibila abordare a subiectului Calculator de Bord. Solutia care nu este ieftina (si neaparat exacta) se afla la adresa : http://www.esatclear.ie/~grabe/PICfuelRate/PICmpg.html Este poate interesanta pt. cei ce doresc sa patrunda pe taramul microcontrollerelor folosindu-se de acest prilej. Toate cele Bune. Edited March 13, 2006 by tyranus Link to comment
fun4cristi Posted October 11, 2007 Share Posted October 11, 2007 Imi poate descrie si mie cineva ce este computerul de bord al unui chevrolet aveo/kalos si al unui spark capabil sa afiseze? Asta in caz ca ecranul acela micut de pe bordurile lor este computerul.... Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now