PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cảm biến (http://www.picvietnam.com/forum/forumdisplay.php?f=18)
-   -   [Tutorial] Hướng dẫn đo khoảng cách bằng sóng siêu âm với module tự làm (http://www.picvietnam.com/forum/showthread.php?t=31208)

dinhvanphuc 17-11-2012 07:07 PM

[Tutorial] Hướng dẫn đo khoảng cách bằng sóng siêu âm với module tự làm
 
6 Attachment(s)
Khi nhắc tới đo khoảng cách bằng sóng siêu âm thì ai cũng nghĩ tới module srf05 mà không phải là tự làm cho mình một module. Giá của module tự làm khoảng 65K ( cặp thu phát siêu âm 400ST160) và các linh kiện khác khoảng tối đa là 20K.
Ban đầu khi mới bắt đầu làm thì không có ai hướng dẫn (http://www.picvietnam.com/forum/showthread.php?t=31090) nên mình đã tự nghiên cứu.
Mình không biết up ảnh như thế nào vào bài viết nên mình sẽ gửi đính kèm ảnh.
Về sơ đồ mạch thì các bạn xem trong file capture mà mình gửi kèm.
Trong sơ đồ mạch có connector 4 gồm: (từ phải sang trái) nguồn 5V, Mass, chân phát, chân thu.
Chân phát được đưa qua khóa điện tử là BJT C1815.
Ở cảm biến nhận thì một đầu nối mass, một đầu nối qua tụ liên lạc. Điện trở R32 (47K) có tác dụng là khi cảm biến không nhận được tín hiệu thì nó được nối mass.
Tín hiệu thu được đưa vào chân + của opamp LM324 để khuếch đại tín hiệu lên 200 lần
Các diode D6 D7 tụ 102 và R33(10K) có tác dụng biến tín hiệu hình sin thành tín hiệu vuông.
Tín hiệu xung vuông này ko được vuông nên mình đưa qua mạch so sánh điện áp với điện áp chuẩn được thay đổi bởi biến trở 10K.

Lập trình:

Có 3 cách để đo khoảng cách bằng sóng siêu âm:
Cách đầu tiên là đo độ rộng xung của tín hiệu thu về và áp dụng định luật Doppler để tính ra khoảng cách với tần số phát là 40Khz.
Cách thứ hai là đọc giá trị adc, từ giá trị adc này có thể tính được khoảng cách. Các bạn có thể tham khảo ở trang web này để biết thêm thông tin( http://www.maxbotix.com/articles/032.htm)

Cách thứ ba là đo thời gian từ khi phát xung đến khi nhận xung là bao nhiêu. Áp dụng công thức s=(v*t)/2 với v=340m/s. Ở đây mình dùng cách này.

Lập trình:
- Dùng timer1 để tính thời gian tràn là 65ms. Mỗi khi tràn thì ta phát đi một chuỗi xung gồm 8 xung với tần số là 40Khz.
Mình có gửi hình ảnh dạng sóng đo bằng oscilloscope.
- Khi có vật cản thì sẽ có tín hiệu đưa về, qua bộ so sánh điện áp thì mình thu được xung vuông. Xung vuông này được đưa đến chân RB0 (ngắt). Mình lập trình mức tích cực là thấp lên cao.
- Để tính được thời gian thì trước khi phát 8 xung ta bật timer1 đồng thời tắt ngắt ngoài vì để tránh tình trạng truyền trực tiếp từ phát sang thu, khi phát xong thì ta mới bật ngắt. Khi có tín hiệu đưa về chân thu thì ta dùng lệnh get_timer1 để tính thời gian.
Ở đây thời gian mỗi lần tràn là 65ms nên giá trị timer1 được tính như sau( pic dùng tần số 12Mhz): timer= 4*(65536-16786)*1/3us=65000us=65ms, vậy giá trị được đưa timer1 là 16786. Do đó khi dùng lệnh get_time để lấy thời gian thì thời gian thật phải được trừ cho 16786. vậy time = timer1-16786
Vì tần số của PIC là 12Mhz nên tần số mỗi chu kỳ lệnh là 12/4. Vì mình mặc định cho timer1 là T1_DIV_BY_4 nên tần số của mỗi lần đếm lên là 12/4/4 bằng 12/16.
Vì vận tốc tính bằng m, thời gian tính bằng us nên đổi ra cm thì ta phải chia cho 10000.
Áp dụng công thức s=(v*t)/2 ta được như sau:
s=(340*time)/(12/16*2*10000)= time/44.
Do trễ thời gian của tín hiệu tính từ chân nhận của cảm biến thu tới chân ngắt RB0 và các lệnh trong chương trình nên ta phải cân chỉnh lại con số 44 thành 59 ( kết quả dựa vào đo thực tế). vậy s=time/59.

Kết quả:
Mình có gửi đính kèm cho các bạn dạng sóng của chuỗi 8 xung ở chân phát. Dạng sóng thu được ở chân thu của cảm biến siêu âm khi vật cản ở gần và xa.
Dạng sóng sau khi qua mạch so sánh điện áp. Nhìn dạng sóng thì ta thấy đây là sóng vuông khá là tốt. Dựa vào sóng vuông này mà mình có thể tính được thời gian dựa vào ngắt.
Mình đã làm mạch thật và hiển thị được lên LCD. Khoảng cách đo tốt nhất là từ 5cm tới 40cm. Khi nào mình quay video đưa lên.
Nếu các bạn muốn dùng nhiều module thì các bạn cứ dùng ngắt ngoài và ngắt trên các chân RB4 đến RB7.
Hiện mình đang làm đồ án về cảm biến siêu âm và làm được những gì thì mình đưa lên cho các bạn tham khảo. Các bạn có ý kiến thì nêu ra để mình giải đáp ( nếu được). Khi đưa ý kiến thì các bạn pm cho mình qua mail là dinhvanphuc08dt4@gmail.com để mình biết vì mình bận nên ko lên được diễn đàn. các bạn thông cảm vì sự bất tiện này.
Chúc các bạn làm mạch tốt.

Code:
#include <16F877A.h>
#include <def_877a.h>
#use delay(clock=12000000)
#include <LCD_LIB.c>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT

int8 j=0,s1=0;
int1 sta=0;
int16 time,v=340, s = 0;
//float32 s=0;
void hienthi()
{
lcd_gotoxy(7,1);
printf(lcd_putc," ");
delay_ms(1);
lcd_gotoxy(7,1);
printf(lcd_putc,"%d cm", s1);
delay_ms(300);
}
#INT_EXT
void ngat_RB()
{
time=get_timer1();
disable_interrupts(INT_EXT_L2H);
sta=1;
}

#int_timer1
void TIMER1_isr()
{
disable_interrupts(INT_EXT_L2H);
set_timer1(16786);
for(j=0;j<8;j++)
{
RE2=1;
delay_us(11);
RE2=0;
delay_us(11);
}
delay_us(10);
enable_interrupts(INT_EXT_L2H);
}

void main()
{
set_tris_b(0xff);
set_tris_d(0x00);
set_tris_e(0x00);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
set_timer1(16786);//timer= 4*(65536-16786)*1/3us=65000us=65ms
enable_interrupts(int_timer1);
enable_interrupts(global);

LCD_init();
delay_ms(100);
Printf(LCD_putc,"DIST = %d cm", s1);
delay_ms(100);

while (TRUE)
{
if(sta==1)
{
s = time-16786;
s1 = s/59;
hienthi();
sta=0;
}
}
}

chocolet_90 26-02-2013 04:56 PM

Anh ơi em có làm cái đồ án lien quan điến cảm biến siêu âm đo khoảng cách .Niên anh có thể cho em xin các file bài làm của anh được không ? Thank you nhiều nhé (congquynh08@gmail.com)

vcuongqt 15-12-2013 08:49 PM

anh oi the cho em hoi thiet ke lam trinh no cho ro bot bay ko nguoi lai tranh vat can thi lam the nao? anh co bai nao lien quan den no ko cho e xin voi a, mail: vcuongqt@gmail.com cam on a truoc nha.

viet0909 06-06-2016 12:00 PM

anh ơi có cái đồ án về cảm ứng chống trộm xe máy không ạ. Cho em xin file đấy với được không ạ Em cám ơn a nhiều (mail : anhviet.dtvt@gmail.com)


Múi giờ GMT. Hiện tại là 03:59 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam