Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32[C] TIM2 - pomiar czasu sygnału wejściowego

micrograf 02 Oct 2012 12:21 2598 5
  • #1
    micrograf
    Level 10  
    Witam,

    Mam problem z konfiguracją licznika do pomiaru czasu trwania sygnału na wejściu PA1. Generalnie chcę to rozwiązać w następujący sposób:

    w momencie wykrycia zbocza narastającego lub opadającego wywołuję przerwanie EXTI1. W obsłudze przerwania EXTI1_IRQHandler, sprawdzam stan portu PA1 jeśli jest stan wysoki to chcę uruchamiam licznik, który zmierzy czas trwania impulsu.

    konfiguracja EXTI:

    Code: c
    Log in, to see the code


    konfiguracja TIM2 - tu nie wiem jak prawidłowo skonfigurować licznik. W tej konfiguracji licznik uruchamia się i liczy do wartości 2500...

    Code: c
    Log in, to see the code


    obsługa przerwania:

    Code: c
    Log in, to see the code
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • #2
    szefkozak
    Level 11  
    Jako pomoc mogę ci podać swoje funckje do pomiaru czasu:

    Code: c
    Log in, to see the code


    W momencie kiedy chcesz zacząć liczyć czas wywołujesz funkcje vhTIMER2_GetTicks(). i przechowujesz w zmiennej aktualny stan licznika. Natomiast kiedy chcesz obliczyć różnice czasu wywołujesz funkcję vhTIMER2_GetTimeDifference() , jako parametr przekazujesz zmienną do której wcześniej zapisałeś stan licznika, a funkcja zwraca Ci róznicę. to ile ta różnica wynosi zależne jest od wartości preskalera. W moim przypadku CPU "chodzi" na 168MHZ a wartość licznika zmieniana jest co jedną milisekundę więc wynik jest wprost wartością w milisekundach.
  • #3
    micrograf
    Level 10  
    Dzięki za pomoc, jeśli dobrze zrozumiałem to licznik chodzi cały czas, jak chce zacząć pomiar to wywołuje funkcję vhTIMER2_GetTicks po czy jak chce skończyć pomiar to znowu ją wywołuje i później robię różnice zmierzonych czasów ?
  • #4
    szefkozak
    Level 11  
    Dokładnie, albo odejmujesz wyniki pomiarów, albo wywołujesz funkcję vhTIMER2_GetTimeDifference() i przekazujesz jako parametr wynik pierwszego pomiaru
  • #5
    nibbit
    Level 20  
    Z tym bym polemizował:
    szefkozak wrote:
    TIM2->PSC = (uint16_t)83999; //Prescaler: counter value increased every milisecond


    Dodatkowo nie bierzecie pod uwagę, że może wystąpić przerwanie od przewinięcia się licznika.
  • #6
    szefkozak
    Level 11  
    Jeżeli przerwania nie odblokujesz to nie wystapi. A preskaler, wiadomo, należy ustawić indywidualnie w zależności od ustawień oscylatorów w własnym projekcie.