PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cảm biến (http://www.picvietnam.com/forum/forumdisplay.php?f=18)
-   -   Cảm biến siêu âm (http://www.picvietnam.com/forum/showthread.php?t=78)

picthanh 28-03-2008 02:50 PM

SRF05 + PIC16F877A do khoảng cách
 
em đang dùng SRF05 + PIC16F877A do khoảng cách nhưng công lực còn yếu quá mong các bác có công lực thâm hậu chỉ em với .
về phần cứng cụ thể như sau : con srf05 có hai chế độ hoạt động đó là :
-MOde1 : kết nối 2 chân trigger và echo vào 2 chân i/o của VDK
-Mode2 : sử dụng chân của VDK để gửi tín hiệu trigger và nhận tín hiệu echo từ con srf05
em sư dụng chế độ Mode 2.kết nối chân RB0 với chân trigger/echo của con srf05. trên con srf05 chân mode nối với GND (0v).

em dùng timer 1 để đếm độ rộng xung echo do con srf05 gởi phản hồi.
sau đó lấy độ rộng xung/ 72 để đổi khoang cách tính toán ra đơn vị cm.
đây là code của em , các bác xem qua chỉ em giúp em chỗ nào ko ổn.
Code:

#include "D:\PIC PROGRAM\16F877A\SRF05\main.h"
#include <LCD.C>

#define TrgEch        RB0
#define TrgDir        TRISB0


unsigned int value=0;

int get_srf05(void);
void outlcd(unsigned int kcach);
void setup(void);

/*
#int_EXT
void  EXT_isr(void)
{

}

*/

void main()
{

  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(SPI_SS_DISABLED);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
  lcd_init();
  setup();
//  enable_interrupts(INT_EXT);
//  enable_interrupts(GLOBAL);
     
  while (1)
  {

    value=get_srf05();
//    printf("\n\rvalue= %u",value);
   
    outlcd(value);
      TMR1H = 0;                // 52mS delay - this is so that the srf05 ranging is not too rapid
      TMR1L = 0;        // and the previous pulse has faded away before we start the next one
      T1CON = 0x21;                    // 1:4 prescale and running
      TMR1IF = 0;
      while(!TMR1IF);                  // wait for delay time
      TMR1ON = 0;                      // stop timer 
  }

}

unsigned int get_srf05(void)
{
  TMR1H = 0xff;                        // prepare timer for 10uS pulse
  TMR1L = -14;
  T1CON = 0x21;                        // 1:4 prescale and running
  TMR1IF = 0;
  TrgDir = 0;        //TRISB=0                  // make trigger/echo pin an output 
  TrgEch = 1;        //RB0=1                  // start trigger pulse
  while(!TMR1IF);                    // wait 10uS
  TrgEch = 0;        //RB0=0;                  // end trigger pulse
  TMR1ON = 0;                          // stop timer
  TrgDir = 1;        //TRISB=0;                  // make trigger/echo pin an input
     
  TMR1H = 0;                          // prepare timer to measure echo pulse
  TMR1L = 0; 
  T1CON = 0x20;                        // 1:4 prescale but not running yet
  TMR1IF = 0;
  while(!TrgEch && !TMR1IF);            // wait for echo pulse to start (go high)
  TMR1ON = 1;                          // start timer to measure pulse
  while(TrgEch && !TMR1IF);  //Wait RB0=0        // wait for echo pulse to stop (go low)
  TMR1ON = 0;                          // stop timer
  TrgDir = 0;                //TRISB=0          // make trigger/echo pin an output again 
  return (TMR1H<<8)+TMR1L;            // TMR1H:TMR1L contains flight time of the pulse in 0.8uS units
}

void outlcd(unsigned int kcach)
{
  unsigned char tram=0,chuc=0,donvi=0;
  unsigned int ra=0;
  ra=kcach/72;
  lcd_gotoxy(1,1);
  tram=ra/100+48;lcd_putc(tram);
  chuc=(ra%100/10)+48;lcd_putc(chuc);
  donvi=(ra%100%10)+48;lcd_putc(donvi);
}

void setup(void)
{
unsigned long x;

  PORTB = 0xfe;                  // RB0 (trig) is output
  TRISB = 0xfe;                  // and starts low

  TRISC = 0xff;
  PORTC = 0xff;

  SSPSTAT = 0x80;
  SSPCON = 0x38;
  SSPCON2 = 0x00;
  SSPADD = 50;                  // SCL = 91khz with 20Mhz Osc

///  for(x=0; x<300000L; x++);      // wait for LCD03 to initialise     
}


đây là file main.h
Code:

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                      //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT              //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

// register definitions

#define W 0
#define F 1

// register files
#byte INDF          =0x00
#byte TMR0          =0x01
#byte PCL          =0x02
#byte STATUS        =0x03
#byte FSR          =0x04
#byte PORTA        =0x05
#byte PORTB        =0x06
#byte PORTC        =0x07
#byte PORTD        =0x08
#byte PORTE        =0x09

#byte EEDATA        =0x10C
#byte EEADR        =0x10D
#byte EEDATH        =0x10E
#byte EEADRH        =0x10F
#byte ADCON0    =0x1F
#byte ADCON1    =0x9F
#byte ADRESH    =0x9F
#byte ADSESL    =0x9F

#byte PCLATH        =0x0a
#byte INTCON        =0x0b
#byte PIR1    =0x0c
#byte PIR2    =0x0d
#byte PIE1    =0x8c
#byte PIE2    =0x8d

#byte OPTION_REG    =0x81
#byte TRISA        =0x85
#byte TRISB        =0x86
#byte TRISC        =0x87
#byte TRISD        =0x88
#byte TRISE        =0x89

#byte EECON1        =0x18C
#byte EECON2        =0x18D

//dinh nghia timer

#byte TMR1H    =0x0F
#byte TMR1L    =0x0E
#byte T1CON    =0x10
#byte SSPSTAT  =0x94
#byte SSPCON  =0x14
#byte SSPCON2  =0x91
#byte SSPADD  =0x93
//dinh nghia bit

#bit TMR1IF      = 0x0c.0
#bit TRISB0      = 0x86.0
#bit RB0          = 0x06.0
#bit TMR1ON      = 0x10.0

em gặp fai vấn đề sau :
lcd của em em chỉ hiện giá trị 000-003, và nó dao động liên tục trong khoảng này. em cũng chưa thật hiểu cách làm việc của cảm biến siêu âm lắm,mong các bác tư vấn thêm.
bác nào giúp em với .........

jean 31-03-2008 03:43 PM

hiện tượng crosstalk
 
1 Attachment(s)
Trong giải thuật hạn chế nhiễu do hiện tượng đọc chéo của Borenstein, khi sai lệch giữa hai giá trị đọc liện tiếp trên cảm biến y (cảm biến thu tín hiệu echo do một cảm biến khác phát ra) lớn hơn T_delta thì chắc chắn đã xảy ra hiện tượng crosstalk. Tuy nhiên có một vấn đề mong các bạn trao đổi để làm sáng tỏ.

Khi sai lệch giữa hai giá trị đọc liên tiếp lớn hơn T_delta thì có crosstalk, vậy thì ta loại giá trị nào? giá trị trước hay sau? Nếu như loại giá trị sau, thì chuyện gì sẽ xảy ra khi ngay từ lần đọc đầu tiên cảm biến y đã thu được tín hiệu echo sai (do crosstalk), trong quá trình thí nghệm, vị trí các cảm biến không đổi (tức là đường đọc chéo không thay đổi). Do đó, cảm biến y sẽ liên tục nhận được tìn hiệu echo sai.(Các bạn xem hình đính kèm) Theo giải thuật này thì các giá trị đọc sau sẽ bị loại. Cảm biến y sẽ không nhận được tín hiệu echo do chính y phát ra.

falleaf 31-03-2008 08:43 PM

Trích:

Nguyên văn bởi jean (Post 15277)
Trong giải thuật hạn chế nhiễu do hiện tượng đọc chéo của Borenstein, khi sai lệch giữa hai giá trị đọc liện tiếp trên cảm biến y (cảm biến thu tín hiệu echo do một cảm biến khác phát ra) lớn hơn T_delta thì chắc chắn đã xảy ra hiện tượng crosstalk. Tuy nhiên có một vấn đề mong các bạn trao đổi để làm sáng tỏ.

Khi sai lệch giữa hai giá trị đọc liên tiếp lớn hơn T_delta thì có crosstalk, vậy thì ta loại giá trị nào? giá trị trước hay sau? Nếu như loại giá trị sau, thì chuyện gì sẽ xảy ra khi ngay từ lần đọc đầu tiên cảm biến y đã thu được tín hiệu echo sai (do crosstalk), trong quá trình thí nghệm, vị trí các cảm biến không đổi (tức là đường đọc chéo không thay đổi). Do đó, cảm biến y sẽ liên tục nhận được tìn hiệu echo sai.(Các bạn xem hình đính kèm) Theo giải thuật này thì các giá trị đọc sau sẽ bị loại. Cảm biến y sẽ không nhận được tín hiệu echo do chính y phát ra.

Tại lần đọc thứ n+1 sẽ lấy kết quả tại lần đọc thứ n để tính. Như vậy nếu xảy ra hiện tượng đọc chéo, thì loại ngay kết quả đọc thứ n. Kết quả đọc của lần đọc thứ n+1 sẽ được lấy để tính tiếp cho lần đọc thứ n+2.

Như vậy rõ ràng, không nhận kết quả nào cả. Chỉ khi nào kết quả n và n+1 khẳng định là đúng thì lúc đó ta mới khẳng định rằng n là đúng, rồi lại lấy n+1 tính tiếp cho n+2...

Cái này hiểu nó rất là vui đấy. Nếu các bạn làm xong kết quả thực nghiệm, các bạn có thể cung cấp lên cho mọi người cùng xem. Cần phải có nhiều kết quả tham khảo hơn, chứ mấy năm nay rồi F nghe nói các đồng chí làm lại vẫn chưa làm thành công.

Chúc vui

anh_gioi 25-08-2008 02:16 PM

1 Attachment(s)
mọi người ơi.
cho tớ hỏi cái mạch cảm biến này với???
cho tớ hỏi mạch này nguyên lý hoạt động của nó ?
to thay 2 con tran trên bằng A1015 và C1815 thì thấy 2 con tran này nóng lắm.
thứ hai là: khi lắp xong ,tín hiệu đầu ra luôn ở mức cao(7v) mặc dù tớ đã cách li phần thu và phát và tinh chỉnh triết áp.????
thanks very much !!!

lion 27-08-2008 09:48 AM

2 Attachment(s)
2 con tran T1 & T2 mắc theo kiểu đẩy kéo dùng nguồn ko đối xứng . Sơ đồ trên dùng loa thanh áp nên ko cần tụ xuất loa, nếu dùng loa điện động thì khi mắc vơi loa thì phải có thêm tụ ngăn dòng 1 chiều qua loa

lion 27-08-2008 09:55 AM

do tần số siêu âm cao nên dùng tụ 103 PF

anh_gioi 31-08-2008 09:03 PM

Trích:

Nguyên văn bởi lion (Post 18400)
do tần số siêu âm cao nên dùng tụ 103 PF

cám ơn cậu.
nhưng đấy là phần bên phát, nhưng khi chưa có phần phát thì phần thu ở đầu ra luôn luôn có 1 điện áp cố định??
ko hiểu tại sao???
bạn làm về siêu âm bạn có thể cho tơ ít tài liệu được ko? to đang làm cái này....
thanks!!

lion 31-08-2008 11:31 PM

1 Attachment(s)
Tầng cuối cùng of mạch thu siêu âm (N3) là mạch so sánh đảo pha .ở chế độ tĩnh (chưa có tín hiệu siêu âm ) thì đầu vào âm được nối Dương nguồn qua trở R11 (4.7M) . vì vậy đầu ra có điện áp Dương , muốn triệt điện áp này bạn chi cần hạ con trở R12 (390K) xuống còn 39K , hoặc nhỏ hơn , điều chỉnh thêm cả chiết áp VR2 nữa

chúc thành công.

anh_gioi 02-09-2008 04:42 PM

tớ hỏi câu hơi gà chút(nhưng không hỏi thì chẳng biết khi nào hiểu được)..
1.mọi người có thể chỉ bảo tớ giải thuật cách xử lý sóng siêu âm với phần điều khiển được không??? khi có sóng siêu âm vào chân điều khiển thì phần điều khiển nó sẽ xử lý thế nào để nhận biết được khoảng cách?
2. tín hiệu ra của bộ siêu âm chỉ có 2 mức 0 và 1 à?

lion 02-09-2008 05:17 PM

1 Attachment(s)
tài liệu siêu âm :

anh_gioi 25-09-2008 06:50 PM

Các bác cho em hỏi :
Trích:

#define SRF05_IN PIN_C2
#define SRF05_OUT PIN_C3

// Clockrate/(4 clocks per instruction * T1_DIV_BY_4) * 1000000 us per second
#define CONVERT_TO_MICROSECONDS (20000000/((4*4)*1000000))

//
// The way the srf05 works is that we send it a 10 us high pulse it then sends
// out does it's mojo. Then it reports back a high pulse telling you how long
// the ultrasonic echo took. Divide that by a magic 148 and you convert that
// time into inches.
//

int16 ultrasonic_checkDepth()
{
int16 time;

output_high(SRF05_IN);
delay_us(10);
output_low(SRF05_IN);

setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);

while(!input(SRF05_OUT)) {} // Wait for senser output to go high;

set_timer1(0);
while(input(SRF05_OUT)) {}

time = get_timer1();

time = time/CONVERT_TO_MICROSECONDS;

if(time >= 240000)
{
// No object found
return 0;
}
else
{
return time/148; // convert time into inches
}
}

nghĩa là khi ban đầu tắt time để dò tìm vật cản, sau khi xác định được vật cản thì bật timer . có phải không ạ??

thứ 2 em hỏi LCD03 là LCD1602 à? hay nó là loại nào???

anh_gioi 26-09-2008 04:47 PM

Trích:

Nguyên văn bởi picthanh (Post 15219)
em đang dùng SRF05 + PIC16F877A do khoảng cách nhưng công lực còn yếu quá mong các bác có công lực thâm hậu chỉ em với .
về phần cứng cụ thể như sau : con srf05 có hai chế độ hoạt động đó là :
-MOde1 : kết nối 2 chân trigger và echo vào 2 chân i/o của VDK
-Mode2 : sử dụng chân của VDK để gửi tín hiệu trigger và nhận tín hiệu echo từ con srf05
em sư dụng chế độ Mode 2.kết nối chân RB0 với chân trigger/echo của con srf05. trên con srf05 chân mode nối với GND (0v).

em dùng timer 1 để đếm độ rộng xung echo do con srf05 gởi phản hồi.
sau đó lấy độ rộng xung/ 72 để đổi khoang cách tính toán ra đơn vị cm.
đây là code của em , các bác xem qua chỉ em giúp em chỗ nào ko ổn.
Code:

#include "D:\PIC PROGRAM\16F877A\SRF05\main.h"
#include <LCD.C>

#define TrgEch        RB0
#define TrgDir        TRISB0


unsigned int value=0;

int get_srf05(void);
void outlcd(unsigned int kcach);
void setup(void);

/*
#int_EXT
void  EXT_isr(void)
{

}

*/

void main()
{

  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(SPI_SS_DISABLED);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
  lcd_init();
  setup();
//  enable_interrupts(INT_EXT);
//  enable_interrupts(GLOBAL);
     
  while (1)
  {

    value=get_srf05();
//    printf("\n\rvalue= %u",value);
   
    outlcd(value);
      TMR1H = 0;                // 52mS delay - this is so that the srf05 ranging is not too rapid
      TMR1L = 0;        // and the previous pulse has faded away before we start the next one
      T1CON = 0x21;                    // 1:4 prescale and running
      TMR1IF = 0;
      while(!TMR1IF);                  // wait for delay time
      TMR1ON = 0;                      // stop timer 
  }

}

unsigned int get_srf05(void)
{
  TMR1H = 0xff;                        // prepare timer for 10uS pulse
  TMR1L = -14;
  T1CON = 0x21;                        // 1:4 prescale and running
  TMR1IF = 0;
  TrgDir = 0;        //TRISB=0                  // make trigger/echo pin an output 
  TrgEch = 1;        //RB0=1                  // start trigger pulse
  while(!TMR1IF);                    // wait 10uS
  TrgEch = 0;        //RB0=0;                  // end trigger pulse
  TMR1ON = 0;                          // stop timer
  TrgDir = 1;        //TRISB=0;                  // make trigger/echo pin an input
     
  TMR1H = 0;                          // prepare timer to measure echo pulse
  TMR1L = 0; 
  T1CON = 0x20;                        // 1:4 prescale but not running yet
  TMR1IF = 0;
  while(!TrgEch && !TMR1IF);            // wait for echo pulse to start (go high)
  TMR1ON = 1;                          // start timer to measure pulse
  while(TrgEch && !TMR1IF);  //Wait RB0=0        // wait for echo pulse to stop (go low)
  TMR1ON = 0;                          // stop timer
  TrgDir = 0;                //TRISB=0          // make trigger/echo pin an output again 
  return (TMR1H<<8)+TMR1L;            // TMR1H:TMR1L contains flight time of the pulse in 0.8uS units
}

void outlcd(unsigned int kcach)
{
  unsigned char tram=0,chuc=0,donvi=0;
  unsigned int ra=0;
  ra=kcach/72;
  lcd_gotoxy(1,1);
  tram=ra/100+48;lcd_putc(tram);
  chuc=(ra%100/10)+48;lcd_putc(chuc);
  donvi=(ra%100%10)+48;lcd_putc(donvi);
}

void setup(void)
{
unsigned long x;

  PORTB = 0xfe;                  // RB0 (trig) is output
  TRISB = 0xfe;                  // and starts low

  TRISC = 0xff;
  PORTC = 0xff;

  SSPSTAT = 0x80;
  SSPCON = 0x38;
  SSPCON2 = 0x00;
  SSPADD = 50;                  // SCL = 91khz with 20Mhz Osc

///  for(x=0; x<300000L; x++);      // wait for LCD03 to initialise     
}


đây là file main.h
Code:

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                      //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT              //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

// register definitions

#define W 0
#define F 1

// register files
#byte INDF          =0x00
#byte TMR0          =0x01
#byte PCL          =0x02
#byte STATUS        =0x03
#byte FSR          =0x04
#byte PORTA        =0x05
#byte PORTB        =0x06
#byte PORTC        =0x07
#byte PORTD        =0x08
#byte PORTE        =0x09

#byte EEDATA        =0x10C
#byte EEADR        =0x10D
#byte EEDATH        =0x10E
#byte EEADRH        =0x10F
#byte ADCON0    =0x1F
#byte ADCON1    =0x9F
#byte ADRESH    =0x9F
#byte ADSESL    =0x9F

#byte PCLATH        =0x0a
#byte INTCON        =0x0b
#byte PIR1    =0x0c
#byte PIR2    =0x0d
#byte PIE1    =0x8c
#byte PIE2    =0x8d

#byte OPTION_REG    =0x81
#byte TRISA        =0x85
#byte TRISB        =0x86
#byte TRISC        =0x87
#byte TRISD        =0x88
#byte TRISE        =0x89

#byte EECON1        =0x18C
#byte EECON2        =0x18D

//dinh nghia timer

#byte TMR1H    =0x0F
#byte TMR1L    =0x0E
#byte T1CON    =0x10
#byte SSPSTAT  =0x94
#byte SSPCON  =0x14
#byte SSPCON2  =0x91
#byte SSPADD  =0x93
//dinh nghia bit

#bit TMR1IF      = 0x0c.0
#bit TRISB0      = 0x86.0
#bit RB0          = 0x06.0
#bit TMR1ON      = 0x10.0

em gặp fai vấn đề sau :
lcd của em em chỉ hiện giá trị 000-003, và nó dao động liên tục trong khoảng này. em cũng chưa thật hiểu cách làm việc của cảm biến siêu âm lắm,mong các bác tư vấn thêm.
bác nào giúp em với .........

bạn này ơi, bạn làm siêu âm này đến đâu rồi, cậu dùng ccs lập trình cho nó à? nếu được rồi chỉ tớ vơi, thank!

ngoductho 05-11-2008 06:18 PM

e cần một số tài liệu về các loại cảm biến nhưng e kiếm ko được! mong mọi người cho e link dowload.e cảm ơn!

manhha2799 05-11-2008 06:47 PM

1 Attachment(s)
Đây là code cảm biến siêu âm, lâu quá mình ko nhớ tải ở đâu bạn xem thử nhé, được thì bấm phát cảm ơn nhé

Nguyenbinhdk3 29-11-2008 07:19 AM

các bạn có thể giúp mình cái này được ko?"mạch cảm biến vị trí sử dụng sóng siêu âm". Thầy cho cái đề mà mình chưa biết làm thế nào? Có bạn nào biết chỉ giáo giùm nha. Thanks nhiều!


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

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