Fórum témák
» Több friss téma |
Most számoltam egy fogyasztást is. 180km-ert mentem 11.75 liter benyával kb. ez 6.5liter/100km. A kütyü is ennyit mért.
Nem ismerem ezt az Ic-t, de a INT0, INT1 az külső megszakítás ugye? Azt használod valamire, mert azzal is számoltathatnál..
Én azt mondom, hogy ne építs véglegest... Én egy évig fejlesztgettem és most is tudnék mit fejleszteni rajta hardveresen.
Igen, az külső megszakítás. Konkrétan az a bajom hogy rezeg a km/h mutatóm. Ez azt jelenti hogy hol gyorsabban forog a sebesség jeladóm tárcsája, hol lassabban. Mivel most nem timer/counter méri a jelét hanem szoftveres periódusidő mérés van így mikor hol sikerül mérnie, hülyeségeket mér. Csinálhatnék több mérést is és akkor átlagolhatnám, így kb középértéket kapnék, de az + idő. Lassabb lesz a szoftver, lassabban reagál majd a menü kezelő gombokra, és lassul a képernyőfrissítés is. Nem vagyok híve az egy másodperces képernyőfrissítésnek mint sok gyári mérőnél láttam. Azt szeretem ha pörögnek az értékek (persze csak annyira hogy leolvasható legyen pl 1/4 másodperc)
Ez is igaz, ennek még ki kellene forrnia magát, azután lehet végleges csak de, igyekszem az eddigi tapasztalataimból most már mindenre gondolni. Lecserélem az LM358-at is egy nagy sebességű komparátorra, LM311. A hozzászólás módosítva: Aug 4, 2013
Nálam úgy működik a dolog:
Egy időzítővel előállítok megszakításokat (ez esetemben 2s) közben külső megszakításokon számoltatom a sebességet és a benzint. Minden 2 másodpercbe számoltatok és így tovább. Azért mondom ezt mert te bajba vagy az időzítőkkel, azt írtad... A hozzászólás módosítva: Aug 4, 2013
Bajba nem, csak nincs belőle elég megoldom ezt is
Nem lehet valahogy egy olyan sebesség jeladót felapplikálni, ami közvetlen a váltónál van? Bővebben: Link
Minek? Az opelekben tudtommal van. Csak ezzel a módszerrel mér hülyeséget, a timer counterrel mérem akkor jó. A 2 mérés között az a különbség hogy:
-szoftveres: a timert/counter a CPU órajelére kapcsolom, mikor kezdődik a felfutó él akkor nullázom, és a következő felfutó élnél kiolvasom a timer értéket. Vagyis periódus időt mérek, amiből ki tudom számolni a frekvenciát. Ezért ugrál a mért sebesség ha nem tökéletes a spirál mert mikor hol sikerül megmérni a periódusidőt. Egyszer gyorsabban forog a jeladó tárcsa egyszer lassabban. Ez a fajta mérés viszont elég felbontást ad pl fordulatszámméréshez mert nekem a 30-as felbontás nem elég de, sebesség méréshez igen, mert a kerék körbefordulásakor 32 impulzust ad a sebességjeladó míg a főtengely körbefordulásánál 2 impulzust ad a gyújtás jeladó. -hardveres: ehhez 2 timer/counter kell. az egyik aszinkron módba működik és egy másodpercenként megszakítást idéz elő, ez az időalap. A másik timer/counter-t külső órajelre kapcsolom és ennek az órajele a sebesség jeladóból jövő impulzus. Mikor megszakítás van akkor kiolvassa a timer/counter értéket egy változóba és nullázza a timer/counter értéket. Így ha a spirál nem is tökéletes, hiába ugrál a mutató, egységnyi idő alatt (esetemben 1sec) mindig ugyanannyi impulzus jön be, ugyanaddig számol el a timer/counter és ezért nem ugrál a mért érték, ebből kiszámolva a mért sebesség sem. A hozzászólás módosítva: Aug 5, 2013
Hardveres mérésnél miért kell 2db timer/counter? Az első az oké, de a másodiknak miért kell timernek lennie???
Meg lehet csinálni delay-el is de, akkor addig fogja a fő program szálat értelemszerűen, addig nem fut tovább a program vagy, még úgy is meg lehet csinálni hogy egy változó értéket növelek és a proci sebességéből kiszámolva, mikor eléri azt az értéket ami 1 secnek felel meg, akkor kiolvasom a timer/counter értéket és nullázom. De akkor mindig ugyanannyi utasítást kell végrehajtani hogy ne legyen csúszás... de ezeket neked tudnod kellene
ki lehet váltani a másik timert-t is ha külső megszakítás lábra kötöm, és mikor érkezik egy le vagy felfutó él, vagy akármilyen szint változás van, akkor egy változó értékét növelem, és ezt olvasom ki, nullázom és számolok belőle. De ez is fogja a procit míg azt az egy változót növeli eggyel, minden impulzuskor.
Miért kell kettő? Így a legminimálisabb a proci programjának a lassítása mert így amit lehet hardveresen van megoldva.
Pont erre gondoltam! Sztem ez a megoldás sem terhelné a procit annyira ami már zavarná a működést... De értem a logikádat....
Bocs hogy belevau, de ha használnád a külső megszakítást, akkor pont azt nyernéd vele, hogy a főprogramban már nem kellene mérni! Így aztán mindegy, hogy egy két órajellel több, vagy kevesebb jut a főprogramra, hiszen az úgyis csak matekozik, meg gombokat, lcd-t kezel.
Azt írtad, hogy ugrál a mutató. Az említett kocsiban ha jól tudom a vss egy reed cső a sebességmérő mellett. Ha ugrál a mutató az befolyásolja a mérést. Másik sebességszenzorral tökéletes lenne a mérés eredménye, mert az közvetlen a váltóba csatlakozik, nincs ugrálás.
Bár tényleg sokkal egyszerűbb ezt a szoftverben lekezelni.
Már megálmodtam hogy lesz srácok. Timer0-val mérem a sebességet. A fordulatot és a befecskendezési időt periódusidő méréssel, Timer1-el. Timer2 pedig 1s időalap lesz. Így ki is van használva a 3 timer/counter. Azt kell ügyesen leprogramozni még hogy ha épp méri a fordulatot vagy befecsi időt, akkor az 1s megszakítás ne következzen be. Vagyis meg fogom mérni hogy mennyi idő megmérni a fordulatot és a befecsi időt és nézem timer2 értékét. Ha belefér még a mérés akkor mérek, ha mérés közben megszakítás lenne akkor pedig nem engedem hogy megszakítás következzen be közbe.
Idézet: „Azt írtad, hogy ugrál a mutató. Az említett kocsiban ha jól tudom a vss egy reed cső a sebességmérő mellett...” Nem reed cső, hanem egy optokapus jeladó, enkóder tárcsával. Idézet: „Bocs hogy belevau, de ha használnád a külső megszakítást, akkor pont azt nyernéd vele, hogy a főprogramban már nem kellene mérni! Így aztán mindegy, hogy egy két órajellel több, vagy kevesebb jut a főprogramra, hiszen az úgyis csak matekozik, meg gombokat, lcd-t kezel.” Nem látom értelmét használni a külső megszakításnak. Csak a sebesség méréshez kell egy timer. Az meg van. Tök mind egy hogy hardveresen léptetem a timert ami úgy is van, meg gyorsabb is, mint hogy most megszakításból szoftveresen léptessek egy változót. A fordulat méréshez is periódusidőt akarok mérni mivel a képlet szerint: Fordulatszam = ((Timer1val*60)/2); A képlet szerint látni ha Timer1val (ami a timer értéke) ha egész szám, akkor csak 30-as felbontás van. Viszont ha lehet tizedes tört is akkor a felbontás lehet 1 is Ekkor a képlet: uint32_t buff1 = (F_CPU*100)/Timer1val;//freki Fordulatszam = ((buff1*60)/2)/100; F_CPU = 16000000; A hozzászólás módosítva: Aug 6, 2013
Nemtudom, hogy ismered e ezt: Bővebben: Link
Bővebben: Link Elég kevés infó van róla. A blokkdiagrammon nem látom, hova van kötve a sebességjel. A hozzászólás módosítva: Aug 6, 2013
Ha megálmodtad akkor jó, nincs több hozzáfűznivaló! Az a lényeg, hogy a te elvárásaidnak megfeleljen.
Idézet: „Nem látom értelmét használni a külső megszakításnak. Csak a sebesség méréshez kell egy timer. Az meg van. Tök mind egy hogy hardveresen léptetem a timert ami úgy is van, meg gyorsabb is, mint hogy most megszakításból szoftveresen léptessek egy változót. ” A lényeg az utolsó mondatod második fele! A külső megszakítás nem csak arra jó, hogy amikor bekövetkezik, akkor majd te szoftveresen csinálsz valamit! Tudsz olyat is, hogy maga a megszakítás hardveresen léptessen egy regisztert, tehát a többi dolgodba nem is szól bele! Sőt ha jól tudom, akkor ennek a regiszternek egy adott értékénél vagy túlcsordulásánál generál neked egy belső megszakítást, amivel már végre is hajtottad a mérést! Nincs szükség mérni a mérés idejét, és egyéb varázslatokra! Ezt csak azért mondtam el, hogy ha mégis nyitva lenne még a megvalósítás módja, akkor ezzel is egyszerűsíthetsz! Idézet: „Viszont ha lehet tizedes tört is” Ezt viszont kerülném a helyedben, mert jól megdobja a kódméretet, és még be is lassít! Inkább szorozd fel 1000-el, és akkor számolhatsz egészként. Max a kijelzésnél jó helyre pozícionálod a tizedespontot! A hozzászólás módosítva: Aug 6, 2013
Nem ismertem, köszi Jók ezek a VFD kijelzők. A sebesség jeladó szerintem az odometer.
Tudom hogy nagyon lassít, pont ezt csinálom itt:
uint32_t buff1 = (F_CPU*100)/Timer1val;//freki -> szorzok 100-al Fordulatszam = ((buff1*60)/2)/100; //-> osztok 100-al
Hát tényleg... Szemem kiüti.... Tényleg szépek ezek a karakteres vfd -k. Sajna nekem csak hétszegmentses van péztárgépből. Szép nagy, szerintem lesz abból még valami Jó tudni, hogy a tizedestört belassít. Kiveszem akkor a készülő pic es analóg fordulatmérőmből is.
A hozzászólás módosítva: Aug 6, 2013
Meg az "osztom százzal" is kimehet belőle, ha a fordulat közvetlenül a kijelzőre megy. Egyszerűen két nullát nem írsz ki. Persze ez függ a megvalósítástól, de ha lehet használni, akkor ez is gyorsít.
Idézet: „A lényeg az utolsó mondatod második fele! A külső megszakítás nem csak arra jó, hogy amikor bekövetkezik, akkor majd te szoftveresen csinálsz valamit! Tudsz olyat is, hogy maga a megszakítás hardveresen léptessen egy regisztert, tehát a többi dolgodba nem is szól bele! Sőt ha jól tudom, akkor ennek a regiszternek egy adott értékénél vagy túlcsordulásánál generál neked egy belső megszakítást, amivel már végre is hajtottad a mérést! Nincs szükség mérni a mérés idejét, és egyéb varázslatokra! Ezt csak azért mondtam el, hogy ha mégis nyitva lenne még a megvalósítás módja, akkor ezzel is egyszerűsíthetsz!” Igen, ezt csinálom meg mikor majd a sebességet mérem. A timer/countert külső órajellel hajtom, hardveresen lépteti a számláló regiszterét. Ezek esetemben a T0, T1, Tx láb a mikrokontrolleren. Mikor külső megszakításról beszélek akkor az INT0, INT1, INTx lábakat értem ez alatt, ahova is egy függvényt lehet írni ami viszont ugye szoftveres. Mikor azt mondtam hogy megmérem a mérés idejét.... egyszer fogom ezt tenni mielőtt megírom, de megmérni sem kell mert ki tudom számolni... szóval elmondom mit értettem ez alatt. Fut a főprogram, és egyszer belebotlik egy olyan függvénybe ami meg fogja mérni a fordulatszámot. Ez esetemben tételezzük fel hogy alapjárat: 960RPM de én ennek csak a periódusidejét fogom mérni így:
Ahova az van írva hogy "áll míg az a szint be nem következik, ott lassítja, megfogja a főprogramot addig. Ez esetemben, és akkor a maximum időt számolom: 960RPM -> 16RPS -> ez 16hz másképp mondva mert másodpercre váltottam. Ennek a periódusideje: 62,5ms tehát ez 2 féle jelszint, ugye periódusidőt felfutóéltől felfutóélig mérünk vagy lefutótól lefutóig. ezért ha ezt osztom kettővel, akkor kijön egy jelszintre várás maximum. Ez: 31,25ms. A mérő függvényben hány sor tudja megfogni a főprogramszálat? Ahány while utasítás van. Addig nem megy tovább míg a zárójelek közzé írt feltétel nem teljesül. Ez esetemben 4db. Ami 4x31,25ms= 125ms. Másik mérés. Befecskendezési idő.
Fordulatszám ugyan úgy 960RPM-nek veszem. Az alapjárati befecskendezés kb 1.5ms. Most fordulatból kiszámolom ugyan ezt mint az előbb csak, a vezérműtengelyem és a főtengelyem között, amit ugye a vezérmúszíj köt össze, 2:1 áttétel van. Ezért a fordulathoz tartozó periódusidőt feleznem kell ami ismét 31,25ms-re jön ki és ebből kivonódik a befecskendezési idő/ egy hengerhez. Tehát ennek is maximum 31,25ms lesz a mérési ideje. Fordulat: 125ms Befecsi idő: 31,25ms (ha növekszik a fordulat csökken a méréshez szükséges idő is, ezt könnyű belátni, ha nem hiszed számold ki!) Összes idő: 156,5ms Menjünk tovább... Most már belejöttem Aszinkron timer/counter2. Számlálóregisztere 8bites ami 256-ig tud elszámolni. 32768khz kvarccal, 128-as órajel osztóval 1 másodpercenként túlcsordúl, megszakítás következik be. A timer/counter2 két érték közötti ideje: 1/256 = 3,90625ms Most megnézem hogy mikor nem fog megszakítás bekövetkezni az időalap miatt mikor épp a periódusidő méréseket kezdeném: 156,5ms / 3,90625ms = 40,064 érték lépés amit, inkább kicsit többre veszek. Legyen 50. A timer/counter2 felfelé számol tehát 256-50=206. Így a 2 periódus idő mérést még simán el lehet végezni akkor ha a timer/counter2 értéke kisebb mint 206 mert akkor míg még 256-ig ér, és megszakítást generálna a mérés közepén, 195,3125ms idő van hátra, ami több mint a 2 periódusidő méréshez szükséges idő maximum. Ebbe belefér a 156,5ms és még marad is. Ez programban így néz ki:
Bocs a regényért, remélem érthető
Sziasztok!
Talán ez segít picit. Bővebben: Link Bascom avr ben irogatom a programot. Amúgy én is bajlódom vele. Nem tudom melyik az injektor vezérlő vezetéke, szkópom meg nincs. Üdv! A hozzászólás módosítva: Aug 7, 2013
Injektor vezérlő vezetéke? Ez elég kevés infó. Milyen kocsid van? Ha autódatában benne van akkor megmondom neked. Általában az injektorok pozitív testelésüek, ezért ha az akksit leveszed, és lehúzod az injektor vezetékét, akkor egy szakadásvizsgálóval, (pl multiméter diódavizsgáló állásban) meg tudod melyik a test, és a másik a jel.
Nem rosz az sem amit belinkeltél. Sokat dob rajta az a grafikus kijelző amúgy. Csak nekem nem tetszik.... nagyon kicsike. Eredetileg én is grafikus kijelzőt akartam használni, csak igény van a gyári Opel TID-re is. Ezért 3 kijelző kezelésére is fel fogom készíteni a BC-met. A gyári TID-re, egy 2x16 karakteres kijelzőre, és amire én eredetileg tervezem, az egy 5 colos LCD. Ehhez igaz hogy kell még majd egy mikrovezérlővel kezelhető videókártya is de, ez is összeállt már fejben. Továbbá ki akarom bővíteni hőmérséklet méréssel is, kinti benti és motorhűtő folyadék méréssel is. A hozzászólás módosítva: Aug 7, 2013
Skoda Felicia 1.3 mpi az autó típusa.
A hozzászólás módosítva: Aug 7, 2013
Még mindig kevés.... Évjárat? Motorkód?
2001 évi
motorkód 135m
Sajna kapcsolási rajz nincs a programban róla.
Minden infót összeszedtem neked ami benne volt. |
Bejelentkezés
Hirdetés |