PIC Vietnam

Go Back   PIC Vietnam > Robotics > Cảm biến

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

Cảm biến Camera, siêu âm, hồng ngoại, gyro, la bàn...

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 17-11-2012, 07:07 PM   #1
dinhvanphuc
Đệ tử 2 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 32
:
[Tutorial] Hướng dẫn đo khoảng cách bằng sóng siêu âm với module tự làm

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;
}
}
}
Hình Kèm Theo
File Type: jpg Picture0682.jpg (366.1 KB, 289 lần tải)
File Type: jpg Picture0692.jpg (329.4 KB, 179 lần tải)
File Type: jpg Picture0689.jpg (392.0 KB, 118 lần tải)
File Type: jpg 121114-1602.jpg (420.9 KB, 123 lần tải)
File Type: jpg 121114-1603.jpg (401.0 KB, 128 lần tải)
File Kèm Theo
File Type: rar so do mach.rar (10.2 KB, 663 lần tải)
dinhvanphuc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam