Witam
Postanowiłem zbudować miernik odległości wykorzystujący ultradźwięki. Zakupiłem 2 czujniki w TME http://www.tme.pl/przetwornik-ultradzwiekowy-...runkowy-40khz/arts/pl/a29/bpu-1640toah12.html
http://www.tme.pl/dok/b14/100902_bpu-1640ioah12.pdf
Jednego używam do wysłania fali a 2-go do odebrania.
Po przejrzeniu postów na Elektrodzie i innych www zbudowałem poniższy układ w załączniku (PDF).
Program napisałem a Bascomie ale NIESTETY NIE DZIAłA. Oto on
Na LCD ciągle wyświetlana jest stałą wartość z TIMER1, który odlicza czas powrotu odbitego impulsu. Impulsu generuje przez zmianę stanu na wyprowadzeniu PD.4 po każdym przerwaniu z Timer0(co 12,5µs, czyli pół okresu 40kHz).
Czasami jak dotknę czujnika pracującego jako odbiornik wartość z Timer1 zmienia się.
Odebrane impulsy wzmacniam w TL072 i wykrywam w komparatorze, który zmieniając stan wyjścia podaje zbocze opadające na wejście przerwania zewn. INT1 w obsłudze którego będę przeliczał odległość.
W tej chwili nie jestem pewien czy to wina programu czy części analogowej. Proszę o podpowiedzi i uwagi co do tej konstrukcji. Z góry dziękuje.
Postanowiłem zbudować miernik odległości wykorzystujący ultradźwięki. Zakupiłem 2 czujniki w TME http://www.tme.pl/przetwornik-ultradzwiekowy-...runkowy-40khz/arts/pl/a29/bpu-1640toah12.html
http://www.tme.pl/dok/b14/100902_bpu-1640ioah12.pdf
Jednego używam do wysłania fali a 2-go do odebrania.
Po przejrzeniu postów na Elektrodzie i innych www zbudowałem poniższy układ w załączniku (PDF).
Program napisałem a Bascomie ale NIESTETY NIE DZIAłA. Oto on
$regfile = "m8def.dat"
$crystal = 4000000 'kwarc 8MHz
Config Timer0 = Timer , Prescale = 1 'timer0 jako licznik do generowania 40kHz
Config Timer1 = Timer , Prescale = 8 'timer1 jako licznik do odliczania czasu powrotu fali
Config Int1 = Falling 'przerwanie do sprawdzania odebrania odbitego impulsu
'"0"-wejście "1"-wyjście
Config Portb = &B111111 'wyświetlacz alfanumeryczny LCD
Config Portd = &B11110111
Portb = &B000000
Portd = &B00001000
Config Lcd = 16 * 1a 'wyświetlacz alfanumeryczny
Config Lcdbus = 4 'podłączony przez szyne 4-ro bitową
Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portd.6 , Rs = Portd.5
Cursor On
Cls
Send Alias Portd.4
Rec Alias Pind.3
Dim L As Single
Dim Period As Byte
Dim Ok As Bit
Dim Unit As String * 3
Dim L_ok As String * 7
Enable Interrupts
Enable Timer0
On Int1 Received
On Timer0 Generate
Stop Timer0
Stop Timer1
'**************************************************************
Do
Timer0 = 206
Start Timer0 'w przerwaniach Timer 1 zmienaj stan na przetworniku czyli:
Do
If Period = 16 Then 'wyslij impulsy o f=40kHz (8 okresów)
Stop Timer0
Period = 0
Exit Do
End If
Loop
Timer1 = 0 'wyczyść licznik odliczający czas i:
Start Timer1 'zacznij odliczać do czasu wystąpienia przerwania z INT1(otrzymania impulsu odbitego)
Waitms 5 'po wysłaniu czekaj czas nieczułości
Enable Int1 'i sprawdzaj czy przyszedł odbity impuls
Do
Loop Until Ok = 1 'po odebranym impulsie...
Ok = 0
Wait 1 'poczekaj 1 sekundę
Loop
End 'end program
'**************************************************************
Generate: 'impulsy o f=40kHz
Timer0 = 206
Toggle Send
Incr Period
Return
'**************************************************************
Received: 'po odebraniu odbitego impulsu, zmienna OK=1
Disable Int1
Stop Timer1
'(
L = Timer1 * 343 'czas odbicia razy prędkość dzwięku
'L = L / 2 ' podzielić przez 2 bo fala biegnie do prszeszkody i spowrotem
L = L / 1000000 'w metrach
If L < 1 Then
L = L * 100
Unit = "cm "
Else
Unit = "m "
End If
L_ok = Fusing(l , "#.##")
')
Locate 1 , 1
Lcd "Ultra L"
Locate 2 , 1
Lcd "=" ; Timer1 ; " " 'L_ok ; Unit ; " "
Ok = 1
Return
'**************************************************************Na LCD ciągle wyświetlana jest stałą wartość z TIMER1, który odlicza czas powrotu odbitego impulsu. Impulsu generuje przez zmianę stanu na wyprowadzeniu PD.4 po każdym przerwaniu z Timer0(co 12,5µs, czyli pół okresu 40kHz).
Czasami jak dotknę czujnika pracującego jako odbiornik wartość z Timer1 zmienia się.
Odebrane impulsy wzmacniam w TL072 i wykrywam w komparatorze, który zmieniając stan wyjścia podaje zbocze opadające na wejście przerwania zewn. INT1 w obsłudze którego będę przeliczał odległość.
W tej chwili nie jestem pewien czy to wina programu czy części analogowej. Proszę o podpowiedzi i uwagi co do tej konstrukcji. Z góry dziękuje.