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

[Atmega8][C] - HC-SR04 błędne pomiary powyżej 30cm

joik123 10 Sie 2015 21:35 1338 8
REKLAMA
  • #1 14912410
    joik123
    Poziom 9  
    Posty: 58
    Ocena: 3
    Witam
    Od początku dzisiejszego dnia "męczę" się z ultradźwiękowym miernikiem odległości HC-SR04. Poszperałem w internecie napisałem program itp. Nawet działa, ale tylko do określonej odległości (ok. 30cm). Połączenia raczej mam dobre, próbowałem odmierzać impulsy z wykorzystaniem wejścia ICP1 (PB0 i wtedy diody wskazujące odległość bardzo słabo świeciły), a później napisałem z wykorzystaniem przerwania INT1_vect (diody świeciły normalnie :D). W obu sytuacjach miernik wskazywał poprawną odległość do max 30 cm. Przeglądnąłem forum natrafiłem na taki taki temat (jak wyrównać potencjały na płytce stykowej?).

    teraz kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    diody sygnalizują odległość - jedna podłączona do PD1 i liczba mrugnięć to cyfra dziesiątek, podobnie jest z drugą. I sorry trochę chaotyczny ten program :P.
    Z góry dziękuje.
    Pozdrawiam. [/code]
  • REKLAMA
  • Pomocny post
    #2 14912519
    strikexp
    Poziom 27  
    Posty: 2396
    Pomógł: 101
    Ocena: 104
    Z tego co widzę chodzi o spadki napięcia na płytce stykowej. Musisz zapewnić lepsze połączenia/styki. Chyba że jest jakiś specjalny sposób na wyrównywanie tych potencjałów.
    Pamiętaj że płytka stykowa to tylko taka zabawka do prowizorycznych połączeń. Jak chcesz mieć niezawodny układ to trzeba go zlutować.
  • REKLAMA
  • #3 14912674
    joik123
    Poziom 9  
    Posty: 58
    Ocena: 3
    Ok, ok, ale innym jakoś działa na płytce stykowej :D
  • REKLAMA
  • Pomocny post
    #4 14912911
    strikexp
    Poziom 27  
    Posty: 2396
    Pomógł: 101
    Ocena: 104
    Kwestia płytki stykowej, mi działała ATmega na najtańszej płytce stykowej i kilku przewodach z tzw skrętki komputerowej. Do czasu gdy odłożyłem całość na miesiąc i przewody zaśniedziały :D Teraz już wiem żeby nie bawić się w prowizorkę i używam tzw jumperów (przewodów cynowanych).
  • #5 14915004
    joik123
    Poziom 9  
    Posty: 58
    Ocena: 3
    Problem po części rozwiązano :D

    strikexp - tak miałem 4 połączenia z tzw. skrętki komputerowej :D bo wcześniej nie miałem zworek i tak zostało, ale po zmienieniu płytki stykowej i zrobieniu wszystkich połączeń na nowo było to samo.

    Potem pobawiłem się z taktowaniem Atmegi8 i o dziwo odmierzała dobrze, ale rzeczywiście styki na złączu miernik-płytka nie działały dobrze, bo poruszając nim (w pionie) dawała różne wyniki (nawet metr różnicy :P). Nie wiem tylko dlaczego na Attiny tego nie ma (płytka ta sama i miejsce też). Jakoś dam radę :D
    Tak przy okazji powiedzcie mi dlaczego ten kod nie działa mi na Attiny13A?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Mikrokontroler jest nowy, poza moim ew. błędem, możliwe jest, że to wada fabryczna?
  • #6 14915055
    strikexp
    Poziom 27  
    Posty: 2396
    Pomógł: 101
    Ocena: 104
    Nie wiem dlaczego nie działa, ale programy z reguły działają tylko na danej rodzinie mikrokontrolerów np ATmega 48, 88, 168 i 328. Do każdej takiej rodziny trzeba dostosować program. A do ATtiny to juz całkowicie trzeba według innych zasad pisać bo to inny typ mikrokontrolera, bardzo ograniczony w porównaniu do ATmega.
  • #7 14915291
    2rs232
    Poziom 18  
    Posty: 141
    Pomógł: 28
    Ocena: 20
    joik123 napisał:
    Tak przy okazji powiedzcie mi dlaczego ten kod nie działa mi na Attiny13A?

    W kodzie brakuje globalnego zezwolenia na przerwania.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 14915330
    joik123
    Poziom 9  
    Posty: 58
    Ocena: 3
    Tak, teraz działa :D Sorry, podstawy, a raczej brak pamięci xD
    Za wszystko bardzo dziękuję :D
    Pozdrawiam.
  • REKLAMA
  • #9 14940565
    joik123
    Poziom 9  
    Posty: 58
    Ocena: 3
    Jeśli to się jeszcze komuś przyda, to w moim problemie chodziło o coś zupełnie innego :D
    Jak zwykle "poszło" o podstawy.
    Chyba najkrótsza funkcja w moim programie zawaliła, a dokładnie zmienna.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    mnożąc zmienną value przez 34, gdzieś musiała się pomieścić, a zmienna ta była w stanie zapisać max. 65536. Więc jeśli impuls trwał mniej niż 1927 zliczeń timera (65535/34) to wyniki były jak najbardziej poprawne, a jeżeli zmienna value "miała" powyżej 1927, to było już gorzej :D Dlatego do 32 cm wszystko było ok (powinienem się wcześniej skapnąć :P) Pisząc kod na Attiny jakimś zbiegiem okoliczności dałem 32 bitową zmienną value i wszystko grało, ale to był jakiś bardzo duży fart.
    Jeśli coś źle napisałem to proszę o korektę :D, ale zapewniam, że nie były temu winne żadne styki :P.

Podsumowanie tematu

✨ Użytkownik zmagał się z problemem błędnych pomiarów odległości przy użyciu czujnika ultradźwiękowego HC-SR04, który działał poprawnie tylko do 30 cm. Po analizie połączeń na płytce stykowej oraz modyfikacji kodu, okazało się, że problemy były związane z jakością połączeń oraz z ograniczeniami zmiennej `value`, która nie mogła pomieścić większych wartości. Po poprawie połączeń i zastosowaniu 32-bitowej zmiennej, pomiary zaczęły działać poprawnie. Użytkownik zauważył również, że programy dla różnych mikrokontrolerów, takich jak ATmega i ATtiny, wymagają dostosowania do specyfikacji danej rodziny mikrokontrolerów.
Wygenerowane przez model językowy.
REKLAMA