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

[Rozwiązano] STM32F103 - Nieprawidłowe odmierzanie czasu w trybie One-Pulse na TIM2

Wodzirej 11 Kwi 2019 17:56 2046 3
REKLAMA
  • #1 17899946
    Wodzirej
    Poziom 12  
    Posty: 66
    Pomógł: 1
    Ocena: 52
    Witam!
    Mam w swoim programie chciałbym wykorzystać timer w trybie one pulse do odmierzania czasu, ale w taki sposób, żeby można było wyłączyć timer w przerwaniu od wartości CCR. Do tego celu wykorzystuje TIM2 (general purpose). Niestety timer nieprawidłowo odmierza czas kiedy chcę go wyłączyć bitem CEN(np wpisuję ze ma się wyłączyć po 100us a wyłącza się po 180us) jedyne co mi się udało wymyślić żeby odmierzał dobrze to w przerwaniu wpisuje do CNT wartość ARR i w naturalny sposób się wyłącza i w takim przypadku działa dobrze. Na TIM 1 taki sposób działa prawidłowo ale nie mogę wykorzystać TIM1 bo jest już zajęty. Mikrokontroler to STM32F103. Poniżej konfiguracja:

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



    Czy może ktoś się spotkał z takim problem a może go rozwiązał?
  • REKLAMA
  • REKLAMA
  • #3 17900136
    simw
    Poziom 27  
    Posty: 756
    Pomógł: 94
    Ocena: 286
    Wydaje mi się, że nie dobrze zrozumiałeś co to jest One Pulse Mode, dlatego masz problem z konfiguracją
    W tym trybie nie ma konieczności wyłączenia timera poprzez:

    TIM2->CR1 &= ~TIM_CR1_CEN;

    bo on sam się wyłącza (przestaje liczyć) zgodnie z ustawieniami.

    Ja do tego zadania użyłbym trybu PWM i zrobił to jak w kodzie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W programie macham pinem DEBUG_PIN1 co 100 us, czynność powtarzam co 1ms - dla zobrazowania.
    Trygierzem jest komenda:
    TIM2->CR1 |= TIM_CR1_CEN;


    Przy okazji włączyłem PWM na wyjście i jak widać czasy się zgadzają.
    Oczywiście mój sposób nie jest jedyny, a na pewno nie najlepszy.


    STM32F103 - Nieprawidłowe odmierzanie czasu w trybie One-Pulse na TIM2
  • #4 17900355
    Wodzirej
    Poziom 12  
    Posty: 66
    Pomógł: 1
    Ocena: 52
    Tak jak wskazał excray dodanie do konfiguracji poniższej linijki rozwiązało problem.

    TIM2->EGR = TIM_EGR_UG;

    Dziękuję za zainteresowanie.
REKLAMA