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
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!
(ps. temat umieszczony też na dioda.com.pl)
EDIT: problem rozwiązany
niedługo powinienem zamieścić opis całego projektu
EDIT2: przepraszam za opóźnienia niemniej częściej mnie nie ma niż jestem a mam jeszcze trochę na głowie
opisy powinienem niemniej zamieścić w ciągu góra dwóch tygodni
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ć
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!
(ps. temat umieszczony też na dioda.com.pl)
EDIT: problem rozwiązany
niedługo powinienem zamieścić opis całego projektu
EDIT2: przepraszam za opóźnienia niemniej częściej mnie nie ma niż jestem a mam jeszcze trochę na głowie
opisy powinienem niemniej zamieścić w ciągu góra dwóch tygodni