Skocz do zawartości

Kolejny sonar i problem


Rozwiel

Pomocna odpowiedź

Witam

Wiem, że jest tu dużo tematów związanych z sonarami niemniej ostatnio kombinuję nad własnym czujnikiem ultradźwiękowym, który próbuję zrobić "po swojemu" i jak można się było spodziewać - nie działa.

Bardzo możliwe, że powinienem dopisać post do istniejących tematów niemej mam wrażenie, że kod jest na tyle inny od reszty, że można się pokusić o jakąś osobność (i przy okazji może uda się też dostać szybszą odpowiedź a na takiej mi zależy 🙂 )

Założenie jest proste - mam nadajnik i odbiornik ultradźwiękowy (T,R) wpięte bezpośrednio w uC (atmega128 taktowany 8MHz) i jedną diodę która ma sygnalizować, że sonar coś "widzi" (w planach jest dołożenie jeszcze kilku LEDów co by przybliżyć działanie do często przytaczanego 'wątku sonarowego' .

Do rzeczy:

Nadajnik jest wpięty w piny PA:

+ w PA0 ; - w PA1

Odbiornik w piny PE:

+ w PE3 ; - w PE2 (odpowiednio AIN1 i AIN0 czyli w komparator 128'mki)

LED do PB2.

A oto kod odmawiający współpracy

#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

int echo;


//______________________________IMPULS
void impuls (void)
{
int i;
for (i=0;i<4;i++)   							//cztery impulsy po 26us - nadawanie sygnału przez ~100us  
{
	PORTA=0x01; DDRA=0x03;						//impuls na +nadajnika
	_delay_us(13);
	PORTA=0x00; DDRA=0x03;						//wytłumienie nadajnika
	_delay_us(13);
}
}
//_____________________________/IMPULS



//______________________________POMIAR
int pomiar (void)
{
int flaga = 0;
TCCR1B |= (1 << CS10);  						//timer włączony
for ( echo=0 ; echo<14 ; echo++ )				// 14 taktów po ~15 us -> 210 us czyli zasięg ~35cm w te i wefte
	{											//----FOR
		TCNT1 = 0;							    //zerownia timera
		while (TCNT1 < 64)  					//64 taktów / ~15us ustawia dokładność do ~5 cm
		{										//----WHILE
			if (bit_is_set(ACSR,ACO))
				{ flaga++; break; } 			// sygnał z odbiornika = wypad z pętli

		}										//---/WHILE
		if (flaga != 0) {break;}				//wypad z for
	}											//---/FOR
TCCR1B &= ~(1 << CS10);							//wyłączenie timera
return (echo);									//zwracamy "odległość"
}
//_____________________________/POMIAR


int main()
{
_delay_ms(2000);	
TIMSK |= (1<<TOIE0);  							// ustawienia komparatora analogowego
for (;;)	
{
PORTE=0x04; DDRE=0x0c;							//tłumienie odbiornika (zwarcie + do masy O,o)
PORTA=0x00; DDRA=0x03;							//nadajnik off
_delay_ms(5);

PORTE=0x00; DDRE=0x0c;							//włączenie odbionika

impuls();
pomiar();

if ( echo!=0 )									//jak coś wykryło to świecimy diode
{ DDRB=0x04; PORTB=0x04;}
else
{ DDRB=0x04; PORTB=0x00;}
}
}

no i nie świeci

IMPULS śle pare sygnałów mających imitować sinusoidę o częstotliwości +/- 38,5 kHz. Jak się przyłoży ucho to słychać ledwie słyszalne "brzęczenie" przez ułamek sekundy więc zakładam, że to akurat działa.

POMIAR to moje radosna twórczość mając mierzyć odległość. Nie mam pojęcia czy działa ale pewnie nie skoro dioda ani myśli mrugnąć :/ W założeniu ma przez około 200 us czekać na sygnał z komparatora (przez 200us dźwięk przebywa około 70cm więc teoretycznie powinien wykryć przedmiot znajdujący się około 35 cm od nadajnika. Zliczanie czasu wziąłem ze strony http://www.wkretak.pl/ W samy naliczaniu opóźnień chyba się nie walnąłem więc pewnie coś jest nie tak z komparatorem.

No i właśnie komparator to moja największa bolączka. Do tej pory trzymałem się z dala od sprzętu a mikrokontrolerów nie ruszałem nawet kijem i przyznam szczerze, że nie bardzo jeszcze łapię jak powinno się tym sterować :| (tak, czytam dokumentacje; nie, wciąż nie czaję).

Teoretycznie kiedy coś pojawiłoby się przed czujnikiem lampka powinna zacząć wesoło się jarzyć uspakajającym, zielonym światełkiem, niestety nic takiego się nie dzieje w związku z czym wołam POMOCY!

Link do komentarza
Share on other sites

IMPULS śle pare sygnałów mających imitować sinusoidę o częstotliwości +/- 38,5 kHz. Jak się przyłoży ucho to słychać ledwie słyszalne "brzęczenie" przez ułamek sekundy więc zakładam, że to akurat działa.

Skoro słychać, to po mojemu jest to akurat sygnał, że nie działa - są to czujniki ultradźwiękowe, czyli działające w paśmie niesłyszalnym dla człowieka. Masz fusebity ustawione dobrze? Bit odpowiedzialny za kompatybilność z m103 przestawiony na m128?

Link do komentarza
Share on other sites

fueses mam ustawione tak

racja kolegi - brzęczeć to nie powinno ani trochę (myślałem, że nadajnik przenosi trochę drgań na obudowę i się to telepie... można się śmiać 😉 )

EDIT: zrobiłem próby z przestawienie m103 na 0 i na 1

przy m103C na 0 nadajnik brzęczał cały czas

przy 1 - co około sekundę dawał krótki sygnał

Link do komentarza
Share on other sites

@Bobby: nie do końca, jeśli wysyła ciągły sygnał 40kHz to nie mamy prawa tego słyszeć, jeśli natomiast modulowany (i w dodatku załączanie 0-5V) to już można go usłyszeć, bo słyszymy harmoniczną sygnału modulowanego.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

przepraszam za opóźnienia niemniej mam jeszcze trochę roboty a mało czasu i często wyjeżdżam do tego

niemniej w ciągu paru-parunastu dni powinienem zamieścić opisy

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.