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

[ATMEGA8] Licznik impulsów na sekundę

komanche 22 Paź 2008 20:24 8284 8
  • #1 22 Paź 2008 20:24
    komanche
    Poziom 13  

    Witam!

    [wstęp]

    Potrzebuję zrobić na Atmedze8 jak najprostszy układ zliczający impulsy o częstotliwości od 2 Hz do około 120 Hz.
    Nie będę owijał w bawełnę - temat już poruszałem na elektrodzie jednak wtedy nie wiedziałem o co mi tak na prawdę chodzi. Teraz, gdy mam już jasne założenia i odrobinę wiedzy więcej postanawiam zadać dokładniejsze pytanie:

    [Część właściwa]

    W VW Golfie 2 TD na alternatorze od jednej z diod odprowadzony jest kabelek oznaczony W. Jest on przeznaczony do oryginalnego volkswagenowskiego obrotomierza montowanego czasem zamiast wielkiego zegarka :D Chciałbym zrobić licznik impulsów które wychodzą z tego kabelka (impulsy o napięciu aktotowieV ale na oko 12-15V).

    Coś tam nabazgrałem w mspaincie - za pewne źle.
    Zapewne coś źle podpiąłem, coś dałem więcej, coś mniej a czegoś wcale.
    Ale chyba po to jest to forum ;]

    Oto mój prymitywny schemat:
    [ATMEGA8] Licznik impulsów na sekundę

    2 8
  • #2 22 Paź 2008 21:56
    dawid512
    Poziom 32  

    Skoro impulsy o napięciu 12-15V to oprócz rezystorów dodaj dla zabezpieczenia diodę zenera dla końcówki portu do której ma dochodzić impuls. Po za tym zmień tą końcówkę na taką która jest oznaczona jako "INT0" lub 1. Dzięki temu podczas gdy wystąpi impuls wystąpi również przerwanie w którym np. inkrementujesz jakąś zmienną. Potem tylko warunki tzn. ileś tam impulsów to zrób coś itd.

    -1
  • #3 23 Paź 2008 07:51
    rfhzcx
    Poziom 13  

    Pytanie podstawowe - jak dokładne chcesz mieć pomiary i co jaki czasookres ? Tzn. czy wystarczy Ci rozdzielczość 1Hz a pomiary co 1 s ?

    0
  • #4 23 Paź 2008 13:02
    arturt134
    Poziom 26  

    Przy tak małej częśtotliwości dokładniej będzie mierzyć czas między impulsami - timerem.
    A wejście zabezpiecz solidnie. W samochodzie mogą wystąpić zakłócenia o dużym napięciu (nawet kilkadziesiąt woltów).
    Ja bym dał na wejściu rezystor szeregowy, nastepnie tranzystor separujący, którego bazę zabezpieczyłbym transilem dwukierunkowym na jakieś 30V. Kolektor tranzystora do napięcia zasilającego procka i masz sygnał o zakresie akceptowalnym przez procesor.
    Dodatkowo daj na pin procka jakiś mały kondensator ceramiczny, np. 1n.

    0
  • #5 23 Paź 2008 16:00
    komanche
    Poziom 13  

    jest to dieselek więc zakłócenia raczej mniejsze..

    jak to zrobić?

    jakiś ogólny szkic programu w bascomie?
    bo licznik chciałem zrobić na timerze jako counter z pomiarem co sekundę, ale skoro nie zrobiłem jeszcze nic poza programem to koncepcję mogę zmienić.

    pfff. to jak mam to podłączyć w końcu?

    0
  • #6 24 Paź 2008 07:42
    arturt134
    Poziom 26  

    Wejście proponuję zrobić jak na załączonym rysunku. Naszkicowałem w paincie, bo jego miałem pod ręką.
    Tak jak pisałem wczesniej, trransil na jakieś 30V (może niżej, ale na pewno nie poniżej 15V). Rezystor podciągający kolektor tranzystora do VCC to 10k. Rezystor szeregowy to np. 1k. Kondensator to 1n. Tranzystor to dowolny tani npn, np BC546.
    Jeżeli ktoś ma inne sugestie na temat zabezpieczeń, to chętnie sam posłucham.

    A co do programu, to najlepiej sygnał podłączyć do uC na wejście przerwania. Jak sygnał bedzie miał interesujące cię zbocze, to przerwanie się włączy. Włączasz timer odliczający czas. Przy drugim przerwaniu masz czas między impulsami; kasujesz timer i zaczynasz cały cykl od nowa.
    To na początek. Później możesz spróbować trochę ustabilizować wskazania poprzez uśrednianie. Ile kolejnych obliczeń uśredniać musisz stwierdzić eksperymentalnie. Być może będzie to liczba zależna od częstotliwości impulsów - jak podłączysz procka do rzeczywistego układu, to będziesz mógł pokombinować.

    W nastęnym kroku dodałbym filtrację na wejściu: gdy dostajesz przerwanie, to odczytujesz ten pin jeszcze ze dwa razy, aby się upewnić, że jest to zbocze sygnału, a nie przypadkowe zakłócenie. Algorytm jest podobny do eliminacji drgań styków klawiatury.

    Mam nadzieję, że udało mi się trochę pomóc.

    0
  • #7 24 Paź 2008 19:39
    komanche
    Poziom 13  

    Witam!

    Starałem się zrozumieć o co wam chodzi, bo to co dla Was oczywiste dla mnie pozostaje czarną magią ;)

    No ale dobrze, wydaje mi się, że zrozumiałem ;)

    Od strony "mechanicznej" wyglądać ma to mniej więcej tak:

    [ATMEGA8] Licznik impulsów na sekundę

    Dobrze myślę?

    A od programowej (i tutaj zapewne strzeliłem "babola") tak:


    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Timer0 = Timer , Prescale = 256
    Config Pind.2 = Input
    Config Int0 = Falling
    Dim L As Byte
    Dim L2 As Byte
    Dim L3 As Byte
    Dim Wynik As Byte
    Dim Wspolczynnik As Byte
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portb.1 , Rs = Portb.2




    Enable Interrupts
    Enable Int0
    On Int0 Przerwanie1 Nosave
    Cls

    Do
    Cls
    Loop

    End

    Przerwanie1:                                                'gdy wystapi przerwanie wykonaj

    Stop Timer0
    Cls                                                         'CzyszCzenie lCd                                                'zatrzymaj zliCzanie timera0
    Wspolczynnik = 1
    L = Timer0                                                  'zapisz do zmiennej l wartosC timera0
    L2 = L / 31250                                              'podziel zmienna l przez 31250 i zapisz do l2
    L3 = L2 / Wspolczynnik                                      'uwzglednienie przelozenia alternatora
    Wynik = 60 / L3                                             'uzyskaj wynik w obr/min
    Lcd "Obroty: " ; Wynik ; "RPM"

    Waitms 5                                                    'Czekaj na lCd ;)

    Start Timer0                                                'i zaCznij zliCzaC

    Return


    Proszę o wskazanie bledow ;]

    0
  • #8 25 Paź 2008 13:10
    komanche
    Poziom 13  

    hmmm... nikt błędów nie wskazał czyli... czysto?

    tak będzie wyglądać pcb: (nie mam wiertarki więc będę robił montaż "pseudopowierzchniowy" ) ;)

    [ATMEGA8] Licznik impulsów na sekundę

    0
  • #9 25 Paź 2008 18:06
    arturt134
    Poziom 26  

    Kod w C:

    Code:

    void main(void)
    {
       wlacz_timer();
       while(1)
       {
          if(przyszedl_impuls)
          {
             przyszedl_impuls = NIE;
             if(pierwszy_odczyt)
             {
                pierwszy_odczyt = NIE;
             }
             else
             {
                czas_miedzy_impulsami = stan_timera - stan_timera_poprzedni;
                //czas jest w cyklach zegara timera. Musisz przeliczyć go na sekundy lub częstotliwość.
             }
             stan_timera_poprzedni = stan_timera;
          }
       }
    }//main

    //Funkcja przerwania
    interupt void impuls_int(void)
    {
       stan_timera = TCNT;         //TCNT to licznik timera
       przyszedl_impuls = TAK;
    }//timer_int


    Inicjalizację timera musisz dorobić sam. Kod jest w C, ale myślę, że jest na tyle prosty, że łatwo go przerobisz na bascoma.

    0