ATNEL tech-forum
https://forum.atnel.pl/

HC-SR04 i Atmega 32
https://forum.atnel.pl/topic3090.html
Strona 1 z 1

Autor:  Badman [ 11 maja 2013, o 14:05 ]
Tytuł:  HC-SR04 i Atmega 32

Witam

Zakupiłem ultradźwiękowy miernik odległości HC-SR04, napisałem program lecz niezbyt dokładny jest pomiar odległości.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Według dokumentacji zmierzony czas trwania stanu wysokiego powinien być podzielony przez 58, żeby otrzymać wynik w cm. Metodą prób i błędów doszedłem, że zmierzony czas muszę podzielić przez 10, aby wynik w cm był w miarę wiarygodny. Różnica w odległości sięga nieraz 10 cm dla odległości 186 cm. Czyli na wyświetlaczu mam 196 cm.
Co jest przyczyną:
1. mój program,
2. wewnętrzny oscytalor atmegi ustwiony na 8 MHz ma znaczny rozrzut,
3. kiepsko skalibrowany uklad HC-SR04
?

Autor:  Janadamis [ 11 maja 2013, o 15:16 ]
Tytuł:  Re: HC-SR04 i Atmega 32

Ja też w zeszłym tygodniu kupiłem ten czujnik.
Jeszcze nie zacząłem pisać programu ale wydaje mi się że lepiej jakby wykorzystać przerwanie od ICP. Tak jak są odbierane kody z pilota RC5
Po drugie po co w przerwaniu wyłączasz timer?

------------------------ [ Dodano po: 5 minutach ]

I może przez ten _delay_ms(350); z pętli głównej program źle chodzi

Autor:  SunRiver [ 11 maja 2013, o 15:25 ]
Tytuł:  Re: HC-SR04 i Atmega 32

gdzieś już pisałem o tym na forum poszukajcie , całkiem fajnie chodzą i tańsze od pololu

Obrazek

brak dokładności na małych odległościach wynika z nakładania się echa na nowy pomiar

topic2655.html

Autor:  Lukasz89 [ 11 maja 2013, o 15:35 ]
Tytuł:  Re: HC-SR04 i Atmega 32

Janadamis napisał(a):
Po drugie po co w przerwaniu wyłączasz timer?

Dokładnie, nie ma takiej potrzeby, preskaler ustaw raz na początku zaś w przerwaniu rób coś innego:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Poza tym możesz ustawić kombinacje bitów ISC01:0 na 10 i wtedy przerwanie będzie występowało przy zmianie stanu - nie będzie potrzeby ciągłych zmian sposobu wyzwolenia przerwania w samym przerwaniu. Bo jeśli się nie mylę, to przy takim sposobie zmian w trakcie działania programu - przed każdą zmiana należy wyłączać przerwanie z tego źródła, następnie zmienić sposób wyzwalanie, skasować flagę przerwanie - która może się ustawić przy takiej zmianie, i na końcu aktywować przerwanie.

Autor:  sz4t4n [ 11 maja 2013, o 15:57 ]
Tytuł:  Re: HC-SR04 i Atmega 32

Pod tym linkiem masz fajnie działający krótki kod. http://www.elektroda.pl/rtvforum/topic2443109.html

Autor:  kiclaw [ 11 maja 2013, o 21:55 ]
Tytuł:  Re: HC-SR04 i Atmega 32

yhh ile ja to się nawalczyłem z tym HC-SR04 :)

Oczywiście musisz wykorzystać przerwanie od ICP, wtedy preskaler ICP na 8 i potem w kodzie programu jeszcze na dwa, i wtedy masz pięknie podaną szerokość w mikrosekundach. (tylko że u mnie był kwarc 16MHz)

To co piszesz o dzieleniu przez 10 jest błędne, wynik w mikrosekundach dzielisz przez 58 i wtedy wychodzi wynik w cm. Nie inaczej. Pozatym tak masz w nocie katalogowej.

W kodzie który podał kolega wyżej ma nie być tego odejmowania 7 od zmiennej PulseWidth.

Autor:  Badman [ 12 maja 2013, o 08:30 ]
Tytuł:  Re: HC-SR04 i Atmega 32

Lukasz89 napisał(a):
Janadamis napisał(a):
Po drugie po co w przerwaniu wyłączasz timer?

Dokładnie, nie ma takiej potrzeby, preskaler ustaw raz na początku zaś w przerwaniu rób coś innego:

Jeszcze nie sprawdziłem, ale jeżeli nie zatrzymam TIMER0 to zmienna licznik będzie się wciąż inicjować. Więc na jakiej podstawie ma być prawidłowo odczytany czas ?

Cytuj:
Poza tym możesz ustawić kombinacje bitów ISC01:0 na 10 i wtedy przerwanie będzie występowało przy zmianie stanu - nie będzie potrzeby ciągłych zmian sposobu wyzwolenia przerwania w samym przerwaniu. Bo jeśli się nie mylę, to przy takim sposobie zmian w trakcie działania programu - przed każdą zmiana należy wyłączać przerwanie z tego źródła, następnie zmienić sposób wyzwalanie, skasować flagę przerwanie - która może się ustawić przy takiej zmianie, i na końcu aktywować przerwanie.

Zastosuje się do Twojej wskazówki, tyle że należy mieć pewność, że HC-SR04 na wyjściu echo nie wygeneruje "przypadkowej" zmiany stanu.

Autor:  Lukasz89 [ 12 maja 2013, o 09:21 ]
Tytuł:  Re: HC-SR04 i Atmega 32

Inicjować czy inkrementować ? A no tak, to pod zerowaniem TCNT0 wyzeruj zmienną licznik.
Co do przypadkowego stanu to raczej pojawić się nie powinno. Zerknij jak rozwiązał to SunRiver, link powyżej.

Autor:  Paul Dirac [ 10 gru 2013, o 23:05 ]
Tytuł:  Re: HC-SR04 i Atmega 32

W sumie sporo przydatnych softów. O rezultacie napiszę jutro.

Autor:  robo1973 [ 9 gru 2017, o 20:23 ]
Tytuł:  Re: HC-SR04 i Atmega 32

W linku podanym przez kol sz4t4n jaki ma być preskaler dla taktowania 8MHz ? Czy coś jeszcze trzeba zmienić dla tego zegara bo jakieś dziwne wartości pokazuje wyświetlacz

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/