Elektroda.pl
Elektroda.pl
X
Computer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Miernik zużycia paliwa do Opla Astry na 89C4051

06 Lis 2004 18:58 12615 66
  • Poziom 14  
    Witam.
    Na początku od razu zaznaczę ,iż zamierzam dopiero rozpocząć naukę programowania mikrokontrolerów więc jestem totalnym laikiem. Na forum było już sporo mówione na ten temat, ale zawsze robiło się to bardzo skomplikowane bo każdy chciał dodawać różne bajery i wreszcie nic z tego nie wychodziło.

    Mój problem polega na tym, że chciałbym wykonać miernik tylko zużytej benzyny w moim samochodzie (jako dodatek chwilowe spalanie tylko w litrach na godzine). Bez żadnych udziwnień jak LCD dotykowy czy inne ,jak dla mnie niepotrzebne dodatki.

    Samochód jest na wtrysku jednopunktowym i nie mam przetwornika drogi na impulsy (ale do tego chyba nie będzie mi potrzebny).

    Potrzebuje pomocy na każdy temat, jaki zastosować kwarc, jakie kondensatory i inne potrzebne podzespoły do działania. Końcowy projekt ma pokazywać wyniki na oryginalnym wyświetlaczu Opla (DID) przez I2C (sygnał nie koliduje z radiem bo wmontowałem inne, bez obsługi I2C).

    Podstawową zasadę obliczania mniej więcej znam, zliczać czas trwania otwarcia wtryskiwacza (sygnał z niego trzeba odizolować chyba transoptorem). Nie wiem jak to zaimplementować bo jeszcze nie znam języka i który będzie lepszy Bascom LT Demo czy Keil uVision2 Demo. Na początku (do testowania) wyniki można wyświetlać za pomocą diody, która będzie migała w zależności od wyniku np. czas 345ms ? 3 mignięcia ,odstęp 2sekundy ,4 mignięcia, odstęp dwie sekundy, 5 mignięć.

    Za wszelkie informacje będę wdzięczny.
  • Computer Controls
  • Poziom 25  
    ja bym do pomiaru zużycia zastosował raczej jakiś czujnik przepływu. Procesor by mierzył drogę i ilość paliwa dostarczonego do silnika. Jako procesor polecałbym jakiś z rodziny avr. jak jeszcze jakieś pytania to pisz.
  • Computer Controls
  • Poziom 14  
    najlepiej zastosuj w układzie zegarek pcf8583. on daje impuls z wypełnieniem 50% co sekundę czyli mozesz zrobić odświeżanie wyniku co 0,5 sekundy. a jakiego wyniku a no takiego: podłącz przez negację 40106 (negacja ze szmitem) sygnał z wtrysiwacza czy co tam masz na wejście przerwania. zdefiniuj timer jako timer 16bit ale bramkowany zewnętrznie. tzn jak na int np.0 będzie stan wysoki to timer0 zlicza impulsy zegarowe. jak będzie niski to nie liczy. podpowiem Ci, że nie mozna sprawdzić czy jest wtrysk. można sprawdzić czy go nie ma. aby to wyeliminować zastosuj optoizolację. daj mostek greca na wejściu transoptora i podłącz 2 przewody do wtrysku. uziemiaj przez bramki 40106 wejście przerwaniowe. teraz wystarczy co (pół lub) co sekundę odczytać czas wtrysku z ostaniej sekundy (lub połowy) i przeliczyć na zużycie oraz zapisać gdzieś (dodać) jako zużycie całkowite.

    pozdrawiam
    PC
  • Poziom 20  
    coś z tym wtryskiem ci się pokiełbasiło bo właśnie można sprawdzić czy jest wtrysk wystarczy zanegowac sygnał z wtryskiwacza. jeszcze trzeba znac stałą wtryskiwacza a reszte procek zrobi.
  • Poziom 14  
    nie prawda. są stany nieustalone i dopiero 2 przewody gwarantują pewną informację o wtrysku. w prawdzie ja teraz robię komputer na jednym przewodzie ale procedura odpowiedzialna za analizę jest dość skomplikowana.

    PC
  • Poziom 20  
    wtryskiwacz sterowany jest masą
    gdy na tym przedodzie jest stan niski to właśnie sika paliwem teraz go zanegować
    oczywiscie dobranie elementów do takiego interfejsu jest bardzo ważne
  • Poziom 14  
    widzisz nie do końca jest tak jak mówisz. owszem wtryski sterowane są przez tranzystory układzie OC i podają impulsy masowe ale masa jest również i to na stałe gdy silnik jest wyłączony i jeszcze w kilku innych sytuacjach. więc to, że jest masa na wtrysku wcale nie oznacza że jest wtryskiwane paliwo. +12 na drugim przewodzie czasami również zanika.

    PC
  • Poziom 14  
    ok. To jeśli dobrze zrozumiałem mam zrobić tak. Do wtryskiwacza idą 2 przewody plus i minus. Do obydwu mam się podłączyć i dać to na mostek Graetza. Dalej, dwa przewody po mostku podać na diodę transoptora, następnie sygnał z fototranzystora podać na bramkę negującą 40106 i wreszcie po zanegowaniu sygnał z bramki podać na wejście np. INT0 mikrokontrolera ,który to z kolei uruchomi timer zliczający czas. Proszę mnie poprawić jeśli się gdzieś pomyliłem.
    A co mam zrobić z tym PCF8583 gdzie podać te impulsy z niego? A czy ma jakieś znaczenie jaki kwarc zastosuje do procka (chodzi mi o częstotliwość)?
  • Poziom 20  
    jak silnik nie chodzi to jak tam będzie masa to paliwo bedzie sikaaaaaało i siakło tak????? az całe paliwo zejdzie z układu bo pompa nie chodzi
    to ja chce widziec jak ten silnik potem zapali mając nasikane paliwo w kolektorze

    po za tym podłączenie równoległe do wtrysku mostka i diody transoptora ma też wady go samoidukcja cewki wtryskiwacza narobi dodatkowych impulsów

    ja osobiscie mam sygnał wyprowadzony ze sterownika przed końcówką mocy tak że tych kłopotów nie mam
    jest czysty sygnał wrysku bez dodatkowych pików i przepięć
  • VIP Zasłużony dla elektroda
    Jak nie ma masy i nie ma zasilania to nie posiusia... :)
    A na samoindukcje to dobre są diody, jedna w kierunku przewodzenia do transoptora(warto jeszcze jakiś rezystorek w szereg z transoptorem np. 510Ω) i wtedy mostek Graetz'a do kieszeni, a druga równolegle do cewki w kierunku zaporowym...
  • Poziom 14  
    czy ja piszę o zasadzie działania wtrysku!! wydaje mi się, że piszę o zrobieniu komputera czyli interpretacji sygnałów jakie dostarcza sterownik wtrysku. a jest jak piszę. weź miernik i zobacz w samochodzie. po wyłączeniu zapłonu znika +12 a pojawia się masa więc skoro bierzesz masę za obiaw wtrysku to mimo, że wtrysk nie ma zasilania bo nie ma +12 komputer myśli, że wtrysk nadal jest. oprócz tego jest jeszcze kilka niespodzianek. ale pewnie o tym też wiecie.

    pozdrawiam
    PC
  • Poziom 14  
    do s_ica
    właśnie tak jak napisałeś jest OK.
    co do zegarka pcf8583 to nie jest on konieczny ale jest wygodny. po pierwsze odciąża procesor od odliczania jakiegoś stałego odcinka czasu aby mozna było policzyć chwilowe zużycie. pcf domyślnie daje masowy impuls co jedną sekundę. 0,5 sekundy jest masa i tyle samo brak masy. czyli możesz sekundę podzielić precyzyjnie na 2 części i odświeżać wskazania komputera co 0,5 sekundy. możesz sobie też w prosty sposób zrobić migające kropki w zegarku ;)
    po drugie daje Ci dodatkową funkcję albo kilka. np. kalendarz, który z kolei pozowli zrealizować przypomnienie o konieczności włączenia świateł itp.

    PC
  • Poziom 14  
    Według mnie ten "czujnik pomiarowy wtrysku" powinien zdać egzamin. Jeśli wtryskiwacz będzie miał zasilanie +12V i sygnał sterowany masą (czy jak to się tam nazywa) to wtryskiwacz na pewno wtedy działa ,a procek otrzyma o tym informacje.
    Czy wyjście z transoptora podawać jeszcze na tę bramkę 40106 i dopiero na procek?

    Aha ,jak to będzie podczas hamowania silnikiem bo w oplach odcina wtedy paliwo i spalanie wynosi 0L, czy odcina wtryskiwacze czy jakoś inaczej to robi?
  • VIP Zasłużony dla elektroda
    s_ice napisał:
    Według mnie ten "czujnik pomiarowy wtrysku" powinien zdać egzamin. Jeśli wtryskiwacz będzie miał zasilanie +12V i sygnał sterowany masą (czy jak to się tam nazywa) to wtryskiwacz na pewno wtedy działa ,a procek otrzyma o tym informacje.
    Czy wyjście z transoptora podawać jeszcze na tę bramkę 40106 i dopiero na procek?

    A przerwanie inicjujące licznik może być wyzwalane opadającym zboczem sygnału ? Można też mierzyć czas, kiedy nie ma wtrysku i odjąć od czasu całkowitego i wtedy negatorek nie będzie potrzebny. Z drugiej strony bramka Shmitta daje większą stabilność impulsów.
  • Poziom 14  
    szmitt jest przydatny do kształtowania impulsów. eliminuje różne bałagany. co do "przerwania" to w tym przypadku nie wykorzystuje się pinu int do generowania przerwania tylko do bramkowania odpowiedniego timera. timer można skonfigurować w taki sposób aby reagował na stan niski na odpowiadającym mu pinie int przez wstrzymanie liczenia cykli zegarowych co w tym wypadku jest rozwiązaniem idealnym.

    PC

    p.s.
    we wszystkich silnikach z wtryskiem i nawet niektórych gaźnikowych odcinane jest paliwo w czasie hamowania silnikiem. dla Ciebie nie ma znaczenia jak się to odbywa bo dwuprzewpodowe podłączenie jednoznacznie określa kiedy jest wtrysk a kiedy go nie ma.
  • Poziom 14  
    czyli do pinu np. int0 podpinam ten sygnał z wtryskiwacza, a programowo uruchamiam jeden timer ,a gdy przerwanie zostanie wywołane to przechodzi do odpowiedniej procedury gdzie zapisuje stan timera i zeruję go?

    Sygnał z układu PCF pewnie trzeba będzie podłączyć do drugiego przerwania lub do zwykłego wejścia i sprawdzać stan na nim. Jeśli będzie niski to wyświetlać wyniki. A co ze spalaniem chwilowym?
  • Poziom 20  
    czyli elektryke mamy opanowaną :)
    teraz "tylko" program
    ja mam bramkowany T0 tak jak tu wcześniej było zaznaczone
    ale myśle że zuzycie paliwa na godz niewiele ci powie
    ja bym był za ilością na km
    nie miałem też czujnika prędkości dlatego go zamontowałem na lince z licznika i narazie nie mam dokładnej wartosci spalania a tylko przybliżoną

    przy hamowaniu silnikiem odcinany jest wtrysk czyli zanika
  • Poziom 14  
    jeszcze raz dokładnie przeczytaj co napisałem. timery w 8051 mają mozliwość, co jest w tym wypadku niewątpliwą zaletą, zareagowania na stan pinu int. jak jest na int0 stan wysoki to wewnętrzny timer liczy cykle zegarowe. jak jest masa to ich nie liczy. i nic więcej nie trzeba robić softwarem. konfigurujesz odpowiednio timer i wszystko. co sekundę odczytujesz ile Ci naliczył i masz chwilowe zużycie. sumujesz naliczone cykle z kolejnych sekund i masz zużycie całkowite.

    PC
  • Poziom 14  
    Trochę poczytalem i poszperalem na forum oraz w necie. Oto co z tego wyszło.

    $sim
    Config Timer0 = Timer , Gate = External , Mode = 1 'timer bramkowany zewnetrznie

    Set Tcon.0
    set Tcon.4

    enable interrupts
    enable int0

    on int0 odczyt

    START TIMER0

    Dim Wynik As Word

    Do
    Loop

    Odczyt:
    Wynik = Timer0 'tu pokazuje blad ERROR 10: Wrong type
    Print "odczyt:" ; Wynik
    Return

    może coś źle robie ale w kilku przykladach gdzieś widziałem odwołania i przypisania do Timer0 np.
    Timer0 = 0
    lub
    Print Timer0

    ja przepisałem wartość z timer0 do zmiennej wynik, ale jest błąd. Te zwroty powyżej napisane również nie działają (też pokazuje błąd). Jak więc mam zrobić odczyt zliczonych cykli zegarowych w czasie trwania impulsu na INT0?
  • Poziom 14  
    użyj Counter0 zamiast Timer0 i będzie OK ;) reszta jest cacy.

    PC

    -------------------


    aaaaa i jeszcze:

    On Timer0 Przeladuj_timer0
    Enable Timer0

    Przeladuj_timer0:
    incr Cykl_t0
    Return

    To jest niezbędne bo jak Ci się przepełni Timer0 to będzie zonk ;)

    Potem jak sprawdzasz zliczoną wartość mnożysz Cykl_t0*65535 i dodajesz Counter0 czyli to co zliczył od ostatniego przerwania.

    Zgaduję, że to przerwanie INT0 to uruchomiłeś sobie testowo bo docelowo nie jest potrzebne. Musisz np. na drugim timerze odliczać jakiś stały odcinek czasu (sekundę, dwie albo pół) i wtedy sprawdzać ile timer0 naliczył. Albo wykorzystać zewnętrzne przerwanie od zegarka na INT1.

    PC


    Posty napisane w odstępie kilku minut scalono. Proszę zapoznać sie z Regulaminem forum, a zwłaszcza z częścią mówiącą o przycisku Miernik zużycia paliwa do Opla Astry na 89C4051
    W związku z tym Ostrzeżenie #1
    LEM
  • Poziom 14  
    zamieniłem na counter0, kompilacja przebiegła bezbłędnie. Ale podczas symulacji, jak wywołam INT0 to wynikiem jest liczba 166 za kaźdym razem niezależnie od tego jak długo przytrzymam klawisz INT0. Chyba ,że długość trwania impulsu na tej końcówce ustawia się jakoś inaczej niż przytrzymywanie button'a. Jak to zasymulować ,ten czas trwania impulsu?
  • Poziom 14  
    do symulowania wykorzystaj inny pin np. int1. int0 ma w tym wypadku specyficzne własności.

    PC
  • Poziom 14  
    czyli powinienem napisać to samo tylko wykorzystać int1 i timer1?
  • Poziom 14  
    mam złe wieści. nie działa to w symulacji. próbowałem ale timer liczy mimo, że na p3.2 jest stan niski :( znaczy kolejny babol w symulatorze.

    PC
  • Poziom 14  
    Zauważyłem też, że wypisując wynik podaje mi tylko wartość z rejestru TL0 ,a TH0 nie jest przeliczane. Czyli wynik mam od 0 do 255, chociaż liczy jako 16 bitowy licznik. Co może być tego przyczyną?

    --------------------------------------------------------------
    mój błąd, zmienne zainicjowałem w typie byte. Poprawiłem na Long i jest OK.
  • Poziom 14  
    Przyznam się, że ja z symulatora w zasadzie nie korzystam. Ewentualnie sprawdzam czasy poszczególnych procedur. Jak pasuje to ok jak nie to piszę w asemblerze (przynajmniej staram się ;) ).
    Powiem tak: mój komputer pokładowy liczy kilka rzeczy: prędkość bieżącą, średnią, maksymalną, dystans, prognozę dystansu (na ile km jest jeszcze paliwa), czas podróży, ilość paliwa w zniorniku, paliwo zużyte (max 200 litrów), średnie zużycie paliwa na 100km, BIEŻĄCE ZUŻYCIE PALIWA!! w czasie jazdy w litrach na 100km lub na postoju w litrach na godzinę, pokazuje 2 temepratury na zewnątrz lub w środku, sygnalizuje niski stan paliwa w zbiorniu, sygnalizuje również gołoledź (potencjalną) oprócz tego ma moduł kalibracji, który umozliwia dopasowanie go do dowolnego samochodu z wtryskiem. W końcu ma też zegarek i kiedyś będzie krzyczeć: "WŁĄCZ ŚWIATŁA !!".
    Program mieścił się w 8kB ale zrobiłem współpracę z instalacjami gazowymi i musiałem zwiększyć procek do 12kB. Pierwsza wersja była napisana w 100% w Bascomie i wszystko działało idealnie. Więc gwarantuję, że metoda jest dobra. Zmontuj jakiś układ i do dzieła. Bez testów na rzeczywistym układzie nie da rady.

    Pozdrawiam
    PC
  • Poziom 14  
    Dzięki, trzeba będzie pomyśleć o hardware :)

    mam tylko jeszcze jedno pytanko.
    mając ilość cykli zegarowych, jak zamienić je na czas? Bo np. Wynik z czasem otwarcia wtryskiwacza będe miał w cyklach zegara a nie np. w us czy tam ms. Czy może trzeba 1sekunde podzielić na częstotliwość kwarcu i to co wyjdzie pomnożyć przez liczbe cykli i mamy czas w sekundach?


    PS. czy w przyszłości jeśli chciałbym zrobić jeszcze liczenie prędkości to będę potrzebował procka z trzema przerwaniami (trzecia do liczenia impulsów z prędkościomierza?)?
  • Poziom 14  
    s_ice napisał:
    Dzięki, trzeba będzie pomyśleć o hardware :)

    mam tylko jeszcze jedno pytanko.
    mając ilość cykli zegarowych, jak zamienić je na czas? Bo np. Wynik z czasem otwarcia wtryskiwacza będe miał w cyklach zegara a nie np. w us czy tam ms. Czy może trzeba 1sekunde podzielić na częstotliwość kwarcu i to co wyjdzie pomnożyć przez liczbe cykli i mamy czas w sekundach?


    PS. czy w przyszłości jeśli chciałbym zrobić jeszcze liczenie prędkości to będę potrzebował procka z trzema przerwaniami (trzecia do liczenia impulsów z prędkościomierza?)?


    Dla uproszczenia obliczeń daj kwarc 12MHz. Wtedy na 1 sekundę wtrysku masz 1M cykli. Ja liczę czas wtrysku w milisekundach. Czyli na sekundę mam 1000ms czasu wtrysku. A z tym to już można wszystko zrobić. W końcu godzina ma tylko 3600 sekund ;).
    Co do prędkości to szkoły są conajmniej dwie. Liczyć impulsy i odczytywać ich ilość co jakiś czas lub mierzyć czas między impulsami. I do jednego i do drugiego będziesz potrzebować drugi timer.
    Jeżeli napiszesz program, który w jakiś sposób będzie odmierzać precyzyjnie czas i ZMIEŚCI SIĘ W 4kB (ROTFL) to oczywiście nie będziesz potrzebował większego procka ;)

    PC
  • Poziom 14  
    Jeszcze raz dzięki.
    te 12Mhz to pewnie przez ten jakiś dzielnik w tych mikrokontrolerach. Gdzieś właśnie coś takiego czytałem ,że te timery jakoś coś tam dzielą przez 12. Nie pozostaje mi nic innego jak zamienić to na praktykę. :)

    pozdrawiam
  • Poziom 14  
    Jest dokładnie tak jak myślisz. Standardowe 8051 dzielą częstotliwość rezonatora przez 12. Z kwarcem 12MHz mozna również uzyskać z powodzeniem podstawowe baud rate w komunikacji rs bo zapomniałem napisać, że mój kompik też gada z PC-tem po rs-ie ;) ale to szczegół.

    Powodzenia.
    PC

    p.s.
    Jak będziesz miał problemy wal jak w dym. Wiem jak to jest błądzić po omacku.