![]() |
|
Tài trợ cho PIC Vietnam |
Cảm biến Camera, siêu âm, hồng ngoại, gyro, la bàn... |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Apr 2010
Bài gửi: 2
: |
co ai biet cho nao ban cam bien sieu am srf05 hay khong chi jup minh voi!thank!
|
![]() |
![]() |
![]() |
#2 |
Nhập môn đệ tử
Tham gia ngày: Nov 2010
Bài gửi: 4
: |
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. |
![]() |
![]() |
![]() |
#3 |
Nhập môn đệ tử
Tham gia ngày: Nov 2010
Bài gửi: 4
: |
Đâ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); }; } |
![]() |
![]() |
![]() |
#4 | |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
Trích:
|
|
![]() |
![]() |
![]() |
|
|