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

[STM32] [STM32][C] - Obsługa HC-SR04 na STM32F103C8 z jednym Timerem

Souphis 21 Lut 2016 18:36 1449 12
REKLAMA
  • #1 15458062
    Souphis
    Poziom 9  
    Posty: 6
    Witam

    Od paru dni borykam się z pewnym problemem. Mianowicie piszę obsługę czujnika ultradźwiękowego HC-SR04 na STM32F103C8. Doskonale zdaję sobie sprawę, że nie jest to trudne zadanie, jednakże posiadam ze względów projektowych tylko jeden Timer, aby wykonać to zadanie. Plan obsługi mniej więcej wygląda tak:
    - ustawiam PSC na 1uS,
    - włączam TIM4 i ustawiam GPIOC->BSRR (1 << 14),
    - sprawdzam, czy puls trwa 10uS,
    - następnie wyłączam TIM4, GPIOC->BRR (1 << 14) i resetuje CNT,
    - gdy następuje przerwanie od pinu ECHO czujnika, włączam ponownie TIM4 i czekam na następne przerwanie
    - zapisuje wartość CNT i powtarzam.

    Niby algorytm działania prosty. Jednakże po sprawdzeniu sygnału na analizatorze logicznym dostaję następujący przebieg czasowy:
    [STM32] [STM32][C] - Obsługa HC-SR04 na STM32F103C8 z jednym Timerem
    Za bardzo nie wygląda to dobrze. I tu kieruje moje pytanie, czy takie operacje są dozwolone na Cortexach?

    Konfiguracja rejestrów:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Wysłanie impulsu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]
  • REKLAMA
  • #2 15458189
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Zmiana preskalera wymaga updatu timera.
    Po update (EGR rejestr) wymagane zapewne jest wyczyszczenie flag.
    Pomiędzy Upadate i czyszczeniem flag trzeba wstawić jakiś dodatkowy odczyt.
  • REKLAMA
  • #3 15458200
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #4 15458281
    Souphis
    Poziom 9  
    Posty: 6
    Owszem, aby zmienić PSC należy wyczyścić flagę, jednakże ustawiam to tylko raz.
    Eh, starałem się w miarę czytelnie przedstawić kod, przepraszam, jeżeli sprawia on trudność w odczycie. No tak zrobiłem, zrobiłem przerwanie od zbocza opadającego i narastającego, nie jest to za dobre rozwiązanie i raczej jest ono do poprawienia. Jednakże mam problem z triggerem, a mianowicie z wysłaniem pulsu. Kiedy resetuje CNT, cały TIM4 mi się sypie i nie może utrzymać mi wartości 10uS.
  • #5 15458304
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Souphis napisał:
    Owszem, aby zmienić PSC należy wyczyścić flagę, jednakże ustawiam to tylko raz.
    Eh, starałem się w miarę czytelnie przedstawić kod, przepraszam, jeżeli sprawia on trudność w odczycie. No tak zrobiłem, zrobiłem przerwanie od zbocza opadającego i narastającego, nie jest to za dobre rozwiązanie i raczej jest ono do poprawienia. Jednakże mam problem z triggerem, a mianowicie z wysłaniem pulsu. Kiedy resetuje CNT, cały TIM4 mi się sypie i nie może utrzymać mi wartości 10uS.


    Bo timer źle obsługujesz. Nie widzę nigdzie updatu po zmianie preskalera.
    Po to preskaler dla 10us?
  • #6 15458327
    Konto nie istnieje
    Poziom 1  
  • #7 15458368
    Souphis
    Poziom 9  
    Posty: 6
    Przyznam się bez bicia, że ideę tego kodu zaczerpnąłem z jakiejś strony.
    @tadzik85: PSC 1uS, trochę bez sensu. I tak, zbyt powierzchownie wczytałem się w manuala i zapomniałem o update, błąd nowicjusza.
    @atom1477: Tak, masz rację widzę, to teraz, że jest to bez sensu. Najlepszym rozwiązaniem w takim razie byłoby użycie timera w trybie one pulse mode albo tak jak wspomniałeś PWM. Tylko, czy mogę zmienić zastosowanie timera w trakcie pracy? Tzn. najpierw używam go w trybie OPM, a następnie zmienia go w tryb IC. Może być to głupie pytanie, ale jak to się mówi, nie ma głupich pytań, są tylko głupie odpowiedzi.
  • REKLAMA
  • Pomocny post
    #8 15458376
    Konto nie istnieje
    Poziom 1  
  • #9 15458395
    Souphis
    Poziom 9  
    Posty: 6
    Dobrze wiedzieć, w takim razie spróbuję zmienić koncepcję mojego kodu. Dzięki wielkie za szybkie odpowiedzi. Czasami człowiek jak się zamota w swoich działaniach to sam sobie nie poradzi z ich rozwiązaniem ;)
  • #10 15458700
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Zajrzyj do Elektroniki Praktycznej z lutego br. Parę rzeczy masz źle w kodzie. Do przyzwoitej obsługi potrzebujesz trzech kanałów jednego timera STM32, z czego jeden w trybie capture obu zboczy. żadnych innych przerwań ani opóźnień programowych nie trzeba. Timera nie trzeba zatrzymywać ani restartować - chodzi w ruchu ciągłym i sam inicjuje pomiary. Obsługa przerwania timera tylko sprawdza poprawność pomiaru i wylicza odległość.
  • #11 15458921
    Souphis
    Poziom 9  
    Posty: 6
    Hmm, pewnie ten sposób jest idealny do jednego czujnika, ale niestety, kiedy projektowałem płytkę do robota, stwierdziłem, że wystarczy mi jeden timer do obsługi trzech czujników. Niezbyt rozważne, mogłem użyć STM32 z serii F3, albo F4.
  • Pomocny post
    #12 15458971
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Kosztem dokładności możesz zrobić to na jednym wspólnym 2-kanałowym timerze i przerwaniu EXTIi (oddzielnym dla każdego czujnika). Dwa kanały służyłyby do odmierzania czasu impulsu startowego i kasowania czujnika - wymuszenia kończenia pomiaru, a okres timera wyznaczałby cykl pomiarowy do kolejnego przeglądanai czujników.
  • #13 15459004
    Souphis
    Poziom 9  
    Posty: 6
    Odczyty z czujników są wejściami sieci neuronowych, tak więc wystarczy dokładność co do 1 cm, tak więc myślę, że skorzystam z twojej rady.

Podsumowanie tematu

✨ W dyskusji poruszono problem obsługi czujnika ultradźwiękowego HC-SR04 na mikrokontrolerze STM32F103C8 z wykorzystaniem jednego timera. Użytkownik przedstawił algorytm działania, który napotkał trudności związane z nieprawidłowym działaniem timera oraz błędami w konfiguracji przerwań. Uczestnicy dyskusji zasugerowali poprawki, takie jak konieczność aktualizacji timera po zmianie preskalera, unikanie przerwań dla obu zboczy sygnału ECHO oraz wykorzystanie trybu one-pulse mode lub PWM dla lepszej precyzji. Zwrócono uwagę na możliwość zmiany trybu pracy timera w trakcie działania oraz na potrzebę użycia trzech kanałów timera dla poprawnej obsługi czujników. Użytkownik rozważał również zastosowanie STM32 z serii F3 lub F4 dla bardziej złożonych projektów.
Wygenerowane przez model językowy.
REKLAMA