PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cảm biến (http://www.picvietnam.com/forum/forumdisplay.php?f=18)
-   -   bài tập cảm biến đo khoảng cách sử dụng siêu âm (http://www.picvietnam.com/forum/showthread.php?t=3832)

longdv 09-11-2010 10:46 PM

mọi ngừoi cho em hỏi với.
em có mua 1 con cảm biến siêu âm loai GH 311RT như anh phamdinh vừa nói trên nhưng chưa biết cách sài
em đưa tín hiệu trả về vào chân ADC của AVR thì thấy
khi di chuyển vật cản thì gtri ADC nhãy lung tung hết, con khi vật cản đứng im thì ADC về o
em ko biết dùng như thế nào hết

mọi người giúpp em với

fidel 20-11-2010 07:27 PM

bạn longdv đưa sơ đồ nối hay code lên thì mọi người mới giúp được chứ.

khanhdat 08-05-2011 07:22 AM

Em đang có 1 đồ án đo dung tích bể nước sử dụng sensor siêu âm SRF05. bác nào biết thì chỉ dùm em với
Em có tìm hiểu code và mạch nguyên lý ở đây, em copy về mà nó không chạy gì cả. bác nào biết thì chỉ cho em nha.
http://www.mediafire.com/?fwwkyqsc68clbpb
http://www.mediafire.com/?aobhrdjhw2l4kod
cám ơn nhiều!

hanguyenhuy 30-06-2011 10:24 PM

Trích:

Nguyên văn bởi khanhdat (Post 44816)
Em đang có 1 đồ án đo dung tích bể nước sử dụng sensor siêu âm SRF05. bác nào biết thì chỉ dùm em với
Em có tìm hiểu code và mạch nguyên lý ở đây, em copy về mà nó không chạy gì cả. bác nào biết thì chỉ cho em nha.
http://www.mediafire.com/?fwwkyqsc68clbpb
http://www.mediafire.com/?aobhrdjhw2l4kod
cám ơn nhiều!

Mình cũng đang làm đề tài dùng cảm biến siêu âm. Lúc trước mình lập trình mỗi con siêu âm dùng 1 chân ccp nên bị giới hạn cảm biến vì pic chỉ có 2 chân ccp thôi. Sai số vào khoảng ~0.5cm. Hiện giờ mình đã lập trình được dùng tới 5 con cho 1 chân CCP. Chạy ok hết roài.

phatcddt08a 09-08-2011 12:08 PM

ban lam nhu the nao ma rong ccp ra vay .goi y ty di ban

hocavr 29-09-2011 08:45 PM

Bạn thử dùng SRF05 xem, cái này mình đã rồi, nhưng mình dùng AVR, chuyển sang PIC cũng dễ thôi. Bạn đặt 2 mốc thời gian : t1 ( bắt đầu phát ), t2 ( khi thu được ), trong datasheet của SRF05 có hướng dẫn đầy đủ cách tính quãng đường của sóng siêu âm đi và về. Mình thấy SRF05 có bán tại đại lý của Microchip miền bắc. Bạn thử tham khảo xem. Chúc vui vẻ

nghiavp07 06-10-2011 08:43 PM

Mình có mua ở Nhật Tảo cảm biến siêu âm GH-311RT nhưng con này chỉ có 3 chân (nên không phát tín hiệu bằng tay được).Mình lên mạng tìm cách phát và thu tín hiệu con này nhưng không thấy.Bạn nào đã từng làm việc với con này có thể giúp mình về nguyên lý hoạt động của nó được không.

ngochoicd112 06-10-2011 08:49 PM

Trích:

Nguyên văn bởi hanguyenhuy (Post 46511)
Mình cũng đang làm đề tài dùng cảm biến siêu âm. Lúc trước mình lập trình mỗi con siêu âm dùng 1 chân ccp nên bị giới hạn cảm biến vì pic chỉ có 2 chân ccp thôi. Sai số vào khoảng ~0.5cm. Hiện giờ mình đã lập trình được dùng tới 5 con cho 1 chân CCP. Chạy ok hết roài.

Ban cố thể post code cho mọi người tham khảo được không? mình cũng đang quan tâm tới cái này. THANKS bạn trước

hocavr 11-10-2011 05:13 PM

Bạn có thể dùng cảm biến SRF05 là được, 15m thì mình chưa đo đến nhưng 14 m thì ok. Sai số đúng ý bạn đấy. con này có thể mua được tại Hà Nội. mình tìm thấy trang này http:\\techpal.vn hơi đắt một tý, nhưng giải quyết được bài toán của bạn. ở đấy mình thấy cũng có cả các Kit xài được cho SRF05 đấy. Thử ngó qua xem.

lhhsach 21-10-2011 02:56 PM

hi mọi người, mình đang cần làm 1 thiết bị đo khoảng cách dùng cảm biến siêu âm. Xin mọi người hướng dẫn giúp 1 vài điều vướng mắc:
1. để xác định độ phân giải, sai số của cb thì dựa theo số liệu nào trong Datasheet của nó.
2. dùng VDK có thể đạt được sai số khoảng dưới 1cm không.
Rất cần sự giúp đỡ của mọi người. Thanks!!!

kimvothan 18-11-2012 07:00 PM

huynh nào giúp mình sữa lỗi đoạn code này được không? mình lập trình dở lắm, giờ đụng phải lỗi này, em không biết sửa lỗi sao cho xuất giá trị đo được ra lcd hết. cảm ơn các huynh nhiều nhé!
#include <16F877A.h>
#include <math.h>

// Dinh nghia cac thong so.

// Cau hinh su dung dao dong noi 4MHz
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)

// Khai bao ham.
void lcd_init(void); // Ham dung de khoi dong C.LCD.
byte lcd_read_byte(void); // Ham xu ly doc thong tin (dang 8 bit) tu thong tin dang 4 bit tu C.LCD.
byte lcd_read_nibble(void); // Ham doc thong tin (dang 4 bit / nibble) tu C.LCD.
void lcd_send_byte(byte address, byte n); // Ham gui thong tin (byte) toi C.LCD tai dia chi (address).
void lcd_send_nibble(byte n); // Ham gui thong tin (dang 4 bit / nibble) sang C.LCD.
void lcd_gotoxy(byte x, byte y); // Ham thiet lap vi tri ghi tren C.LCD.
char lcd_getc(byte x, byte y); // Ham tra ve ky tu tai vi tri (x,y) tren C.LCD.
void lcd_putc(char c); // Ham se hien thi ky tu c tai vi tri ke tiep tren C.LCD.
void convert_bcd(int8 v);
// Khai bao bien.

// Khai bao du lieu hien thi.
// Khai bao du lieu hien thi.
CONST char dat_line1[] = "KHOANG CACH DO :"; // Noi dung can hien thi - Hang 1.
//CONST char dat_line2[] = "Designed by: PQT"; // Noi dung can hien thi - Hang 2.
// Chuong trinh chinh.
void main (void)
{
// Khai bao bien.
int8 x,v,s;
int16 t;
unsigned int8 i;
// Chuong trinh.
lcd_init(); // Khoi dong C.LCD 2x16.
for(i=1;i<=16;i++)
{
lcd_gotoxy(i,1); // Xac dinh toa do hien thi cho hang 1.
lcd_putc(dat_line1[i-1]); // Lay ky tu hien thi tu chuoi 1 dua len C.LCD.
// lcd_gotoxy(i,2); // Xac dinh toa do hien thi cho hang 2.
//lcd_putc(dat_line2[i-1]); // Lay ky tu hien thi tu chuoi 2 dua len C.LCD.
}
//convert_bcd(v);
//-- khai bao timer-capture ----
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1);
// Setup interrupt on falling edgeenable_interrupts(GLOBAL);
set_tris_b(0);
set_tris_c(0);
while(true)
{
//---- 10uS cho trgger ----
output_high(pin_c1);
delay_us(10);
output_low(pin_c1);
//-- Wait for senser output to go high ----
}
if(input(pin_c2)==0)
{
t = 0;
set_timer1(0);
lcd_gotoxy(2,7);
lcd_putc("KHONG");
}
else
{
t = CCP_1;
//doc thoi gian khi co xung cao
v = t/58;
convert_bcd(v);
//time = get_timer1();
lcd_gotoxy(2,8);
lcd_putc("CO");
//time = time/CONVERT_TO_MICROSECONDS;
//chuyen doi ra mcrogiay
}
///// hien thi len gia tri LCD//////

lcd_gotoxy(2,7);
lcd_getc(nghin);
lcd_gotoxy(2,8);
lcd_getc(tram);
lcd_gotoxy(2,9);
lcd_getc(chuc);
lcd_gotoxy(2,10);
lcd_getc(donvi);
}

// Dinh nghia cac thong so.
typedef struct
{ // Cau truc nay duoc ap dung len cho mot cong I/O de ho tro viec
boolean rs; // truy xuat den cac chan cua C.LCD.
boolean rw; //
boolean enable; // Cac bit nay duoc xac dinh vi tri tu thap den cao.
boolean unused; // RS se dong vai tro la chan LSB cua cong I/O do.
int data:4; //
} LCD_PIN_MAP; // Cong I/O duoc su dung o day se la LCD_DATA_PORT.

#define LCD_DATA_PORT getenv("SFR:PORTD") // Port D duoc su dung de giao tiep C.LCD.
//#define LCD_DATA_PORT 0x08
#define set_tris_lcd(x) set_tris_D(x) // Lenh dieu khien trang thai port giao tiep.

#define lcd_output_enable(x) lcdlat.enable=x // Lenh dieu khien chan LCD_ENABLE_PIN.
#define lcd_enable_tris() lcdtris.enable=0

#define lcd_output_rs(x) lcdlat.rs=x // Lenh dieu khien chan LCD_RS_PIN.
#define lcd_rs_tris() lcdtris.rs=0

#define lcd_output_rw(x) lcdlat.rw=x // Lenh dieu khien chan LCD_RW_PIN
#define lcd_rw_tris() lcdtris.rw=0

#define lcd_line_one 0x00 // Dia chi RAM C.LCD cho hang thu 1.
#define lcd_line_two 0x40 // Dia chi RAM C.LCD cho hang thu 2.

#define LCD_TYPE 0x02 // Thong tin cau hinh C.LCD: 0x00=5x7, 0x01=5x10, 0x02=2 lines

// Dinh nghia cac hang so.
byte const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0x0C, 0x01, 0x06};
// Cac byte nay can thiet de gui toi C.LCD, dung de khoi dong cau hinh hoat dong cho C.LCD.
// Byte 1: 0x20 | (LCD_TYPE << 2) - So bit du lieu giao tiep (DL), so dong hien thi (N), kieu ky tu (F).
// 0 0 1 DL N F x x (DL: Data Length, N: Number Line, F: Font).
// Truong hop 1: 0x20 - 4 bit / 1 dong / 5 x 7.
// Truong hop 2: 0x24 - 4 bit / 1 dong / 5 x 10.
// Truong hop 3: 0x28 - 4 bit / 2 dong / 5 x 7.
// Byte 2: 0x0C - Dieu khien hien thi (Bat hien thi, tat con tro, tat nhap nhay con tro).
// 0 0 0 0 1 D C B (D: Display, C: Cursor, B: Blink).
// Byte 3: 0x01 - Xoa hien thi va tra con tro ve dau dong.
// Byte 4: 0x06 - Dat che do dau vao (Che do tang dia chi, tat dich chuyen hien thi).
// 0 0 0 0 0 1 I/D S (I/D: Increment/Decrement, S: Shift).
// Byte 5: .... - Doi con tro / hien thi.
// 0 0 0 1 S/C R/L x x (S/C: Screen/Cursor, R/L: Right/Left).

LCD_PIN_MAP lcd, lcdlat;
#byte lcd = LCD_DATA_PORT
#byte lcdlat = LCD_DATA_PORT

// RS, RW, EN, UNUSED, DATA.
const LCD_PIN_MAP LCD_OUTPUT_MAP = {0, 0, 0, 0, 0};
const LCD_PIN_MAP LCD_INPUT_MAP = {0, 0, 0, 0, 0xF};
// Cac dinh nghia nay chi can de dieu chinh cho cac dong PIC PCB (baseline PICs).
// tat ca cac dong PIC khac su dung LCD_PIN_MAP hoac cac dinh nghia chan LCD_xxx rieng biet.

// ************************************************** *
void lcd_init(void) // Ham dung de khoi dong C.LCD.
{
// Khai bao bien.
byte i;
// Dinh nghia ham.
set_tris_lcd(LCD_OUTPUT_MAP); // Thiet lap chan port (Data) o che do ngo ra.
// Thiet lap chan port (Control: EN, RS, RW) o che do ngo ra.
lcd_output_rs(0); // RS = 0 - Databus = Bus lenh.
lcd_output_rw(0); // RW = 0 - Ghi thong tin vao C.LCD.
lcd_output_enable(0); // EN = 0 - Cam truy xuat C.LCD.

delay_ms(15); // Tao thoi gian tre 15ms (Thoi gian de LCD tu reset khi moi duoc cap nguon).

for(i=1;i<=3;i++) // Doan lenh khoi dong C.LCD o che do 8 bit duoc thuc hien 3 lan lien tiep
{ // tai thoi diem ban dau (de dam bao cho C.LCD hoat dong on dinh trong
lcd_send_nibble(0x03); // truong hop khi cung cap nguon cho C.LCD ma dien ap nguon tang len cham).
delay_ms(5); // RS = 0, RW = 0, D7 - D4 = 0011 (0x03) -> DL = 1 (8 bit).
} // Do co BF (Busy Flag) chua kiem tra duoc trong thoi diem nay, nen phai
// thuc hien 3 lan (xem luu do khoi dong C.LCD cua nha san xuat).

lcd_send_nibble(0x02); // Doan lenh khoi dong C.LCD o che do 4 bit. Tu luc nay thi 4 bit cao duoc ghi
// ra truoc tien, sau do la 4 bit thap.
// RS = 0, RW = 0, D7 - D4 = 0010 (0x02) -> DL = 0 (4 bit).
// Co BF (Busy Flag) co the bat dau kiem tra duoc tu luc nay.

for(i=0;i<=3;i++)
lcd_send_byte(0,LCD_INIT_STRING[i]); // Goi ham truyen thong tin (lenh) sang C.LCD.
} // Lenh: Thiet lap cau hinh hoat dong cho C.LCD.

// ************************************************** *
byte lcd_read_byte(void) // Ham xu ly doc thong tin (dang 8 bit) tu thong tin dang 4 bit tu C.LCD.
{
// Khai bao bien.
byte low,high;
// Dinh nghia ham.
set_tris_lcd(LCD_INPUT_MAP); // Thiet lap chan port o che do ngo vao.

lcd_output_rw(1); // RW = 1 - Doc thong tin tu C.LCD.
// Tien hanh doc 4 bit cao cua thong tin tu C.LCD.
delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz).
lcd_output_enable(1); // EN = 1 - Cho phep truy xuat C.LCD.
delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz).
high = lcd_read_nibble(); // Cat tam 4 bit du lieu (4 bit cao).
lcd_output_enable(0); // EN = 0 - Cam truy xuat C.LCD.
// Tien hanh doc 4 bit thap cua thong tin tu C.LCD.
delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz).
lcd_output_enable(1); // EN = 1 - Cho phep truy xuat C.LCD.
delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz).
low = lcd_read_nibble(); // Cat tam 4 bit du lieu (4 bit thap).
lcd_output_enable(0); // EN = 0 - Cam truy xuat C.LCD.

set_tris_lcd(LCD_OUTPUT_MAP);; // Thiet lap chan port o che do ngo ra.

return((high<<4) | low); // Tra ve ket qua du lieu (dang 8 bit).
}

// ************************************************** *
byte lcd_read_nibble(void) // Ham doc thong tin (dang 4 bit / nibble) tu C.LCD.
{
// Khai bao bien.

// Dinh nghia ham.
return(lcd.data); // Doc thong tin tu bus du lieu.
} // Tra ve ket qua doc duoc (data = 0000 xxxx).

// ************************************************** *
void lcd_send_byte(byte address, byte n) // Ham gui thong tin (byte) toi C.LCD tai dia chi (address).
{ // address = 0: Lenh / 1: Du lieu.
// byte = Thong tin can gui (8 bit).
// Khai bao bien.

// Dinh nghia ham.
lcd_output_rs(0); // RS = 0 - Databus = Bus lenh.
while(bit_test(lcd_read_byte(),7)); // Cho Busy Flag = 0 (C.LCD da xu ly xong).
lcd_output_rs(address); // RS = address - Databus = Bus lenh/du lieu.
delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz).
lcd_output_rw(0); // RW = 0 - Ghi thong tin vao C.LCD.
delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz).
lcd_output_enable(0); // EN = 0 - Cam truy xuat C.LCD.
lcd_send_nibble(n >> 4); // Goi ham truyen 4 bit cao sang C.LCD.
lcd_send_nibble(n & 0x0F); // Goi ham truyen 4 bit thap sang C.LCD.
}

// ************************************************** *
void lcd_send_nibble(byte n) // Ham gui thong tin (dang 4 bit / nibble) sang C.LCD.
{ // n = Thong tin can gui. 4 bit can gui phai nam vi tri 4 bit thap.
// Khai bao bien.

// Dinh nghia ham.
lcdlat.data = n; // Xuat thong tin len bus du lieu.

delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz).
lcd_output_enable(1); // Tao xung ghi thong tin vao C.LCD.
delay_us(2); // Tao tre 2 chu ky (t=2us voi fosc=4MHz).
lcd_output_enable(0); // Tao xung ghi thong tin vao LCD - EN = 1->0 (High to Low).
}

// ************************************************** *
void lcd_gotoxy(byte x, byte y) // Ham thiet lap vi tri ghi tren C.LCD (Goc tren ben trai co toa do la 1,1).
{
// Khai bao bien.
byte address;
// Dinh nghia ham.
if(y!=1) // Kiem tra vi tri truy xuat thuoc hang 2.
address=lcd_line_two; // Nap dia chi RAM cua hang 2.
else // Neu vi tri truy xuat thuoc hang 1.
address=lcd_line_one; // Nap dia chi RAM cua hang 1.

address+=x-1; // Ghep dia chi cot vao dia chi tong quat (address). address = address + (x-1).
// Ta qui uoc: Goc tren ben trai co toa do la 1,1 -> Cot dau tien la Cot 1
// (x-1) vi C.LCD qui uoc cot dau tien co dia chi la 0.
lcd_send_byte(0,0x80|address); // Goi ham truyen thong tin (lenh) sang C.LCD.
} // Lenh: Thiet lap dia chi DDRAM cua C.LCD (addresss).

// ************************************************** *
char lcd_getc(byte x, byte y) // Ham tra ve ky tu tai vi tri (x,y) tren C.LCD.
{
// Khai bao bien.
char value;
// Dinh nghia ham.
lcd_gotoxy(x,y); // Xac dinh toa do C.LCD can truy xuat.
while(bit_test(lcd_read_byte(),7)); // Cho Busy Flag = 0 (C.LCD da xu ly xong).
lcd_output_rs(1); // RS = 1 - Databus = Bus du lieu.
value = lcd_read_byte(); // Doc ve tu C.LCD.
lcd_output_rs(0); // RS = 0 - Databus = Bus lenh.

return(value); // Tra ve ma ky tu tai toa do yeu cau.
}

// ************************************************** *
void lcd_putc(char c) // Ham se hien thi ky tu c tai vi tri ke tiep tren C.LCD.
{
// Khai bao bien.

// Dinh nghia ham.
switch (c)
{
case '\f': // Chuc nang xoa hien thi.
lcd_send_byte(0,0x01); // Goi ham truyen thong tin (lenh) sang C.LCD.
delay_ms(2); // Lenh: Xoa hien thi tren man hinh C.LCD (0x01).
break;
case '\n': // Chuc nang bat dau hang thu 2.
lcd_gotoxy(1,0x02); // Goi ham truyen thong tin (du lieu) sang C.LCD.
break;
case '\b': // Chuc nang lui ve 1 vi tri.
lcd_send_byte(0,0x10); // Goi ham truyen thong tin (lenh) sang C.LCD.
break; // Lenh: Doi con tro sang trai (0x10).
default: // Chuc nang hien thi ky tu c tai vi tri ke tiep tren C.LCD.
lcd_send_byte(1,c); // Goi ham truyen thong tin (du lieu) sang C.LCD.
break;
}
}
// ************************************************** *
void convert_bcd(int8 v)
{
int8 tram,chuc,donvi,nghin;
donvi=v%10;
//chia lay phan du, so hang don vi
tram=v/100;
//tach hang tram va hang chuc
chuc=v/10%10;
nghin = v/1000;
tram = tram + 0x30;
chuc = chuc + 0x30;
donvi = donvi + 0x30;
nghin = nghin +0x30;
}
/////////

nó báo lỗi ngay chổ này này máy huynh:

///// hien thi len gia tri LCD//////

lcd_gotoxy(2,7);
lcd_getc(nghin);
lcd_gotoxy(2,8);
lcd_getc(tram);
lcd_gotoxy(2,9);
lcd_getc(chuc);
lcd_gotoxy(2,10);
lcd_getc(donvi);

kimvothan 19-11-2012 04:30 PM

mình dùng trình dịch CCS C đó, con pic 16f877a lcd 16x2 điều khiển 4bit

chocolet_90 05-01-2013 09:29 PM

anh_gioi ơi ,pạn có thể gui cho mình phần mạch luôn dc không mình đọc phần code không có mạch thì cũng chả hiểu lắm.


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

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