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.

lpc1114 i HC-SR04 błędny pomiar

DokDaniel1993 02 Kwi 2017 16:30 1425 9
  • #1 02 Kwi 2017 16:30
    DokDaniel1993
    Poziom 3  

    Walczę z miernikiem pomiaru odległości. Założenie jest takie: lpc1114 daje stan wysoki na P2.1 przez 10 us później if sprawdza czy zakończył się pomiar i wyświetla wynik. Do sprawszenia wyjścia echo wykorzystałem pin P2.0 ustawiając go by reagował na rosnące zbocze i uruchamiał przerwanie.
    Przerwanie od pinu P2.0 sprawdza czy od zbocza rosnącego uruchamiając timer TMR16B0 i zmienia przerwanie na P2.0 by się uruchamiało przy opadającym zboczu. Kolejne wejście do przerwania wchodzi do kodu zatrzymując zegar, zmienia reakcie na rosnące zbocze i ustawia flagę stan co oznacza koniec pomiaru. W sumie niby działa ale pomiary są błędne. Dopiero poznaje lpc1114 i coś pewnie robię nie tak ale nie wiem gdzie
    Oto kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 9
  • #2 02 Kwi 2017 22:23
    BlueDraco
    Specjalista - Mikrokontrolery

    Poszukaj na forum wątków o HC-SR04. Chyba już wszystko zostało napisane, a i parę linków do gotowych rozwiązań znajdziesz.

    Zacznij od usunięcia funkcji delayxxx().

    0
  • #3 03 Kwi 2017 06:08
    Badmaneq
    Poziom 23  

    Zastosuj wejście przechwytujące CAP, któregoś z timer'ów. Z chwilą zmiany zbocza licznik zostanie zatrzasnięty w rejestrze CR0, a Ty musisz tylko go odczytać.

    0
  • #4 03 Kwi 2017 15:46
    DokDaniel1993
    Poziom 3  

    delay potrzebny jest by TRIG wyzwolić na conajmniej 10 us. Jak program rozbuduję to i pewnie delay_ms też będzie wykorzystany.
    Czytam user manual ale niezbyt rozumiem jak obsłużyć CAP ;( Pokażcie jakiś przykład.

    0
  • #5 03 Kwi 2017 16:24
    BlueDraco
    Specjalista - Mikrokontrolery

    Do odmierzania odcinków czasu służy timer, a nie delay(). Nic nie piszesz o kasowaniu impulsu ECHO. Czy zajrzałeś do wątków i linków w nich zawartych?

    0
  • #6 04 Kwi 2017 15:42
    DokDaniel1993
    Poziom 3  

    Właśnie delay napisany na timerze. Ten delay_ms(700) postawiłem by mieć pewność że czujnik zakończył pomiar, wiem że duży ale potrzebny mi by widzieć wyniki na konsoli. Przy mniejszym opóźnieniu zbyt szybko przewijał się ekran w realterm. Doczytałem faktycznie przy nie pojawieniu się echo należy podać niski stan na echo, będę to miał na uwadze.
    Nie ruszyłem do przodu, nadal nie umiem napisać programu by korzystał z cap ;(

    0
  • Pomocny post
    #7 04 Kwi 2017 20:16
    Badmaneq
    Poziom 23  

    Napisz coś podobnego jak poniżej:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    W kodzie nie przewidziano możliwości zawieszenia się HC-SR04, więc należy odmierzyć max. czas czekania na echo, kiedy się nie pojawi to stan niski na ECHO.

    Obsługę przerwania można skrócić, jeżeli w przerwaniu oczekuje się tylko i wyłącznie od jednego "zdarzenia":
    Kod: c
    Zaloguj się, aby zobaczyć kod

    BTW. Wyrzuć obsługę __sys_write i delay_xx do osobnych plików, teraz bardzo zaciemnią kod, jak bardziej rozbudujesz nie połapiesz się co do czego...

    0
  • #8 05 Kwi 2017 08:27
    DokDaniel1993
    Poziom 3  

    Dziekuje działa :)
    Wykorzystuje tą obsługe przerwania

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jednak nie rozumiem dlaczego w nim ustawiasz drugi bit w CCR
    LPC_TMR32B0->CCR = (0x1<<0) | (0x1<<2); // rosnace zbocze przepisuje TC do CR0 i generuje przerwanie
    LPC_TMR32B0->CCR = (0x1<<1) | (0x1<<2); // opadajace zbocze przepisuje TC do CR0 i generuje przerwanie
    a tutaj
    Kod: c
    Zaloguj się, aby zobaczyć kod

    tylko 0 i 1 bit. Dlaczego tu nie ustawiasz 2 bitu ?

    Chcę roździelić na odzielne pliki ale brak czasu ;) teraz kiedy HC-SR0 zaczął mierzyć musze się nacieszyć :)

    0
  • Pomocny post
    #9 05 Kwi 2017 16:12
    Badmaneq
    Poziom 23  

    Ponieważ oprócz przypisania rejestru licznika TC do CR0 przy zmianie zbocza "chcę" wygenerować przerwanie. Za generację tego przerwania właśnie odpowiada 2 bit w rejestrze CCR.
    Zapis LPC_TMR32B0->CCR = wartosc ustawia tylko te bity które są ustawione w wartosc. Dlatego za każdy razem konieczne jest ustawienie 2 bitu, gdyby to pominął nigdy nie było by przerwania.

    Natomiast zapis LPC_TMR32B0->CCR ^= (0x1<<0) | (0x1<<1) zmienia na przeciwne tylko bity 0 i 1 nie ruszając pozostałych. Skoro w konfiguracji timera w jest

    Kod: c
    Zaloguj się, aby zobaczyć kod

    czyli ustawiony bit 0 i 2, zatem bit 2 ustawiony będzie cały czas.
    Btw. Poszukaj informacji o XOR

    0
  • #10 02 Maj 2017 20:55
    DokDaniel1993
    Poziom 3  

    Fajnie mi czunik odległości mierzy odległość od przeszkody ale zauważyłem że przy odległościach większych od metra jest rozrzut pomiarów. Np. waha się w zakresie 179 cm do 187 cm myślałem że jak będę liczył średnią z pomiarów rozrzut będzie mniejszy lecz tak nie jest ;(

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Można w inny sposób mieć większą dokładność ?

    0