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

[stm32 M3] - Strategia konfiguracji timerów dla uzyskania pożądanego przebiegu

Raphaw 07 Lut 2013 14:37 1023 2
  • #1 07 Lut 2013 14:37
    Raphaw
    Poziom 20  

    Witam,
    Na wstępie zaznaczam, iż nie miałem do tej pory dużo wspólnego z układami ARM, stąd też taki mogłoby się wydawać banalny dylemat.
    Do rzeczy:
    -Na 6 wyprowadzeniach (PB10 - PB15) mikrokontrolera STM32L152RBT6 uzyskać chcę przebieg jak poniżej:
    [stm32 M3] - Strategia konfiguracji timerów dla uzyskania pożądanego przebiegu
    - t1 jest czasem pomiędzy zewnętrznym zdarzeniem (zielona linia), a pierwszą serią impulsów. Ten czas jest zmienny w trakcie wykonywania programu.
    -t2 jest czasem pomiędzy dwoma kolejnymi seriami impulsów.
    -t3 - czas trwania pojedynczej serii impulsów - zarówno t2 jak i t3 są niezmienne w trakcie działania programu.
    - T - spodziewany okres między dwoma kolejnymi zdarzeniami (0.02 s) (Wymagane zgłoszenie błędu, jeśli okres ten znacznie będzie odbiegał od wzorca)

    Mam problem jak to ugryźć. Rozwiązanie stricte sprzętowe, choć idealne ze względu na niezawodność i nieblokujące, raczej byłoby trudne w realizacji (wymagałoby konfiguracji i synchronizacji 4 timerów).
    Aktualnie skłaniam się ku rozwiązaniu z dwoma timerami:
    Jeden (uruchomiony w przerwaniu) odliczałby czas t1, oraz kontrolował czas między zdarzeniami.
    Drugi (uruchomiony przez poprzedni po odliczeniu czasu t1) musiałby wygenerować dokładnie 6 impulsów o okresie t2 i wypełnieniu t3/t2.
    Do tego konieczna byłaby odpowiednia modulacja generowanych impulsów, oraz maszyna stanów załączająca odpowiednie wyjścia w trakcie trwania impulsów.

    1) Czy takie rozwiązanie ma sens? Czy, być może, da się to rozwiązać inaczej, prościej?
    2) Jak rozwiązać kwestię wygenerowania dokładnie 6 impulsów?
    3) Jak rozwiązać kwestię modulacji wygenerowanych 6 impulsów?

    Chciałbym, żeby cała operacja wykonywała się możliwie nieblokująco i niezależnie od CPU.
    Z góry dziękuję za wszelkie wskazówki i poświęcony czas.
    Pozdrawiam!

    0 2
  • #2 07 Lut 2013 18:39
    Jado_one
    Poziom 22  

    Wydaje mi się, że najłatwiej będzie rozwiązać to w obsłudze przerwania jednego z timerów.
    I przychodzą mi do głowy dwie możliwości:
    1. Zmienianie parametrów pracy timera po każdym "trybie" przebiegu jaki ma być wygenerowany na wyjściu. Tj. przeładowywanie liczby do jakiej licznik powinien odliczyć zanim wygeneruje przerwanie.
    2. Ustawienie licznika na najmniejszy możliwy interwał czyli "jeden prążek" przebiegu, a dłuższe opóźnienia realizować na drodze pogramowej tj. liczników-zmiennych.
    Do tego oczywiście maszyna stanów, żeby w zależności od trybu przerwanie było w odp. sposób obsługiwane.
    Oczywiście zwiększona ilość przerwań obciąża trochę bardziej procesor - wszystko zależy zatem od tego jaka ma być częstotliwość tych przebiegów - czy to ma sens.

    Przez modulację rozumiesz to, że np. każdy z 6 prążków będzie miał inną szerokość?

    0
  • #3 07 Lut 2013 23:47
    Raphaw
    Poziom 20  

    Przez modulację impulsów miałem na myśli przejście z pojedynczego impulsu o czasie trwania t3 na szereg impulsów o większej częstotliwości o łącznym czasie trwania t3 (czyli takie "posiekanie" pojedynczego impulsu). Po przemyśleniu doszedłem do wniosku że mogę uzyskać taki sam efekt stosując sprzętowy pwm w drugiej gałęzi odbiornika (schemat: plus zasilania-> pnp -> odbiornik -> npn-> gnd). W takim wypadku problem upraszcza się do odmierzenia czasu t1 a następnie wygenerowaniu (na odpowiednich pinach) już pojedynczego impulsu o szerokości t2, okresie t3.

    0