logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega328 - Jak zmierzyć czas trwania impulsu wtrysku samochodowego?

paavo91 24 Sie 2016 15:54 1995 8
REKLAMA
  • #1 15888744
    paavo91
    Poziom 19  
    Witam.

    Potrzebuję za pomocą uC zmierzyć czas trwania impulsu, dokładnie to będzie czas otwarcia wtrysku w samochodzie. Czytałem, że można to zrobić na wiele sposobów jednak najlepiej zrobić to za pomocą funkcji timera ICP. Rozumiem, że działa to tak:

    Timer cały czas zlicza czas...
    1. Gdy zbocze jest narastajace, przepisuje aktualna wartość timera do zmiennej zbocze1.
    2. Zmieniam aby teraz reagował na zbocze opadające.
    3. Gdy zbocze jest opadające , przepisuje aktualną wartość timera do zmiennaj zbocze2.

    Otrzymuję z tego różnicę (zbocze2 - zbocze1) co daje mi później w przeliczeniu czas trwania impulsu.

    Pytanie jednak jak zrobić żeby nie doszło do sytuacji gdy np. pierwsza wartość przy zboczu narastającym będzie bliska przepełnienia, a druga przy zboczu opadającym już będzie wartością po przepełnieniu czyli mniejszą od pierwszej?

    Mógłbym prosić o jakiś fragment pseudokodu?

    Dzięki
  • REKLAMA
  • Pomocny post
    #2 15888781
    dondu
    Moderator na urlopie...
    Dodajesz przerwanie od przepełnienia timera i w nim zliczasz ilość przepełnień.
    Reszta to już matematyka.

    Przykłady:
    http://mikrokontrolery.blogspot.com/2011/04/obrotomierz-diy.html
    http://mikrokontrolery.blogspot.com/2011/03/S...omierz-monitorowanie-przez-RS232-SimPlot.html
  • REKLAMA
  • Pomocny post
    #3 15888820
    excray
    Poziom 41  
    paavo91 napisał:
    jak zrobić żeby nie doszło do sytuacji gdy np. pierwsza wartość przy zboczu narastającym będzie bliska przepełnienia, a druga przy zboczu opadającym już będzie wartością po przepełnieniu czyli mniejszą od pierwszej?

    Jeśli zmienne do których zapiszesz TCNT1 będą typu unsigned int to i tak otrzymasz różnicę tych wartości. Czyli jeśli od wartości 0x0012 odejmiesz 0xffe2 to i tak otrzymasz 0x30 jako wynik.
  • REKLAMA
  • #4 15888998
    paavo91
    Poziom 19  
    Wzorowałem się na przykładzie z sieci. Czy poniższy kod wygląda ok? Póki co nie mam jak sprawdzić na biurku, jedynie widzę, że krótkie połączenia pinu do masy pokazują mi na LCD pewno wartości i przeważnie zaraz się zerują(czasami zostaje jakaś wartość).

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Chciałbym aby to działało w ten sposób, że pokazuje czas wtrysku, ale jeśli stan na pinie jest cały czas wysoki to niech zostaje ostatni wynik, jeśli z jakiegoś powodu zby długo niski, też to jakoś zasygnalizować.
  • #6 15889489
    paavo91
    Poziom 19  
    Nie rozumiem czemu w Twoim kodzie sumujesz dwa odczyty:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Poza tym nie mógłbym uruchamiać timera w momencie pierwszego zbocza(opadającego) a zatrzymać a następnie go zerować jak nastapi drugie zbocze(narastające) ?
  • REKLAMA
  • Pomocny post
    #7 15889921
    dondu
    Moderator na urlopie...
    paavo91 napisał:
    Nie rozumiem czemu w Twoim kodzie sumujesz dwa odczyty:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie sumuję :)


    paavo91 napisał:
    Poza tym nie mógłbym uruchamiać timera w momencie pierwszego zbocza(opadającego) a zatrzymać a następnie go zerować jak nastapi drugie zbocze(narastające) ?

    Wszystko zależy od Ciebie. Możesz kombinować na wiele sposobów w zalezności od dokładności pomiaru jaką chcesz uzyskać oraz faktu, czy nie wykorzystujesz jednocześnie timera także do innych celów.
  • Pomocny post
    #8 15890079
    Konto nie istnieje
    Poziom 1  
  • #9 15890426
    paavo91
    Poziom 19  
    Czyli jak bym chciał policzyć średnią z 50 pomiarów czas_trwania_impulsu typu unsigned int, to jaki typ zmiennej muszę mieć aby móc zsumować 50 wyników a na końcu podzielić przez 50? Bo chyba ten sam unsigned int mi nie starczy muszę mieć unsigned long int, zgadza się? :)


    Funkcja obliczania średniej:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Zbieranie próbek po skończonym pomiarze od zbocza do zbocza:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA