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.

HC-SR04 zwraca kilka wynków, podłączenie przez BSS138

joker1309 06 Mar 2017 19:14 615 11
  • #1 06 Mar 2017 19:14
    joker1309
    Poziom 11  

    Dzień dobry,
    mam problem z czujnikiem HC-SR04, problem polega na tym że zwraca kilka sygnałów, z czego jeden pomiar jest poprawny a reszta śmieci ( np. 150cm i poprawy 10cm).
    czujnik obsługuje STM32F4, w taki sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    getus() zwraca uS które minięły od setZero()

    wywołanie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Miał ktoś takie przypadki? problem z czujnikiem/programem/uC/przetwornikiem napięcia? jakieś drgania które wykrywa procesor?

    Z góry dziękuję za pomoc : )

    0 11
  • #2 06 Mar 2017 19:57
    BlueDraco
    Specjalista - Mikrokontrolery

    Pierwszy błąd, ale na 99% nie jedyny:
    EXTI_ClearITPendingBit(EXTI_Line1);

    To musi być na początku obsługi przerwania, a nie na końcu

    0
  • #3 06 Mar 2017 20:10
    joker1309
    Poziom 11  

    Poprawione : ),
    efekt taki sam:

    przykładowy wynik:

    roznica=800 cm = 13
    roznica=8100 cm = 139
    roznica=799 cm = 13

    Inicjalizacja wygląda następująco:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    pin C0 - trig - przez BSS138 do czujnika
    pin C1 - echo - przez BSS138 do czujnika

    jak w miejsce czujnika podłączę bezpośrednio krańcówkę to na jedno przyciśnięcie mam 2 przerwania na stan wysoki i niski.

    edit::
    ale jak podłączę przez BSS138 to już wykrywa kilka przerwań na każdą zmianę stanu, czy BSS138 może być przyczyną ?

    edit2:: podłączyłem jeszcze raz bez BSS i taki sam efekt jak z, kilka przerwań na jedno wciśnięcie, ale to może być też w wyniku drgań styków.

    0
  • #4 06 Mar 2017 22:20
    BlueDraco
    Specjalista - Mikrokontrolery

    Gdzieś z rok temu było działające rozwiązanie w EP - popatrz. Kodu z SPL ne chce się nawet analizować - jest koszmarnie długi i pokręcony. Nie bardzo wiem, do czego ten BSS138 - chyba tylko do psucia. Linia echo jest dwukierunkowa, więc w obie strony sygnał przez tranzystor nie przejdzie..

    0
  • #5 06 Mar 2017 22:44
    joker1309
    Poziom 11  

    Czujnik działa na 5V procesor na 3,3V, aby nie uszkodzić jest puszczony przez BSS138.
    Artykuł znalazłem:
    http://ep.com.pl/artykuly/10969-Oprogramowani...M_Ultradzwiekowy_czujnik_odleglosci_HCSR.html

    niestety nie ma tam pliku o którym mowa w tekscie. Poczytam i dam znać dziękuję : D
    Martwi mnie to że przerwanie od zdarzenie zewnętrzengo ( zmiany stanu pinu) działa w taki losowy sposób, sygnał z HCSR-04 nie powinien mieć drgań a procesor głupieje, chyba że (co bardzo prawdopodobne) coś jest źle zainicjalizowane, ale sprawdzałem kilka razy i według mnie jest ok.

    0
  • #6 07 Mar 2017 07:40
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Schematu nie widzimy - tam najpierw szukłabym problemu.
    2. Większość wyprowadzeń STM32 toleruje 5V. Nie jest chyba problemem podłączenie czujnika do tych właściwych.
    3. Trig jest wejściem zgodnym z TTL - nie ma potrzeby stosowania niczego po drodze. ECHO jest linią dwukierunkową - co ma zrobić tranzystor?
    4. Mnie martwi to, że nie używasz timera w trybie capture.

    0
  • #7 07 Mar 2017 19:50
    joker1309
    Poziom 11  

    Dziękuję z rady, postaram się skorzystać z tego trybu timera : ) Niestety ale nie znalazłem pliku projektu z EP, na Ich FTP też nie ma, ktoś może wie gdzie znajdę ? Bardzo by mi zależało aby zrobić to dobrze - a podejrzewam że tam jest to ładnie rozwiązane : )

    0
  • #8 07 Mar 2017 20:03
    BlueDraco
    Specjalista - Mikrokontrolery

    Przecież w artykule masz pokazany cały program.

    0
  • #9 07 Mar 2017 21:52
    joker1309
    Poziom 11  

    Ok czyli mam tak - niestety programu nie mogę uruchomić , w środowisku KEIL są zdefniowane stałe których w ac6 nie ma.
    Zmieniłem tryb pracy timera, teraz kod wygląda następująco:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i narazie coś działa, nie czyszczę przerwania ale jak zmienie stan pinu to się wykonuje,

    Dziękuję za pomoc, zabieram się za policzenie czasu w jakiś sposób : D

    //edit: poprawiony błąd w kodzie

    0
  • #10 08 Mar 2017 21:24
    joker1309
    Poziom 11  

    I znowu ugrzęzłem, tym razem na pomiarze czasu, timer1 działa zupełnie inaczej niż (według mnie : D) powinien, zrobiłem krótki program który tylko sprawdza timer
    kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Start
    TIM1 0:31
    TIM1 1:34600
    TIM1 2:3630
    TIM1 3:38194
    TIM1 4:7222
    TIM1 5:41786
    TIM1 6:10814
    TIM1 7:45378
    TIM1 8:14406
    TIM1 9:48970
    TIM1 10:17998
    TIM1 11:52562
    TIM1 12:21590
    TIM1 13:56154
    TIM1 14:25182

    Funkcję delay sparwdzałem z stoperem i na czasie 5min jest dokładana ( czas podaje się w uS).

    TIM1 jest taktowany 100Mhz, prescaller na 100 więc 1Mhz, na 1ms powinien zliczyć 1000 impulsów zlicza jakieś śmieci.

    Ktoś wie może o co może chodzić ? Dziękuję : D

    0
  • Pomocny post
    #11 08 Mar 2017 22:52
    BlueDraco
    Specjalista - Mikrokontrolery

    joker1309 napisał:
    tim.TIM_Period = 0; // na co to ma wpływ ?


    Na okres timera. Przy takim ustawieniu nie działa.

    TIM1 nie jest taktowany na 100 MHz. Sprawdź drzewo zegarów w CubeMX.

    Dostałeś kompletny kod z EP. Zamiast go użyć, kombinujesz jak koń pod górkę z koszmarnym SPLem i próbujesz wynaleźć koło od nowa. To chyba nie jest sposób na sukces.

    A aktualnego schematu nadal nie pokazałeś.

    0
  • #12 10 Mar 2017 17:59
    joker1309
    Poziom 11  

    Tak zrobiłem, wykorzystałem kod EP, dziękuję za pomoc : )

    0