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

Atmega8 - Błedne wskazanie dalmierza ultradźwiękowego

Legier 28 Jan 2014 21:51 5295 56
  • #1
    Legier
    Level 11  
    Witam.
    Postanowiłem sobie zaprojektować i stworzyć dalmierz ultradźwiękowy. Odbiornik z równoległym rezystorem (kilka kOhm - filtracja zakłóceń) podłączyłem pod wyjścia komparatora. Nadajnik początkowo miałem podłączony przez MOSFET N do OC1A, ale przy braku efektów podłączyłem bezpośrednio do tego wyjścia. Objawy:
    wynik jaki cały czas uzyskuję to około 5cm mimo że odległość mierzy ponad 1,5m;
    jeśli wyciągnę nadajnik i dam rękę np. 10cm nad odbiornik to dostaję wyniki około metrowe (nie mam pojęcia jak)
    aktualnie układ nie reaguje na postawione przeszkody
    Wklejam kody poszczególnych funkcji
    Code: c
    Log in, to see the code
  • #2
    BlueDraco
    MCUs specialist
    Jakiego typu jest time? Jeśli nie uint32_t to małe masz szans na poprawne obliczenia wg. tego wzoru.

    Zamiast:
    return time * 32 / 2 * 340 / 10000;

    napisz:
    time * 2 * 34 / 125

    - wtedy time prawdopodobnie może pozostać jako uint16_t

    W razie problemów spróbuj wyświetlić wartość zmierzonego czau przed przeliczeniem na cm i zobacz, czy odczyty są sensowne dla różnych odległości.
  • #3
    Legier
    Level 11  
    z tym problemem co mówisz już się spotkałem i wtedy time było int dlatego zmieniłem na long int i wtedy było już lepiej bo nie dostawałem ujemnych wyników. Wrzucę jeszcze deklaracje tych paru zmiennych.
    Code: c
    Log in, to see the code


    EDIT: Czas jest ok jeśli porównać go do wyświetlanej odległości, ale jesli miałby to być faktyczny czas to jednak to nie to.

    EDIT 2: Przy próbie skierowania nadajnika w stronę odbiornika odległość była mniej więcej dobra - najdalej udało mi się odsunąć nadajnik na 18cm a wyskazanie (po przeliczeniu - dalmierz miał działać jako odbiciowu - tu była próba przy bespośrednim odbiorze sygnału) wynosiło mniej więcej tyle. Przy dalszych próbach z odbiciowym nawet jak osłaniałem nadajnik/odbiornik przed zjawiskiem ugięcia fali dźwiękowej to pomogało jedynie tyle że wskazywana odległość była większa ale nadal duzo mniejsza od rzeczywistej.
  • #4
    pimpuk
    Level 23  
    Zmienna time zwraca -1 po 1ms
    Code: c
    Log in, to see the code

    A powinna po sekundzie.
    Code: c
    Log in, to see the code


    No i odbiornik powinien jednak być podłączony przez jakiś OPAMP.
  • #5
    Legier
    Level 11  
    Jedna inkrementacja zmiennej time to są 32us - tyle trwa przepełnienie licznika T0 przy wewnętrznym oscylatorze 8Mhz.
    32us * 32 000 = 32 / 1 000 000 * 32 000 = 32 * 32 / 1000 = 1024 / 1000 = 1,024 sekundy.
    Czyli tutaj przeliczenie jest dobre. Co do wzmacniacza to czy jest on konieczny? Widziałem działające projekty bez niego i nie wiem czy akurat jego brak jest przyczyną takich wyników - w końcu komparator odczytuje jakieś sygnały z odbiornika.
  • #6
    pimpuk
    Level 23  
    Legier wrote:
    32us * 32 000 = 32 / 1 000 000 * 32 000 = 32 * 32 / 1000 = 1024 / 1000 = 1,024 sekundy.
    Faktycznie, liczyłem dwa razy, a powinienem trzy. :sm7:
    Ja też widziałem działające projekty bez wzmacniacza. Problem w tym, że energia promienista maleje z sześcianem odległości od źródła i przy pewnej odległości, przetwornik nie jest w stanie wyzwolić komparatora. Zależy to oczywiście od klasy przetwornika.
    Możesz wbudować przełącznik zakresów (ja tak mam). Pierwszy zakres bez wzmacniacza, dla małych odległości i z krótszym czasem oczekiwania na echo. Drugi zakres ze wzmacniaczem i czasem np 1s.
    Podepnij się oscyloskopem pod obydwa przetworniki, to zobaczysz co tak naprawdę się tam dzieje.
  • #7
    Legier
    Level 11  
    Tylko czy to bedzie rozwiązaniem mojego problemu? Spróbuję za jakiś czas przez mosfeta dać na nadajnik z 12V i zobacze co wtedy, bo póki co daję 5V z uC.
  • #8
    pimpuk
    Level 23  
    Nie musisz dawać mosfeta na nadajnik, daj OPAMP na odbiornik. Na przykłąd bardzo dobrze poradzi sobie TL082. No i zbadaj układ oscyloskopem, przynajmniej przebiegi na wejściu komparatora. Może masz jakieś zakłócenia, to wtedy jakiś filtr np 100nf do masy i może się okazać że przypadłości odeszły. To nic nie kosztuje, tylko chwilka czasu i będziemy wiedzieć na czym stoimy.
  • #9
    Legier
    Level 11  
    Kosztuje tyle, ze aktualnie nie mam na stanie wzmacniacza, tym bardziej dostępu do oscyloskopu. Ale spróbuję
  • #10
    pimpuk
    Level 23  
    Tak sobie rozmyślam nad Twoim problemem, i uważam że powinieneś pokazać schemat i cały kod, bo coś mi tu nie gra.
    I jedno pytanie: dla czego akurat
    Code: c
    Log in, to see the code

    Czy nie lepiej było by wyzwalać zboczem narastającym?
    Code: c
    Log in, to see the code
  • #11
    Legier
    Level 11  
    Quote:
    i uważam że powinieneś pokazać schemat i cały kod

    Wrzucam schemat, ale prezentuje on wersję docelową, aktualnie przy testach nadajnik jest podłączony bezpośrednio do uC, a reszty komponentów (poza wyświetlaczem i odbiornikiem) nie ma. Kod wklejam bez funkcji obsługujących wyświetlacz, gdyż to raczej niepotrzebne. Kod:
    Code: c
    Log in, to see the code

    Niektóre opóźnienia i użyte funkcje są tylko do celów testowych, pisane na szybko, w docelowym programie wszystko będzie pisane w oparciu o timery i własną zamianę liczby na string do wyświetlenia.
    Co do
    Code: c
    Log in, to see the code

    To stwierdziłem że tak najszybciej wykryję impuls. Rozpatrzmy 2 przypadki:
    1) gdy wyzwalam przerwanie dowolną zmianą komparatora to w najgorszym przypadku może się zdarzyć tak, że po jednym pomiarze odbiornik zatrzyma się w taki sposób że stan na komparatorze będzie wysoki i jeżeli pierwszy odebrany impuls też będzie powodował stan wysoki to już po pół okresu zostanie on zmieniony na niski i wykrycie przerwania - opóźnienie rzędu 12.5us co jest około 3mm.
    2) gdy wyzwalam przerwanie tylko zboczem narastającym (stanem wysokim) to gdy po poprzednim pomiarze pozostanie stan wysoki i pierwszy odebrany sygnał też taki będzie powodował, to zeby wyzwolić przerwanie potrzeba całego okresu: z początkowego stanu wysokiego przejść w stan niski i dopiero znów w stan wysoki, żeby wyzwolić przerwanie - opóźnienie rzędu 25us co daje około 6mm.

    Jeśli chodzi o tego typu dalmierz to pewnie takie niepewności nie grają większej roli, ale chyba zawsze jest lepiej mieć je mniejsze niż większe.

    EDIT: Chyba faktycznie muszę wrzuć ten wzmacniacz lub zwiększyć moc nadajnika, bo przy dobrym osłonięciu przed ugięciem fali to w miarę dobre odległości pokazywał ale do max 0,5m
  • #12
    pimpuk
    Level 23  
    Wytłumacz mi, jak może być stan wysoki na ACSR, gdy odbiornik nic nie odbiera? Jeśli tobie się tak zdarza, to powinieneś go rozładować zwierając do masy. Nawet na kilka us tuż przed odebraniem paczki.
    I proszę przestaw ten ACSR.
    No i dobrą praktyką jest wygaszanie nadajnika, gdy już nada paczkę.
    Myślę, że jutro wieczorem zbuduję prototyp według Twoich planów i pomierzę wszystko, to może coś wymyślimy.
  • #13
    Legier
    Level 11  
    Quote:
    Wytłumacz mi, jak może być stan wysoki na ACSR, gdy odbiornik nic nie odbiera?

    Pozostałość po poprzednim stanie. ACSR może mieć tylko 2 stany, wysoki lub niski, jesli więc jest stan wysoki, a odbiornik nic nie odbiera, to dlaczego ACSR miałoby się przestawić w stan niski skoro napięcie na AIN1 nie jest wyższe? Dlatego uważam że pozostanie w stanie poprzednim, aż do jego wytrącenia.
  • #15
    pimpuk
    Level 23  
    Legier wrote:
    dlaczego ACSR miałoby się przestawić w stan niski skoro napięcie na AIN1 nie jest wyższe

    ACO jest jedynką, gdy AIN1>AIN0.
    ACO jest zerem, gdy AIN1<AIN0.
    Jeśli tak nie jest, to po jakiego grzyba była by ta cała komparacja?

    O Dondu, dobrz że jesteś. Jak byś trochę pomógł, to bym się odstresował.
    Mam nerwówkę w pracy, bo koniec miesiąca, terminy gonią :D
  • #16
    Legier
    Level 11  
    Quote:
    ACO jest jedynką, gdy AIN1>AIN0.
    ACO jest zerem, gdy AIN1<AIN0.
    Jeśli tak nie jest, to po jakiego grzyba była by ta cała komparacja?

    Zgodzę się, tylko że na odwrót. AIN0 jest wejściem dodatnim komparatora, a AIN1 ujemnym, więc:
    ACO jest 1, gdy AIN0 > AIN1
    ACO jest 0, gdy AIN0 < AIN1

    A wracając do tematu, to ok, zmienię na wyzwalanie zboczem narastającym, doczytałem to i owo i już widzę tego sens.
  • #17
    pimpuk
    Level 23  
    Legier wrote:
    Zgodzę się, tylko że na odwrót. AIN0 jest wejściem dodatnim komparatora, a AIN1 ujemnym,

    Tyż prawda :)

    Anyway, czekamy niecierpliwie na poprawki.
  • #18
    Legier
    Level 11  
    Quote:
    Anyway, czekamy niecierpliwie na poprawki.

    Tzn.? Wyzwalanie zmieniłem, ale efekt inny niż wyzej opisany nie następuje.
  • #19
    dondu
    Moderator on vacation ...
    Legier wrote:
    Chyba faktycznie muszę wrzuć ten wzmacniacz lub zwiększyć moc nadajnika, bo przy dobrym osłonięciu przed ugięciem fali to w miarę dobre odległości pokazywał ale do max 0,5m

    Niestety to niezbędne i od tego należało by zacząć.
  • #22
    Legier
    Level 11  
    Póki co jeszcze nie mam WO, więc próbuję coś pokombinować z tym co mam z tym dalmierzem i kiedy oddaliłem nadajnik z 2 do 12cm od odbiornika to wydaje się wszystko w porządku - w miarę ok pokazuje odległość od biurka do sufitu, aczkolwiek czasem pojawiają się "dziwne" pomiary, gdyż nic nie stoi na drodze a pokazywana odległość czasem się zmienia. Co mnie jeszcze bardziej dziwi to gdy osłonię nadajnik kawałkiem wężyka paliwowego to od razu pokazuje się odległość rzędu 20cm, gdy dołożę jeszcze 20cm rurkę PCV i ścisnę ją na końcu to dopiero pokazuje się dobra odległość 180cm, jeśli nie ścisnę to pokazuje około 30cm. Wiecie czemu tak się może dziać? Wszystko pokazałem na filmiku.
  • #23
    pimpuk
    Level 23  
    Zbudowałem na szybko układzik.
    Przetworniki bezpośrednio do Atmegi.
    Sygnał nadajnika wygląda tak:

    Atmega8 - Błedne wskazanie dalmierza ultradźwiękowego


    Po podpięciu przetwornika:

    Atmega8 - Błedne wskazanie dalmierza ultradźwiękowego
    78kHz, a powinno być 40kHz.
    Powinien być bardziej prostokątny, ale wziąłem przetwornik z nawilżacza powietrza, a on ma taką pojemność dosyć dużą.



    Na odbiorniku wygląda to tak:

    Atmega8 - Błedne wskazanie dalmierza ultradźwiękowego

    138mV to znacznie za mało. Już wiesz jakie wzmocnienie dać na WO?
    Wyświetlacz pokazuje jakieś bzdury, nawet jak odłączę przetworniki.

    Gdzieś mam przetworniki od sonara na wzmacniaczu TLC274C, to jeszcze się odezwę.
    No ale już wiadomo, że kod jest do przerobienia.
  • #24
    Legier
    Level 11  
    Wszystko fajnie, tylko chciałbym aby kod zgadzał się również z teorią, a tu mi coś nie gra. Pokazałeś że na wyjściu jest 78kHz, a z obliczeń: taktowanie 8MHz, timer 1 w trybie szybkiego PWM 8-bit, jedno zliczenie zegara to 1/8 000 000 = 0.125us, OCR1A = 100 czyli czas potrzebny na dotarcie zegara do 100 to 12.5us (stan wysoki, na Twoim zdjęciu wszyło połowę mniej), potem dodaję do stanu licznika 55 żeby stan niski trwał tyle samo, więc T = 25us, f = 40kHz - jesteś pewny że dobrze zaprogramowałeś Atmegę?
    A co do odbiornika, to przecież komparator w Atmedze nie pracuje w żadnym sprzężeniu, więc chyba powinien być wstanie wykryć że na jednym z wejść pojawiło się 0.138V. W takim razie jak odnieść to wszystko do filmiku, który wrzuciłem? Tam jakby w pewnych warunkach wszystko działało prawidłowo.
  • #25
    User removed account
    User removed account  
  • #26
    pimpuk
    Level 23  
    albertb wrote:
    Przez tą powierzchnię przenika cała energia.
    Wiem, wiem. Miał być kwadrat odległości.
    albertb wrote:
    No i czemu niby ta energia jest promienista?
    Przejęzyczenie. Chodziło o to, że rozchodzi się kuliście.

    Legier wrote:
    taktowanie 8MHz

    A cha, ja mam 16MHz.
    Już zmieniam.
  • #27
    Legier
    Level 11  
    dondu wrote:
    http://www.kerrywong.com/2011/01/22/a-sensitive-diy-ultrasonic-range-sensor/

    Próbowałem zrobić odbiornik w układzie tym układzie ale nic mi nie wychodziło. Wartości rezystorów i kondensatorów odpowiednio przeliczałem żeby uzyskać filtr odpowiedni dla mojej częstotliwości. Próbowałem także w układzie wzmacniacza różnicowego o wzmocnieniu 10-100, ale przy stosowaniu wyliczonych filtrów nic nie wychodziło. Jedynie jak czasem jakiś kondensatorek gdzieś dołożyłem to coś się udawało i wskazywało odpowiednią odległość, ale często się gubił i pokazywał błędne wartości. Nie wiem co może za tym stać.
  • #28
    PiotrPitucha
    Level 33  
    Witam
    Odbiornik ze strony którą poleca Dondu jest zintegrowany z detektorem a Ty jak myślę chcesz mierzyć czas więc koncepcja trochę inna.
    Natomiast nadajnik na tej stronie jest zupełnie pokopany, ten mostek służy głównie do zwierania zasilania, nigdy bym takiego nie polecał.
    Piotr

    Dodano po 23 [minuty]:

    Witam
    Albert co do zmniejszania energii z odległością to ciężko się wypowiadać, jeśli rzeczywiście nadajnik promieniuje sferycznie to energia na jednostkę powierzchni będzie maleć do 2 potęgi co wynika wprost ze wzoru na powierzchnię sfery.
    Mam nadzieję że nikt takich przetworników nie robi bo to mija się z celem, załóżmy że promieniuję jak laser co też jest z gruntu błędnym założeniem to tłumienie ultradźwięków w powietrzu będzie proporcjonalne do kwadratu odległości, żeby się dobrze nie liczyło to fala odbije się od przeszkody i musi wrócić a przeszkoda z natury nie musi być płaska.
    Reasumując, lekko licząc strata będzie proporcjonalna do trzeciej potęgi, chyba że mierzymy w warunkach warsztatowych i mamy prostopadle ustawiony "odbłyśnik".
    Legier, co do wzmocnienia to zmierz sygnał jaki masz na odbiorniku w największej odległości pomiarowej i wzmocnij go tyle razy by na wyjściu było 75% zasilania, to powinno wystarczyć.
    TL084 czy tym podobne słabo nadają się do takich zabaw, polecam conajmniej LM358 a najlepiej MCP607, wtedy możesz się zasilić nawet z 3,3V i podpiąć normalnie na wejście a nie różnicowo.
    Piotr
  • #29
    Legier
    Level 11  
    PiotrPitucha wrote:
    a Ty jak myślę chcesz mierzyć czas

    No tak. Wysyłam paczkę impulsów i mierzę czas po jakim odbiornik je odbierze. Tylko właśnie pojawił się problem ze wzmocnieniem sygnału z odbiornika, co wyżej opisałem.
    PiotrPitucha wrote:
    Natomiast nadajnik na tej stronie jest zupełnie pokopany

    Z tego co wyczytałem to zamysłem autora było żeby zmieniać kierunek prądu w nadajniku przez co wywołać większy poziom natężenia dźwięku niż w przypadku gdy jedna nóżka zawsze byłaby połączona z masą, a druga przemiennie ze źródłem sygnału i masą.
  • #30
    PiotrPitucha
    Level 33  
    Witam
    Zasada pobudzania w ten sposób przetwornika jest słuszna i ma na celu zwiększenie mocy przy niskim napięciu zasilania, ale zauważ że tranzystory pracują w układzie wspólnego emitera, czyli przy sterowaniu tranzystorem od GND+0,6V do Vcc-0,6V przewodzą oba tranzystory czyli zwierają zasilanie.
    Coprawda oporniki w bazie są rzędu 1K, ale przy wysokim wzmocnieniu tranzystorów spowodują przepływ prądu rzędu kilkuset mA między masą a zasilaniem w czasie przełączania, czas ten jest dość krótki ale może wystarczyć do ich zniszczenia.
    Podobny efekt można uzyskać podpinając się do wyjść bramek sterowanych w przeciwfazie a układ taki nie będzie miał ujemnych cech prezentowanego rozwiązania.
    Piotr