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

[STM32F1] - Ustawianie wypełnienia PWM TIM3 zakłóca pracę TIM2

qscgu 08 Lut 2013 00:29 5790 43
Najlepsze odpowiedzi

Dlaczego ustawianie wypełnienia PWM na TIM3 w przerwaniu TIM1 zakłóca pomiar czasu na TIM2 i jak to naprawić?

Zakłócenia nie wynikały z konfliktu timerów, tylko z hardware: sygnał PWM przenikał na wejście EXTI i wyzwalał fałszywe przerwania, przez co pomiar z TIM2 wyglądał na uszkodzony [#11910395][#11910707] Po wstawieniu rezystora 1 kΩ między pin STM32 a bazę tranzystora zakłócenia zniknęły i pomiar wrócił do normy [#11910707] Na innym mikrokontrolerze ten sam kod działał poprawnie, więc problem był związany z konkretnym układem/połączeniem, a nie z samą konfiguracją timerów [#11976209]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 11904084
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Witam.

    Temat dziwny bo i problem dziwny. Otóż, jeśli w przerwaniu Timera 1 ustawię wypełnienie PWM timera 3 to cały pomiar na timerze 2gim zwraca jakieś pierdoły.

    Mam następującą konfigurację Timerów:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tutaj jest przerwanie Timera 1:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Gdy zakomentuje te linijki to Timer2 działa poprawnie. W przerwaniu timer2 nie wiele jest, po prostu zwiększam ilość:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Co robię źle? Może trzeba coś jeszcze przy okazji ustawić? Albo konfigurację TImerów mam złą?

    Pierwszy raz się z takim dziwolągiem spotykam. Optymalizację wyłączyłem. Procesor to F103ZET6
  • REKLAMA
  • #2 11904358
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    qscgu napisał:
    Otóż, jeśli w przerwaniu Timera 1 ustawię wypełnienie PWM timera 3 to cały pomiar na timerze 2gim zwraca jakieś pierdoły.

    Nie ma to jak konkretny opis problemu! Od razu wiadomo o co chodzi (;

    4\/3!!
  • #3 11905456
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Hmm, nie wiem jak to dokładniej opisać.

    1. Na timerze 2gim, realizuje pomiar czasu, w przerwaniach exti mierzę za pomocą tego timera czas pomiędzy zboczami narastającymi co daje mi okres pewnego sygnału:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I ten flowduration jest wysyłany do komputera.

    W momencie kiedy zakomentuje dwie wewnątrz funkcji TIM1_UP_IRQHandler linijki opisane jako "PROBLEM", to dostaje realne wyniki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czyli w momencie jak ustawiam CCR1 timera 3 wewnątrz przerwania timera 1. I najśmieszniejsze jest to, że timer 2 zwraca jakieś wyniki z kosmosu.
    Pokażę przykład:
    [STM32F1] - Ustawianie wypełnienia PWM TIM3 zakłóca pracę TIM2 [STM32F1] - Ustawianie wypełnienia PWM TIM3 zakłóca pracę TIM2
    Nie trudno się zorientować który jest zły ;)

    Nie mam pojęcia dlaczego tak się dzieje? Czyżby Timer 3 miał jakiś wpływ na Timer 2?
  • #4 11906603
    m.ki
    Poziom 15  
    Posty: 117
    Pomógł: 13
    Czy jesteś pewien, że TIM3 nie generuje przerwań? Albo zmiany wypełnienia PWM wpływają jakoś zewnętrznie na działanie programu (gdzie jest wyjście tego PWMa podłączone? nie do procesora z powrotem?) Bo to może być tak, że procesor jest zajęty obsługą jakiegoś przerwania (być może TIM3) i nie nadąża z obsługą przerwania TIM2.

    Nie widać całego kodu, więc trudno powiedzieć.

    A tak poza tym, jest u Ciebie coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy mi się dobrze zdaje, że to są dwie różne zmienne, które w nazwie różnią się tylko wielkością pierwszej litery? Toż to strasznie nieczytelne jest...

    Pozdrowienia,
    m.ki
  • #5 11906849
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Cytat:
    Czy jesteś pewien, że TIM3 nie generuje przerwań?

    Zobacz sobie konfigurację timerów, wszystko mam porozkładane po plikach typu timers.c, gpio.c, itd. i tylko konfiguruję tam te rzeczy które są w tych plikach.

    Mogę na PW podesłać KOD źródłowy, nie chce go udostępniać wszystkim.

    Cytat:
    Bo to może być tak, że procesor jest zajęty obsługą jakiegoś przerwania (być może TIM3) i nie nadąża z obsługą przerwania TIM2.

    Nie wykluczam ale jak to sprawdzić? No i w sumie Tim3 nie ma przerwania.

    Cytat:
    Czy mi się dobrze zdaje, że to są dwie różne zmienne, które w nazwie różnią się tylko wielkością pierwszej litery? Toż to strasznie nieczytelne jest...

    Tak niestety nieczytelne ale później to poprawie.
  • REKLAMA
  • #6 11908019
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    A może to jest tylko i wyłącznie kwestia tego, że rejestry CCR i ARR są buforowane i ich przeładowanie następuje dopiero przy nastąpieniu jakiegoś eventa?

    Innymi słowy, jak ARR ustawione jest na 1000, aktualnie jest 200, a ty wpiszesz do tego rejestru 300, to faktyczne uwzględnienie tej wartości 300 nastąpi dopiero jak timer doliczy do tego 1000...

    4\/3!!
  • #7 11908069
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    No dobra ale co to ma wspólnego z timerem 2?

    Timer 1 współgra z timerem 3 który pracuje jako PWM.

    A Timer 2 to zupełnie coś innego, tam tylko sobie czas leci.

    Czyli co powinienem wg ciebie spróbować? Na takie rzeczy voodoo może pomoże więc jestem otwarty na wszystkie sugestie :D

    Dodano po 1 [godziny] 20 [minuty]:

    Coś jest skopane z timerem 3cim. W momencie jak nie włącze trybu PWM albo w ogóle całego Timera3 to śmiga wszystko git.

    Obecnie kod konfiguracyjny wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy da się tu dojrzeć jakiś błąd? sprawdziłem sporo przykładowych konfiguracji i nic nie wyłapałem :(
  • REKLAMA
  • #9 11909012
    m.ki
    Poziom 15  
    Posty: 117
    Pomógł: 13
    Znalazłem w kodzie u Ciebie coś takiego:

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


    A jak zajrzeć do źródeł, to w komentarzu przed funkcją TIM_CtrlPWMOutputs mamy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Widzisz problem?
    Ech, ta biblioteka...

    Myślę, że musisz przejrzeć krok po kroku co naprawdę robią funkcje biblioteczne.
    Na to co powyżej zwróciłem uwagę, bo nigdy tej funkcji nie stosowałem. Ale może być takich kwiatków więcej.

    Popatrzyłem jeszcze na wykresy, które wrzuciłeś. Dobrze rozumiem, że poprawne wartości to kilkaset, a błędne to kilka? To jak dla mnie ewidentnie wskazuje, że TIM2 jest w jakiś tajemniczy sposób zatrzymywany i nie zlicza do tylu, ilu powinien. Nie wiem, czy to tylko sprawa zapisania czegoś w zarezerwowany rejestr, może jeszcze coś - choćby wspomniane wcześniej jakieś przerwanie ciągle obsługiwane.

    Pozdrowienia,
    m.ki
  • #10 11909089
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    m.ki napisał:
    Widzisz problem?

    Ja na razie nie widzę... Ale że nie znam tej biblioteki to w sumie nie wiem co głupiego ta funkcja mogłaby robić... Włącza wszystkie wyjścia PWM?

    4\/3!!
  • #11 11909169
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    Chodzi o komentarz. W kodzie jest TIM3.
    A w komencie SPLa TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIMx peripheral.
    Pytanie jak to (nie)działa dla innych timerów. ;)
  • #12 11909240
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    wydaje mi się, że ta funkcja dla innych timerów nie powinna nic robic, bo one nie mają po prostu bitu MOE (zapewne o niego chodzi).

    4\/3!!
  • #13 11910210
    kemot55
    Poziom 31  
    Posty: 1306
    Pomógł: 184
    Ocena: 147
    Jakieś pół roku temu słyszałem od kogoś, że '103 ma błąd z przenikaniem generowanego sygnału PWM na inne nogi procesora. Z tym, że było to na tyle absurdalne, że nie męczyłem tematu. Ale zapytam o co chodziło.
    Natomiast zastanawiam się nad zawartością zmiennej "PWMPeriod". Czy efekt będzie taki sam jak tam wpiszesz stałą?
    Jak zrozumiałem T2 mierzy okres jakiegoś sygnału zewnętrznego? To może PWM, który steruje pewnie też czymś na zewnątrz powoduje zakłócenie sprzętowe, które z kolei sobie po prostu wchodzi na EX0. Podpiął bym testowo oscyloskop na LED4 (o ile to dioda :-)) i załączył PWM ze stałym współczynnikiem
  • #14 11910314
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Cytat:
    Czy efekt będzie taki sam jak tam wpiszesz stałą?

    Tak, nawet jak wpiszę stałą tam zamiast zmiennej to efekt jest taki sam. Działa tylko wpisanie zera.

    Cytat:
    TIM2 jest w jakiś tajemniczy sposób zatrzymywany i nie zlicza do tylu, ilu powinien.

    Tak to wygląda.

    Cytat:
    Dobrze rozumiem, że poprawne wartości to kilkaset, a błędne to kilka?

    Wykres powinien być gładki. Niemożliwością jest otrzymać taki wykres na przepływomierzu częstotliwościowym jak ten po lewej. Ewidentnie są jakieś bzdury.

    Cytat:
    A może coś ciekawego w erracie? Jest tam kilka rozdziałów o timerach.

    Gdzie znaleźć tą erratę? Szukałem w googlu i znajduje tylko oryginalny datasheet.

    Tak swoją drogą, spróbuję kilku myków,
    1. Zmiany TImera 2 na coś innego,
    2. Podejrzę oscyloskopem czy sygnał PWM nie przechodzi na nóżkę tam gdzie pobieram dane z przepływomierza
  • #15 11910395
    m.ki
    Poziom 15  
    Posty: 117
    Pomógł: 13
    Freddie Chopin napisał:
    wydaje mi się, że ta funkcja dla innych timerów nie powinna nic robic, bo one nie mają po prostu bitu MOE (zapewne o niego chodzi).

    One nie mają w ogóle rejestru BDTR - w tym miejscu dla pozostałych timerów jest "reserved".

    kemot55 napisał:
    '103 ma błąd z przenikaniem generowanego sygnału PWM na inne nogi procesora

    Sam jestem ciekaw, daj znać. Ja nie zaobserwowałem - w jednej z moich aplikacji wykorzystuję wszystkie timery - w tym PWM, ale na TIM4. Nie zakłóca niczego.

    qscgu napisał:
    Podejrzę oscyloskopem...

    Noo.. ja bym od tego zaczął... ATSD ile to razy walczyłem z duchami zamiast zacząć od sprawdzenia hardware. A wszystko dlatego, że oscyloskopu mi się nie chciało z drugiego biurka przenieść.

    Pozdrowienia,
    m.ki
  • #16 11910412
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Cytat:
    One nie mają w ogóle rejestru BDTR - w tym miejscu dla pozostałych timerów jest "reserved".


    Usunąłem tą komendę, zarówno sterowanie PWM działa jak i błąd się pojawia dalej.

    Zmieniłem Timer na 8my, żeby był na innej magistrali ale błąd dalej pozostaje.

    Cytat:
    Noo.. ja bym od tego zaczął...

    Podejrzałem oscyloskopem i niestety żadnych dziwnych efektów. Proc z przerwaniem też reaguje tylko na ruch przepływki. Na szczęście mam mobilny oscyl i cały czas jest podpięty do układu, tylko nie w tym miejscu.

    EDIT:

    A jednak trochę przenika, napięcie skacze do 0,49 volt. I teraz jak to ustawiłem na stałe, to wchodzi mi w przerwanie jak głupie:
    [STM32F1] - Ustawianie wypełnienia PWM TIM3 zakłóca pracę TIM2

    EDIT2:

    Ale naprawa tego nic nie zmieniła. Dalej wyniki są zwalone. :(

    EDIT3:

    Sprawdziłem teraz, i przy włączonym PWM, Timer 8 generuje przerwanie ZANIM doliczy do końca, zazwyczaj to są wartości bliskie max albo bliskie min.
  • REKLAMA
  • #18 11910683
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Znalazłem w końcu ale tam też nic ciekawego nie ma, są problemy z input capture ale tego trybu nie używam. Idiotyczną nawigację na stronie ma STM.
  • #20 11910707
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Kolego, zapewniam cię, że nie jestem półgłówkiem, przetestowałem różne możliwości. Teraz jest na stałe ustawione 0x55. Po prostu na stałe zaraz po inicjacji timera i nigdzie kod tego nie zmienia, tamte miejsca zostały zakomentowane.

    Dodano po 4 [godziny] 44 [minuty]:

    MAM! EUREKA!

    Winny takiemu zamieszaniu jest tranzystor i pojemność bazy. Połączenie nóżki bezpośrednio do bazy to był zły pomysł. Dopiero przez rezystor 1K udało się zniwelować te zakłócenia. Widocznie raz na jakiś czas wychodził wynik z kosmosu bo wyzwalało się exti na kanale 0. Dlaczego? Pewnie wina procesora.
  • #21 11912451
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    qscgu napisał:
    (...) Połączenie nóżki bezpośrednio do bazy to był zły pomysł (...)

    A eimiter do masy? :vamp:
  • #22 11912458
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Przez rezystor 0.12 5W do masy. Dalej nie tłumaczy to dziwnego zachowania. Dalej zdarzają się takie cyrki przy rezystorze 1.5K ale dużo dużo mniej.

    Oznacza to tylko tyle, że PWM przenika na inne nóżki.
  • #23 11912772
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    Oznacza to tyle, że powinienneś sprawdzić z rezystorem na innym procku, bo w tym coś mogłeś ubić i ma on prawo nie trzymać parametrów.
  • #24 11912776
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Co ubić niby? Wyłączam PWM i wszystko śmiga bez problemów. BEZ rezystora.
  • #25 11912802
    kemot55
    Poziom 31  
    Posty: 1306
    Pomógł: 184
    Ocena: 147
    No to odłącz tą nogę od reszty układu (ale pozostawienie wiszącej to też takie sobie więc może połącz ją np. przez jakiś 10k rezystor do masy).
    A poza tym jak już raz obciążyłeś impulsowym prądem port to nie można przewidzieć teraz działania reszty i jego samego (może po prostu częściowo padł). Teoretycznie powinno wytrzymać, ale nigdy nie wiadomo.
  • #26 11912863
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Nie ważne gdzie ją podłącze odłącze czy rezystorem do masy do diody do tranzystora problem ZAWSZE występuje TYLKO I WYŁĄCZNIE kiedy PWM jest włączony i ma niezerowy stopień wypełnienia. Po prostu im mniejsze obciążenie nóżki tym rzadziej się to zdarza.

    Maksymalnie 10 razy rzadziej. Tzn 1 na 100 pomiarów przy rezystorze 1.5K a bez rezystora 10/100.
  • #27 11913554
    kemot55
    Poziom 31  
    Posty: 1306
    Pomógł: 184
    Ocena: 147
    A z którym pinem jest związane EX0 ? (Może przeoczyłem, ale chyba nie załączyłeś w postach konfiguracji portów). Stawiam na PA0 :-) a PA0 jest też powiązane z T2 (ETR). Jak taki sygnał miałby generować kłopot to nie mam pojęcia, ale może nie należy tego odrzucić.

    A z tym przenikaniem, o którym pisałem wcześniej chodziło o zakłócenie funkcji alternatywnych (UART,SPI,ADC) na nogach, które związane również alternatywnie z timerem generującym PWM (np. noga PA7 - MOSI, T8CH1N,ADC7,T3CH2 - jeżeli wykorzystam np. T8CH2N do PWM'a to ADC7 może być zaśmiecone). Z tym, że PWM nie przenosił się na nogi typu I/O (tylko "funkcje" alternatywne). Powyższe informację są z "drugie ręki". Program pisany z użyciem SPL. Nie wiem jak wyglądało PCB (raczej dobrze,ale..) Więc należy zastosować tu średni poziom ufności :-). Kiedyś sprawdzę.
  • #28 11915153
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Pomiar jest na PC0-PC3
    Timer jest zremapowany na PC6-PC9

    Te nogi są na tym samym porcie ale po przeciwległej stronie procka, raczej wątpię, żeby PCB miało na to jakiś specjalny wpływ.

    No i to jest płytka WaveShare Port103Z

    Tak poza konkursem, są w ogóle jakieś alternatywy dla tego procka? STM32F103ZET6 ? Zależy mi na ilości GPIO, pamięci na program oraz ilości ADC.
  • #29 11915239
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    qscgu napisał:

    Tak poza konkursem, są w ogóle jakieś alternatywy dla tego procka? STM32F103ZET6 ? Zależy mi na ilości GPIO, pamięci na program oraz ilości ADC.


    Nie podałeś na jakich ilościach Ci zależy :D
  • #30 11915279
    qscgu
    Poziom 34  
    Posty: 3347
    Pomógł: 161
    Ocena: 50
    Na takich jakie ma ten STM.
    Jeżeli to jest jego wina, to po prostu sprawdzę procesor konkurencji.
    Co najmniej 144 nóżki.
    Minimum 2 ADC po 8 kanałów >= 16 nóżek pomiarowych
    Minimum 4 timery z czego minimum 8 kanałów PWM
    Minimum 512K na program
    Min 50Mhz
    DMA min 2 kanały
    USB
    CAN
    Interfejs SPI do podłączenia ethernet przez kość ENC28J60
    I do tego w cenie ~30zł (w tme za 29)

    Napiszę ten kod na jakiegoś innego procka i zobaczymy czy to wina STM32

Podsumowanie tematu

✨ W dyskusji poruszono problem zakłóceń w pomiarach realizowanych przez Timer 2 w mikrokontrolerze STM32F1, które występują podczas ustawiania wypełnienia PWM w Timerze 3. Użytkownik zauważył, że po wywołaniu funkcji ustawiającej CCR1 w Timerze 3, wyniki pomiarów Timerem 2 są nieprawidłowe. W odpowiedziach zasugerowano sprawdzenie, czy Timer 3 generuje przerwania oraz czy zmiany wypełnienia PWM wpływają na działanie programu. Użytkownik odkrył, że problem ustępuje po wyłączeniu PWM, co sugeruje, że zakłócenia mogą być spowodowane przez przenikanie sygnału PWM na inne piny. Ostatecznie rozwiązaniem okazało się zastosowanie rezystora w obwodzie, co zminimalizowało zakłócenia. Użytkownik testował również różne konfiguracje timerów oraz rozważał użycie innego mikrokontrolera, gdyż problem nie występował na innym egzemplarzu STM32.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA