Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[stm32][HAL]Output compare no output na dwóch kanałach

mlp99 30 Jul 2017 21:13 1770 10
  • #1
    mlp99
    Level 9  
    Witam,

    Próbuję skonfigurować dwa przerwania output comare no output na dwóch kanałach timera 1. Korzystam z płytki nucleo stm32f103rb. Procesor taktuję zegarem 8MHz. Korzystam z CubeMx i biblioteki HAL.
    Preskaler i ARR ustawiam dla całego timera, a dodatkowo Pulse dla poszczególnych kanałów, tak aby uzyskać jedno przerwanie z częstotliwością 1Hz, a drugie 50Hz. Jednak oba przerwania wykonują się z taką samą częstotliwością, niezależnie od tego co wpiszę w Pulse.

    Code: c
    Log in, to see the code
  • #2
    User removed account
    Level 1  
  • #3
    mlp99
    Level 9  
    Rozumiem, że mają tą samą podstawę czasu (preskaler i ARR), dlatego interpretowałem to w taki sposób, że rozróżnieniem dla poszczególnych kanałów jest właśnie wartość Pulse. W dokumentacji biblioteki HAL (podrozdział 65.1.2 str 868) w konfiguracji Output Compare nie widzę nic odnośnie połączenia kaskadowego dla timera. Natomiast w dokumentacji procka (RM0008 str 339) jest rejestr TIMx_CR2 i bity MMS które można ustawić w tryb:
    Code: text
    Log in, to see the code

    Tylko nie wiem czy to jest dobry trop ze względu na fakt że ja chcę wykorzystać dwa kanały na Output Compare, ale na jednym timerze.
    W CubeMx w panelu konfiguracji kanałów Timera, nie ma nic o konfiguracji master, slave i połączeniu kaskadowym, jest możliwość ustawienia trybu (Mode) ale właściwość ta określa tylko zachowanie się OCxREF.
  • #4
    User removed account
    Level 1  
  • #5
    mlp99
    Level 9  
    Tzn. mam już sporą część projektu zrobioną w HALu i na razie chcę skonfigurować właśnie z pomocą tej biblioteki. @Marek_Skalski jeśli dobrze interpretuję Twoje wskazówki, to rozumiem, że nie da się na jednym timerze odpalić dwóch przerwań o różnych częstotliwościach. Muszę wykorzystać 2 timery (chociaż cały czas wydaje mi się to mało prawdopodobne). Jeżeli jednak tak jest to nie ma sensu konfigurować drugiego timera w powiązaniu z pierwszym (tj. dla timera 2 ustawiać jako źródło taktowania timer1), bo mogę skonfigurować po prostu te timery z różnymi preskalerami na 1 i 50Hz.
    A tak trochę teoretyzując moje pierwotne wyobrażenie było takie, że po przepełnieniu licznika( w moim przypadku co 50Hz) inkrementowane są wartości dla poszczegolnych kanałów i jeśli one osiągną wartość Pulse ( 50 dla pierwszego kanału i 0 dla drugiego), to dopiero wtedy wykonywane jest przerwanie (czyli dla kanału pierwszego co 1Hz - bo zlicza do 50, dla drugiego co 50Hz - bo zlicza do 0).
  • #6
    User removed account
    User removed account  
  • #7
    User removed account
    Level 1  
  • #8
    User removed account
    User removed account  
  • #9
    mlp99
    Level 9  
    Piotrus_999 wrote:
    No a zdradź mi tajemnice dlaczego to mają być przerwania a nie callback-i.

    Nigdy nie pisałem funkcji z callback-iem, nie miałem jeszcze takiej potrzeby. Tak ogólnie chodzi o to by stworzyć licznik 50Hz, zmienną, którą będę inkrementował, i stworzyć event, który co 50 przerwań (tj 1Hz) wywoła mi callback?

    Piotrus_999 wrote:
    Jeżeli chcesz funkcje A wolac co każde przerwanie a B co 20 na przykład to zrób sobie licznik.

    Marek_Skalski wrote:
    Przebiegi nie będą synchroniczne.(...) Jeżeli dla Ciebie to bez znaczenia, to możesz tak zrobić.


    O tototo. No właśnie, czyli najprostszym (+słusznym) rozwiązaniem jest stworzenie czegoś takiego:

    Code: c
    Log in, to see the code


    I jeszcze jedno mam pytanie dodatkowo. Zacząłem swoją przygodę na stm32 własnie z CubeMx i biblioteką HAL, bo wydawało mi się że mają niski próg wejścia i szybko można ogarnąć podstawy. Jednak im głębiej się w to zagłębiam tym bardziej mnie cała ta biblioteka zniechęca i chyba przerzucę się na programowanie bezpośrednio na rejestrach, tak jak to robiłem na Atmega328p. W każdym bądź razie, czy wiecie gdzie się podziały w CubeMx pozostałe timery? W panelu bocznym mam tylko możliwość wybrania i skonfigurowania TIM1, TIM2, TIM3, TIM4.
  • #10
    User removed account
    Level 1  
  • #11
    User removed account
    User removed account