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

STM32 - timer wykorzystywany do zliczania impulsów

22 Sie 2012 21:13 2958 4
  • Poziom 9  
    Mam problem z programem w którym timer ma zliczać impulsy (zbocza opadające). Konkretnie zegar timera ma działać w rytm impulsów podawanych na piny TIM4_CH1 i TIM4_CH2, z tym, że osobno liczę impulsy z każdego kanału i generuję osobne przerwanie dla każdego kanału. Liczenie impulsów z dwóch kanałów powinno działać jednocześnie. Impulsy pochodzą od 2 czujników kontaktronowych od silników. Impulsy z TIM4_CH1 odpowiadają silnikowi 1, a TIM4_CH2 silnikowi 2. Włączam jednocześnie obydwa silniki i chcę wyłączyć silnik 1 po np. kilku impulsach, a drugi silnik po kilkunastu impulsach. Pewnie by się dało coś takiego zrobić w funkcji obsługi przerwania.
    Dodam, że nie potrafię korzystać bezpośrednio z ustawiania bitów poszczególnych rejestrów operatorami bitowymi i wolę gotowe funkcje API.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    ]
  • Specjalista - Mikrokontrolery
    Myślę myślę i nie mogę wymyślić jak JEDEN timer mógłby liczyć DWIE rzeczy... Poza tym jaki dokładnie jest problem, bo w kodzie nie ma nawet pół słowa o kanale drugim, więc nie dziwne, że nie działa... Nie ma też sensu odczyt wartości capture, bo ty TAKTUJESZ timer tym zewnętrznym sygnałem.

    Czy poza dokumentacją do cudownych funkcji API przejrzałeś dokumentację samego mikrokontrolera, czy może mając takie cudowne funkcje API uznałeś to za zbędne? Gdybyś jednaj ją przejrzał, to niektóre rzeczy mogłyby się stać jasne...

    4\/3!!
  • Poziom 9  
    Problem polega na tym, że potrzebuję 2 liczników do zliczania impulsów z 2 źródeł, a te źródła to piny PB6 i PB7, czyli jak wskazuje nota katalogowa uC odpowiednio kanały 1 i 2 timera TIM4:
    STM32 - timer wykorzystywany do zliczania impulsów
    Myślałem, że jak są 2 kanały to każdy z nich może być źródłem sygnału taktującego i każdy kanał może zliczać osobno (jednocześnie). Jak się nie da to rozwiązaniem zastępczym jest zliczenie impulsów najpierw z jednego źródła (kanału), a potem z drugiego, przełączając źródło taktowania timera. Przy każdym zboczu opadającym ze źródła 1 zgłaszane by było przerwanie, a następnie w obsłudze przerwania zwiększany by był licznik-zmienna.
    Gdy licznik zmienna osiągnie zadaną wartość obsługa przerwania wyłącza silnik 1.
    Następnie źródło sygnału taktującego zmieniło by się na drugi kanał (źródło 2) i cała procedura powtórzyła by się dla silnika 2.
    Czy dobrze rozumuję? A może dałoby się to samo zrobić przy użyciu przerwań zewnętrznych EXT wykorzystując detekowanie zbocza opadającego na konkretnym pinie GPIO?
  • Specjalista - Mikrokontrolery
    To co opisujesz to właśnie idealne zastosowanie dla przerwań zewnętrznych, więc nie ma sensu w ogóle kombinować z timerem (jeśli nie możesz podłączyć tych sygnałów gdzie indziej, a w zasadzie tylko jednego z nich).

    4\/3!!
  • Poziom 9  
    Problem rozwiązało właśnie użycie przerwań zewnętrznych. Można w funkcji obsługi przerwania EXTI sprawdzać od którego wejścia pochodzi przerwanie i zliczać impulsy z tego wejścia. Dzięki za pomoc.