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)

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!

tinhgiac_vp 19-12-2008 11:43 PM

anh F trước đây làm về mobile robot hả? không biết anh có rành về automobile robot và bài toán tìm đường đi ngắn nhất cho nó không? nếu mục tiêu là cố định thì có vẻ dễ hơn, còn mục tiêu di động thì không biết sao? mong nhận được sự giúp đỡ của anh.

namnp2007 11-08-2009 09:41 AM

Tôi muốn dùng cảm biến siêu âm để giữ một khoảng cách nhất định đén một vật thể. Cụ thể là cho đầu dò tiến đến gần vật thể( khoảng cách trong vòng < 50mm, có thể dùng dẫn động bằng khí nén), có nút chỉnh để coi đó là vị trí Zero, sau đó nếu vật thể di chuyển ra khỏi vị trí đó một khoảng nào đó( khoảng này cũng do ta qui định, có thể chỉ khoảng 0.1mm) thì bộ cảm biến thông qua bỏad mạch sẽ xuất tín hiệu điều khiển cho hệ khí nén, chiều chuyển động của khi nén sẽ tuỳ thuộc vào chiều của di chuyển của vật thể( khi vật thể ra xa thì khí nén đi vào, khi vật thể lại gần thì khí nén đi ra, chủ ý là để giữ khoảng cách "Zero" không đổi). Nhờ Mr. F hoặc anh em nào có cao kiến gì thì giúp đỡ giùm với, còn nếu nhận thực hiện luôn thì rất hoan nghênh. Liên lạc lại với tôi: Ngô Phương Nam, 098 388 1845 hoặc namnp2007@gmail.com. Cám ơn.

falleaf 11-08-2009 10:55 AM

Trích:

Nguyên văn bởi namnp2007 (Post 28544)
Tôi muốn dùng cảm biến siêu âm để giữ một khoảng cách nhất định đén một vật thể. Cụ thể là cho đầu dò tiến đến gần vật thể( khoảng cách trong vòng < 50mm, có thể dùng dẫn động bằng khí nén), có nút chỉnh để coi đó là vị trí Zero, sau đó nếu vật thể di chuyển ra khỏi vị trí đó một khoảng nào đó( khoảng này cũng do ta qui định, có thể chỉ khoảng 0.1mm) thì bộ cảm biến thông qua bỏad mạch sẽ xuất tín hiệu điều khiển cho hệ khí nén, chiều chuyển động của khi nén sẽ tuỳ thuộc vào chiều của di chuyển của vật thể( khi vật thể ra xa thì khí nén đi vào, khi vật thể lại gần thì khí nén đi ra, chủ ý là để giữ khoảng cách "Zero" không đổi). Nhờ Mr. F hoặc anh em nào có cao kiến gì thì giúp đỡ giùm với, còn nếu nhận thực hiện luôn thì rất hoan nghênh. Liên lạc lại với tôi: Ngô Phương Nam, 098 388 1845 hoặc namnp2007@gmail.com. Cám ơn.

Nếu làm việc ở khoảng cách <50mm, bạn cần sử dụng cảm biến hồng ngoại, cảm biến siêu âm làm việc ở khoảng cách này cho độ chính xác không được cao lắm.

Bạn có thể thử nghiệm cảm biến hồng ngoại GP2D12 của Sharp (R&P có bán) hoặc cảm biến siêu âm SRF05 (R&P có). Nhưng giải pháp bằng hồng ngoại với bài toán của bạn có vẻ tốt hơn (đỡ tốn năng lượng hơn, kích thước nhỏ gọn hơn, độ chính xác cao hơn vì nó hoạt động trong tầm 10cm - 80cm, so với khoảng cách hoạt động của siêu âm là 1cm - 4m).

Chúc vui

namnp2007 11-08-2009 01:38 PM

@Mr. F.
Thanks, tôi sẽ liên lạc với đại lý RP tại TP HCM( ở Nguyễn Minh Hoàng phải không?).

falleaf 11-08-2009 06:09 PM

Trích:

Nguyên văn bởi namnp2007 (Post 28556)
@Mr. F.
Thanks, tôi sẽ liên lạc với đại lý RP tại TP HCM( ở Nguyễn Minh Hoàng phải không?).

Đã có trao đổi với anh, về vấn đề của anh đặt ra nếu ở mức dịch chuyển nhỏ hơn mm thì tốt nhất là sử dụng cảm biến laser, hoặc LVDT (tiếp xúc). Ngoại trừ hai loại này, thực sự là rất khó để xác định khoảng cách ở mức đó.

Cảm biến hồng ngoại hay cảm biến siêu âm thì khả năng đều thua trong vụ này.

Tham khảo thông tin về cảm biến hồng ngoại GP2D12 mà em giới thiệu tại đây:
http://document.sharpsma.com/files/G...DATA-SHEET.PDF

Khoảng cách đo từ 10cm - 80cm ứng với mức 2.6V - 0.4V. Coi như là một nửa dải đo. Nếu dùng ADC 10-bit, đo trên dải 0 - 5V. Xem như ta còn 9-bit trên nửa dải này.

9-bit tương ứng với 512 mức. Láy (80cm - 10cm)/512 mức = 700mm/512mức. Như vậy mỗi mức chỉ đo được hơn 1mm - 2mm. Như vậy không thể nào đạt được mức anh yêu cầu.

Nếu sử dụng ADC 12-bit thì có thể đo được với 11-bit, có khả năng lấy được khoảng 0.5mm (đây là tính toán giả định bằng sơ bộ trung bình, lưu ý là độ dốc của đồ thị trong datasheet là không tuyến tính). Nếu anh đo ở khoảng 45-55mm thì gần như GP2D12 chịu thua.

Do vậy, em khuyên anh không nên đi sâu vào giải pháp này, vì nó không phù hợp với yêu cầu thực tế của anh.

Chúc vui

falleaf 11-08-2009 06:18 PM

http://sensor.baumerelectric.com/pro...0AG%3C/span%3E

Sai số loại này lên tới 0.5mm (sai số tuyệt đối). Nếu cần thì em có thể tư vấn cho anh các loại sai số ở mức 0.01mm. Nhưng giải pháp này cực kỳ đắt tiền.

Chúc vui.

namnp2007 11-08-2009 06:43 PM

Rất cám ơn bang chủ đã có công giải thích, có thể mình sẽ chọn loại UNDK 10 này. Mr. F. có thể cho biết sơ về giá của nó không ?
Do thực tế mình chỉ muốn giữ khoảng cách từ đầu cắt của máy cắt plasma ( CNC) đến tấm sản phẩm đang được cắt, khoảng cách tốt nhất là khoảng 2-3mm, nếu lớn hơn thì mạch cắt xấu, nếu quá nhỏ (< 1mm) sẽ không cắt được, nên nếu sai số thực tế là 0,5mm thì vẫn còn trong dung sai cho phép, giờ chỉ còn điều kiện kinh tế có cho phép nữa hay không mà thôi , hì hì.

falleaf 11-08-2009 08:12 PM

Vậy tạm ngưng thảo luận về vấn đề này tại đây, có thể em kiểm tra một số thông tin thì sẽ mở luồng mới về cảm biến laser để thảo luận.

Anh có thể lên google để tìm với từ khóa: laser range finder thì sẽ tìm được rất nhiều loại cảm biến tương tự như thế này.

Em còn có trong tay danh sách khá nhiều loại cảm biến laser vì trước em là dân Cơ Điện Tử, và chuyên ngành Robotics, cho nên em đi lùng mấy thứ kiểu kiểu thế này. Tuy nhiên, hiện tại em không làm về nó nữa, nên nếu anh cần giải pháp thì giải pháp này ở mức khoảng vài trăm USD - 1000 USD hoặc thậm chí cao hơn nếu cần độ chính xác cao hơn.

Trên thực tế, về mặt điều khiển, thì lúc đó anh cần có một bộ điều khiển, có thể cần phải áp luật điều khiển, có thể là PI hoặc PID vào đó, vì với dịch chuyển quá nhỏ, độ nhạy quá cao của cảm biến, thì bộ điều khiển sẽ phải làm việc khá vất vả.

Em tạm trao đổi tới đây thôi, nếu cần thêm gì chắc anh ghé công ty em trao đổi thêm, vì giải pháp kiểu như thế này, quan trọng là anh ước lượng mức chi phí, còn một cảm biến laser thì đạt mức sai số 0.5mm tương đối nhiều. Loại 0.01mm thì mới khó. Tất nhiên sẽ còn nhiều vấn đề nữa mới giải quyết được bài toán của anh.

Các loại cảm biến đều có thể cho giá trị ra 4mA - 25mA hoặc ra dải điện áp 0 - 2.5V hoặc 0-5V, hoặc cho ra RS232 hoặc RS485. Như vậy, để sử dụng thì mua luôn loại ra RS232 cắm vào phát là chạy luôn, cắm con MCU nào cũng được, bộ điều khiển PID cũng đơn giản.

Chúc vui

namnp2007 13-08-2009 09:58 AM

Ok, thanks. mình sẽ ghé công ty.

arthasherovu 15-04-2010 12:21 AM

anh F cho em hỏi tại sao tầm của cảm biến siêu âm SRF05 ko thể nhỏ hơn 10cm được zay, và trong Robot tránh vật cản có cần thêm cảm biến hồng ngoại để phát hiện vật cản ở gần hơn 10 cm ko
thanks !!!

vanondnc 18-04-2010 09:50 AM

srf05
 
Trích:

Nguyên văn bởi falleaf (Post 951)
Cảm biến laser thì tôi chưa dùng, nhưng cảm biến siêu âm thì bạn cứ đặt câu hỏi, nếu trong phạm vi hiểu biết tôi sẽ giúp.

Chúc vui.

anh cho em hỏi em làm con srf05+pic16f877a+lcd ma em bắt cạnh lên và cạnh xuống chưa được, anh xem giúp em doạn code với, cảm ơn anh nhiều:
#include <16F877.h>
#include <defs_16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device *=16
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#define led1 pin_E1
#define button pin_B1
#define TRIGGER pin_B4// chan phat song sieu am
//chan ECHO nhan tin hieu ve noi vao RC2
#BYTE TRISC=0X87
#BYTE PORTC=0X07
#BIT RC2=0X7.2
float dist,getvar ;
int1 has_echo=0,echo=0;

////////////////////////////////////////////////

#int_CCP1
void ccp1_isr()
{
setup_ccp1(CCP_CAPTURE_RE);//thiet lap Capture CCP1 do xung canh len
enable_interrupts(INT_CCP1);//cho phep ngat khi ccp1 co tin hieu
enable_interrupts(GLOBAL);
if(pin_c2)
set_timer1(1000); //reset timer1 ve 0
setup_ccp1(CCP_CAPTURE_FE); //chuyen sang do xung canh xuong
if(!pin_c2);//khi co xung canh xuong
getvar=get_timer1(); //doc gia tri timer1 ngay khi co xung echo canh xuong
dist=(getvar-485)/28.3; //so lieu dua theo ket qua do thuc te
dist=getvar;
}
//----10us cho trigger----
void trig()
{
output_high(TRIGGER);
delay_us(10);
output_low(TRIGGER);
}
void main()
{
SET_TRIS_A(0x00); // Port A output
SET_TRIS_B(0X00);
SET_TRIS_E(0x00);
SET_TRIS_C(0xff);
SET_TRIS_D(0b00000011);
lcd_init();

while(1)
{
trig();
ccp1_isr();
lcd_putcmd(0x01);
printf(lcd_putchar,"dist=%6.1f",dist);
lcd_putchar("cm");
delay_ms(1000);
}
}

lcd chỉ hiển thị số 0. em chưa biêt sai chỗ nào cả

0944911982 30-05-2010 01:53 PM

ban nao co biet cam bien sieu am TR40-16 ko?va co ai biet cho nao ban ko?xin chgi minh giup huu_nghia17@yahoo.com

sit_alone76816 04-06-2010 10:29 AM

Trích:

Nguyên văn bởi vanondnc (Post 35240)
anh cho em hỏi em làm con srf05+pic16f877a+lcd ma em bắt cạnh lên và cạnh xuống chưa được, anh xem giúp em doạn code với, cảm ơn anh nhiều:
#include <16F877.h>
#include <defs_16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device *=16
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#define led1 pin_E1
#define button pin_B1
#define TRIGGER pin_B4// chan phat song sieu am
//chan ECHO nhan tin hieu ve noi vao RC2
#BYTE TRISC=0X87
#BYTE PORTC=0X07
#BIT RC2=0X7.2
float dist,getvar ;
int1 has_echo=0,echo=0;

////////////////////////////////////////////////

#int_CCP1
void ccp1_isr()
{
setup_ccp1(CCP_CAPTURE_RE);//thiet lap Capture CCP1 do xung canh len
enable_interrupts(INT_CCP1);//cho phep ngat khi ccp1 co tin hieu
enable_interrupts(GLOBAL);
if(pin_c2)
set_timer1(1000); //reset timer1 ve 0
setup_ccp1(CCP_CAPTURE_FE); //chuyen sang do xung canh xuong
if(!pin_c2);//khi co xung canh xuong
getvar=get_timer1(); //doc gia tri timer1 ngay khi co xung echo canh xuong
dist=(getvar-485)/28.3; //so lieu dua theo ket qua do thuc te
dist=getvar;
}
//----10us cho trigger----
void trig()
{
output_high(TRIGGER);
delay_us(10);
output_low(TRIGGER);
}
void main()
{
SET_TRIS_A(0x00); // Port A output
SET_TRIS_B(0X00);
SET_TRIS_E(0x00);
SET_TRIS_C(0xff);
SET_TRIS_D(0b00000011);
lcd_init();

while(1)
{
trig();
ccp1_isr();
lcd_putcmd(0x01);
printf(lcd_putchar,"dist=%6.1f",dist);
lcd_putchar("cm");
delay_ms(1000);
}
}

lcd chỉ hiển thị số 0. em chưa biêt sai chỗ nào cả

Bạn đã đọc kỹ data sheet của con SRF05 này chưa vậy ? Về chương trình ngắt của bạn mình chưa nói đến là đúng hay sai vì mình không dùng CCS, nhưng mình thấy có 1 số vấn đề như sau :
+ Điều trước hết là bạn phải cho xem cái mạch của bạn, để biết rằng bạn đang sử dụng Mode nào, và có mắc đúng hay chưa ?
+ Điều thứ 2: là con SRF05 này cần xung Trigger >=10uS, vậy thì bạn cho nó 50us hay 100us cho chắc chắn, không vấn đề gì hết.
+ Thứ 3 là bạn có chắc cái chương trình ngắt của bạn có đúng không ? Con SRF05 còn hoạt động không ?
+ Bạn tính khoảng cách theo công thức gì vậy, bởi vì trong datasheet của nó có nói, thời gian xung đo được là uS, lấy kết quả đó chia cho 58 thì ra khoảng cách là cm, vậy tại sao công thức bạn kỳ vậy ?

langtul42 27-10-2010 07:12 PM

co ai biet cho nao ban cam bien sieu am srf05 hay khong chi jup minh voi!thank!

fidel 20-11-2010 07:13 PM

Srf05
 
Chào các bạn.


Về câu hỏi của bạn Vanondnc, hàm ccp1_isr của bạn viết sai logic. Mình giải thích như thế này: sau khi phát xung đến chân trigger, cảm biến phát siêu âm ra, và sau 1 thời gian thì sóng này mới quay lại, đến lúc đó thì chân ECHO mới "high". Trong thời gian đó con PIC của bạn đã chạy xong hàm ccp1_isr, và if(pin_c2) luôn trả về sai (do chân ECHO trong thời gian đó vẫn low).

Theo mình biết mỗi lần phát siêu âm thì con SRF05 sẽ chờ xung về trong 30ms, nếu sau 30ms mà chưa có xung về thì xem như "over time". Dựa vào đó bạn nên viết hàm ccp1_isr lại theo hướng này:
+ phát trigger 10us (10 là đủ, không cần phát lâu hơn)
+ set chạy timer
+ chạy hàm while(ECHO low VÀ timer < 30ms) //đây là thời gian chờ xung về, trong hàm while này để trống không làm gì cả.
+ sau khi thoát khỏi vòng while trên, bạn ktra (bằng if) xem timer đã đạt 30ms chưa, nếu đạt rồi thì nghĩa là over time, không có vật cản trong phạm vi dò, nếu chưa thì nghĩa là có vật cản làm cho ECHO high.
+ set lại timer về 0
+ chạy tiếp 1 hàm while(ECHO high)
+ sau khi thoát ra khỏi hàm while này (nghĩa là ECHO về low), tắt và đọc giá trị timer, tính ra khoảng cách.


Mình cũng mới mua 2 con SRF05 về, đang nối dây để xài thử. Tí nữa nối dây xong mình sẽ code và nếu chạy được thì sẽ gửi code mẫu cho bạn.

fidel 21-11-2010 04:33 AM

Đây là code của mình, SRF05/mode1/Atmega128.



#define F_CPU 14745600UL
#define STOP_CLK 0x08 // Stop clock
#define START_CLK 0x0A // Start clock with 1:8 prescaler CTC mode
#define START_CLK_N 0x02 // Start clock running 1:8 prescaler in normal mode
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>
#include "knihovnaLCD.c"

float s;
char buffer [50];
void setup(void)
{
DDRA = 0x00; // Port A asIN
DDRC = 0xFF; // Port C as OUT
TCCR1A = 0x00; // Set timer up in CTC mode
TCCR1B = 0x08;
TWBR = 0x20; // 100MHz I2C clock frequency
}
void waitForTimer(void)
{
while(!(TIFR&0x10)); // wait for timer to set compare match flag
TCCR1B = STOP_CLK; // Stop the timer
}
void startTimer(unsigned int time)
{
OCR1A = time; // Time set to count to
TIFR = 0x10; // Clear timer campare match flag
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK; // Start timer running 1:8 prescaler
}

unsigned int getEcho(void)
{
unsigned int range;

TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N;
while(bit_is_clear(PINA,0) && TCNT1 < 0xC350) // Wait for echo pin to go high, this indicates the start of the incoming pulse
{
}
if (TCNT1 > 0xC300) //Time over
{
TCCR1B = STOP_CLK;
return(999);
}
TCCR1B = STOP_CLK;
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N; // Start timer running 1:8 prescaler in normal mode
while(bit_is_set(PINA,0)); // Echo pin goes high
{ // Just wait
}
TCCR1B = STOP_CLK; // Echo pin has just fallen down. Stop the timer
range = TCNT1/107; // Read back value in the timer counter register
return(range);
}

int main(void)
{
setup();
startTimer(0xFFFF);
waitForTimer();
LCD_Init();
LCD_Clear();

while (1)
{
PORTC=255;
_delay_us(10);
PORTC=0;
s = getEcho();
sprintf (buffer, "s =%u ", (int)s);
LCD_Position(1 , 1);
LCD_WriteString(buffer);
_delay_ms(100);
};
}

navy 21-12-2011 05:18 PM

Trích:

Nguyên văn bởi fidel (Post 40237)
Đây là code của mình, SRF05/mode1/Atmega128.



#define F_CPU 14745600UL
#define STOP_CLK 0x08 // Stop clock
#define START_CLK 0x0A // Start clock with 1:8 prescaler CTC mode
#define START_CLK_N 0x02 // Start clock running 1:8 prescaler in normal mode
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>
#include "knihovnaLCD.c"

float s;
char buffer [50];
void setup(void)
{
DDRA = 0x00; // Port A asIN
DDRC = 0xFF; // Port C as OUT
TCCR1A = 0x00; // Set timer up in CTC mode
TCCR1B = 0x08;
TWBR = 0x20; // 100MHz I2C clock frequency
}
void waitForTimer(void)
{
while(!(TIFR&0x10)); // wait for timer to set compare match flag
TCCR1B = STOP_CLK; // Stop the timer
}
void startTimer(unsigned int time)
{
OCR1A = time; // Time set to count to
TIFR = 0x10; // Clear timer campare match flag
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK; // Start timer running 1:8 prescaler
}

unsigned int getEcho(void)
{
unsigned int range;

TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N;
while(bit_is_clear(PINA,0) && TCNT1 < 0xC350) // Wait for echo pin to go high, this indicates the start of the incoming pulse
{
}
if (TCNT1 > 0xC300) //Time over
{
TCCR1B = STOP_CLK;
return(999);
}
TCCR1B = STOP_CLK;
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N; // Start timer running 1:8 prescaler in normal mode
while(bit_is_set(PINA,0)); // Echo pin goes high
{ // Just wait
}
TCCR1B = STOP_CLK; // Echo pin has just fallen down. Stop the timer
range = TCNT1/107; // Read back value in the timer counter register
return(range);
}

int main(void)
{
setup();
startTimer(0xFFFF);
waitForTimer();
LCD_Init();
LCD_Clear();

while (1)
{
PORTC=255;
_delay_us(10);
PORTC=0;
s = getEcho();
sprintf (buffer, "s =%u ", (int)s);
LCD_Position(1 , 1);
LCD_WriteString(buffer);
_delay_ms(100);
};
}

Không biết Topic này có chuyển sang Forum nào không mà không thấy tiếp tục? Bạn có thể cho mình địa chỉ mail để liên lạc hỏi về vấn đề này nhé? Mình đang quan tâm! Thanks!

spkt_kdd95 08-04-2012 05:51 PM

Mình đang muốn làm con robo dùng cảm biến siêu âm Sr04 để tìm vật cản, mà viết code hoài mà nó không chạy theo ý muốn mong các sư huynh chỉ giúp. Đây là code mình viết.

;================================================= =======
; Ten chuong trinh : Mach phat xung 10us-Dung Cho Cam Bien Sieu Am Hc-SR04
; Nguoi thuc hien : Duong Van Bong
; Ngay thuc hien : 04/03/2012
; Phien ban : 1.0
; Mo ta phan cung : Dung PIC16F84A - thach anh 16MHz
; : HC-SR04 giao tiep voi PORTB
; : RB0 - RB7 la cac chan output
;----------------------------------------------------------------
; Ngay hoan thanh : 04/03/2012
; Ngay kiem tra : 04/03/2012
; Nguoi kiem tra : Duong Van Bong
;----------------------------------------------------------------
; Chu thich : Dung Pic tao xung cho cam bien
; :
;================================================= =======
TITLE "Mach phat xung 10us"
PROCESSOR P16F84A
INCLUDE <P16F84A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
;================================================= ======
; Phan Dat Bien
;-------------------------------------
; Bien o bang 0
;-------------------------------------
ORG 0x020
Delay_reg1 EQU 0x020
Delay_reg2 EQU 0x021
Delay_reg3 EQU 0x022
Delay_reg4 EQU 0x023
Delay_reg5 EQU 0x024
Rb1 EQU 1
;------------------------------------
; Bien o bang 1
;------------------------------------
ORG 0x0A0
;------------------------------------
; Bien o bang 2
;------------------------------------
ORG 0x120
;================================================= ========================
; Phâ`n chuong trình chính
;================================================= ========================
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BANKSEL TRISB ; bank select
MOVLW b'00000010'
MOVWF TRISB
CLRF TRISA ; trisa = 00000000
CLRF PORTA ; porta = output
BCF STATUS,RP0
LOOP BSF PORTB,0 ; rb0 = 1
CALL DELAY_10US ; Delay times 10us
BCF PORTB,0 ; Rb0=0
CALL DELAY_1740US ; Delay times 1740us
MOVFW PORTB
BTFSS PORTB,Rb1
CALL BONG
BTFSC PORTB,Rb1
GOTO $-1
GOTO LOOP
;================================================= ============================
; Các chuong trình con
;================================================= ============================
DELAY_10US
MOVLW d'13'
MOVWF Delay_reg1
LOOP1 DECFSZ Delay_reg1
GOTO LOOP1
RETURN
;------------------------------------
DELAY_1740US
MOVLW d'3'
MOVWF Delay_reg2
MOVLW d'25'
MOVWF Delay_reg3
LOOP2 DECFSZ Delay_reg2
GOTO LOOP3
GOTO EXIT
LOOP3 DECFSZ Delay_reg3
GOTO LOOP3
GOTO LOOP2
EXIT
RETURN
;------------------------------------
DELAY_50MS
MOVLW d'17'
MOVWF Delay_reg4
MOVLW d'232'
MOVWF Delay_reg5
LOOP4 DECFSZ Delay_reg4
GOTO LOOP5
GOTO EXIT_1
LOOP5 DECFSZ Delay_reg5
GOTO LOOP5
GOTO LOOP4
EXIT_1
RETURN
;------------------------------------
BONG
BSF PORTA,0
CALL DELAY_50MS
BCF PORTA,0
RETURN
;------------------------------------
END
;================================================= ==================
duongvanbong@yahoo.com
Mong các sư huynh chỉ giúp

fire_dragon 11-01-2014 07:48 PM

Hiện giờ, anh Hùng có bán loại cảm biến siêu âm SRF05 còn mới.
Giá bộ cảm biến 550000 VND. Liên hệ anh Hùng qua email:
hungmn30@yahoo.com

matong999 09-03-2014 03:54 PM

cảm biến này hay thật


Múi giờ GMT. Hiện tại là 09:13 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