Nguyên văn bởi minh_cly
Xem bài viết
Thông báo
Collapse
No announcement yet.
cảm biến siêu âm SRF05 với PIC 16F877a!!!!!!!!!!!!!!!!!!!!!!!!!!
Collapse
X
-
Mình ko có module để đây, nên sao mình test đc.Nguyên văn bởi chungpmth Xem bài viếtbạn ơi sao vẫn không được nhỉ bạn test thử code này chưa mình mãi mà không được????Computer Science major - Vietnamese-German University
Sponsored by
Comment
-
nó cứ hiện có mỗi dist = -1 tớ đo thì vẫn có xung về tức là có tín hiệu
nhưng không hiểu là sao
không biết hàm ngắt thế nào nữa
#int_TIMER1
void TIMER1_isr(void) {
if (has_echo == 0) {
has_echo = 1; // Tràn timer mà ko có echo thì cho wa (tối đa của SRF05 là 30ms, tràn timer là 52ms)
dist = -1; // Số này bạn muốn cho sao cũng đc, tức là ko đo được
}
}
vấn đề có thể vẫn là chổ này
Comment
-
Chắc chắn là cái vấn đề nó nằm ở chỗ này.Nguyên văn bởi chungpmth Xem bài viếtnó cứ hiện có mỗi dist = -1 tớ đo thì vẫn có xung về tức là có tín hiệu
nhưng không hiểu là sao
không biết hàm ngắt thế nào nữa
#int_TIMER1
void TIMER1_isr(void) {
if (has_echo == 0) {
has_echo = 1; // Tràn timer mà ko có echo thì cho wa (tối đa của SRF05 là 30ms, tràn timer là 52ms)
dist = -1; // Số này bạn muốn cho sao cũng đc, tức là ko đo được
}
}
vấn đề có thể vẫn là chổ này
Bạn sửa lại như thế này xem sao:
Code:#int_CCP1 void ccp1_isr() { if(pin_c2) { // Nếu là xung cạnh lên set_timer1(0); // Reset timer1 về 0 setup_ccp1(CCP_CAPTURE_FE); // Chuyển Capture 1 đo cạnh xuống } if(!pin_c2) { // Nếu là xung cạnh xuống getvar=get_timer1(); // Đọc giá trị timer 1 dist=(getvar*0.8)/58; // Mỗi 1 nhịp của timer 1 tương ứng vs 0.8 us, lấy us chia cho 58 ra cm setup_ccp1(CCP_CAPTURE_RE); // Chuyển Capture 1 đo xung lên trở lại has_echo = 1; // Đã nhận xong echo disable_interrupts(int_TIMER1); // Tắt ngắt timer 1 } } #int_TIMER1 void TIMER1_isr(void) { if (has_echo == 0) { has_echo = 1; // Tràn timer mà ko có echo thì cho wa (tối đa của SRF05 là 30ms, tràn timer là 52ms) dist = -1; // Số này bạn muốn cho sao cũng đc, tức là ko đo được } disable_interrupts(int_TIMER1); // Tắt ngắt timer 1 } void trig() { output_high(TRIGGER); delay_us(10); output_low(TRIGGER); } void main() { SET_TRIS_B(0X00); SET_TRIS_C(0xff); lcd_init(); setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); //20 MHz thì tràn trong 52ms (tối đa xung của SRF05 là 30ms) setup_ccp1(CCP_CAPTURE_RE); // Thiết lập Capture 1 đo cạnh lên enable_interrupts(int_TIMER1); // Ngắt timer 1, đề phòng trường hợp ko có echo enable_interrupts(INT_CCP1); // Ngắt Capture 1 enable_interrupts(GLOBAL); while(1) { set_timer1(0); // Reset timer1 về 0 enable_interrupts(int_TIMER1); // Bật ngắt timer 1 has_echo = 0; // Xác lập lại echo trig(); // Trigger while (has_echo == 0) { } // chờ đến khi nhận hết echo lcd_putcmd(0x01); printf(lcd_putchar,"dist=%6.1f",dist); lcd_putchar("cm"); delay_ms(100); // 0.1 s đo một lần } }Computer Science major - Vietnamese-German University
Sponsored by
Comment
-
Bạn cần sửa chỗ in đậm
#int_CCP1
void ccp1_isr()
{
if(input(pin_c2)) { // Nếu là xung cạnh lên
set_timer1(0); // Reset timer1 về 0
setup_ccp1(CCP_CAPTURE_FE); // Chuyển Capture 1 đo cạnh xuống
}
else { // Nếu là xung cạnh xuống
getvar=CCP_1; // Đọc giá trị timer 1
dist=(getvar*0.8)/58; // Mỗi 1 nhịp của timer 1 tương ứng vs 0.8 us, lấy us chia cho 58 ra cm
setup_ccp1(CCP_CAPTURE_RE); // Chuyển Capture 1 đo xung lên trở lại
has_echo = 1; // Đã nhận xong echo
disable_interrupts(int_TIMER1); // Tắt ngắt timer 1
}
}
đồng thời bạn nên cộng thêm một hàm offset để bảo đảm sai số quá trình.
Chúc vui!
Comment
-
Ax, quê quá, sai lỗi sơ đẳng. Cảm ơn bạn nha.Nguyên văn bởi elvies Xem bài viếtBạn cần sửa chỗ in đậm
#int_CCP1
void ccp1_isr()
{
if(input(pin_c2)) { // Nếu là xung cạnh lên
set_timer1(0); // Reset timer1 về 0
setup_ccp1(CCP_CAPTURE_FE); // Chuyển Capture 1 đo cạnh xuống
}
else { // Nếu là xung cạnh xuống
getvar=CCP_1; // Đọc giá trị timer 1
dist=(getvar*0.8)/58; // Mỗi 1 nhịp của timer 1 tương ứng vs 0.8 us, lấy us chia cho 58 ra cm
setup_ccp1(CCP_CAPTURE_RE); // Chuyển Capture 1 đo xung lên trở lại
has_echo = 1; // Đã nhận xong echo
disable_interrupts(int_TIMER1); // Tắt ngắt timer 1
}
}
đồng thời bạn nên cộng thêm một hàm offset để bảo đảm sai số quá trình.
Chúc vui!Computer Science major - Vietnamese-German University
Sponsored by
Comment
-
Có mà bạn, cái hàm setup_timer1 và enable_interrupt trong CCS đó.Nguyên văn bởi lambk89 Xem bài viếtBạn ơi? Sao mình chạy thử code trên không đươc nhỉ. Mình thấy cái ngắt và timer thì không được gọi tới trong hàm main. Mong bạn giải thích giùm.Computer Science major - Vietnamese-German University
Sponsored by
Comment
-
cái này mình làm rồi, mạch chạy rồi nhưng nản quá đó cái gì mà nó có bề mặt phẳng như mặt nước, mặt kính thì được chứ với vật liệu rời thành đống hình chóp như đá, quặng thì sai toe toét...Nguyên văn bởi lambk89 Xem bài viếthajxx! Mình đang chạy mạch thử đây mà không thấy được j. nản ghê. Không biết ai đã chạy thành công mạch trên giúp đỡ mình với.
code day:
//nguyen van duc
//KS tu dong hoa
//cong thuc tinh thoi gian T= (65536-VALUE)*(4/Fosc)*P
#include <16F877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(d)//Dùng cái này thì trong chu+o+ng trình khi dùng các le^.nh io nhu+ output_low() , . . . nó se~ set chi? vo+'i 1 le^.nh ,
#use fast_io(b)
#use fast_io(a)
int16 thoigiantruyen,CCP1value;
int16 CCP1Oldvalue;
BOOLEAN CCP1Captured;
int8 hangdonvi,hangchuc,hangtram;
int16 ketqua;
int8 i,k;
#INT_CCP1
void ngat_ccp1()
{
set_timer1(0);
}
#INT_CCP2
void ngat_ccp2()
{
CCP1Value =CCP_2;
CCP_2=0;
CCP1Captured = TRUE;
//j=0;
}
#INT_TIMER0
void interrup_timer0()
{i++;
set_timer0(8);
if(i==5){
output_d(hangtram);
output_high(pin_d5);
}
if(i==10){
output_d(hangchuc);
output_high(pin_d6);}
if(i==15){
output_d(hangdonvi);
output_high(pin_d7);}
if(i>=16){i=0;}
}
void triger()
{
output_high(PIN_A0);
delay_us(12);
output_low(PIN_A0);
}
void init_ccp()
{
setup_ccp1(CCP_capture_RE);//do xung canh len R
setup_ccp2(CCP_capture_FE);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); //tang mot gia tri timer1 mat 4/5uS
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
CCP1value=0;
CCP1Oldvalue=0;
CCP1Captured=TRUE;
enable_interrupts(INT_CCP1);
enable_interrupts(INT_CCP2);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
}
void Main()
{
init_ccp();
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0xff); //ff xac lap cac chan port C la chan input
set_tris_a(0x00);
set_timer0(8);
while(true){
delay_ms(100);
triger();
if(CCP1Captured){
thoigiantruyen=CCP1value*0.8;
ketqua=thoigiantruyen/58;
CCP1Captured=FALSE;
if(ketqua>999){hangdonvi=0;hangchuc=0;hangtram=0;}
else{
hangdonvi=ketqua%10;
hangchuc=(ketqua/10)%10;
hangtram=(ketqua/100);
}
}
if(ketqua<175){output_high(PIN_A1);
delay_ms(500);
k=0;}
k++;
if(k>=5){
output_low(PIN_A1);
delay_ms(500);
k=0;
}
}
}
Comment
-
bạn chủ bài ôi! mình cũng đang làm đề tài giống bạn. Cho mình xin file capture đk k?
Giúp mình với!!! Email của mình haitaisaolaithe@yahoo.com.vnNguyên văn bởi dktdk13 Xem bài viếtcái này mình làm rồi, mạch chạy rồi nhưng nản quá đó cái gì mà nó có bề mặt phẳng như mặt nước, mặt kính thì được chứ với vật liệu rời thành đống hình chóp như đá, quặng thì sai toe toét...
code day:
//nguyen van duc
//KS tu dong hoa
//cong thuc tinh thoi gian T= (65536-VALUE)*(4/Fosc)*P
#include <16F877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(d)//Dùng cái này thì trong chu+o+ng trình khi dùng các le^.nh io nhu+ output_low() , . . . nó se~ set chi? vo+'i 1 le^.nh ,
#use fast_io(b)
#use fast_io(a)
int16 thoigiantruyen,CCP1value;
int16 CCP1Oldvalue;
BOOLEAN CCP1Captured;
int8 hangdonvi,hangchuc,hangtram;
int16 ketqua;
int8 i,k;
#INT_CCP1
void ngat_ccp1()
{
set_timer1(0);
}
#INT_CCP2
void ngat_ccp2()
{
CCP1Value =CCP_2;
CCP_2=0;
CCP1Captured = TRUE;
//j=0;
}
#INT_TIMER0
void interrup_timer0()
{i++;
set_timer0(8);
if(i==5){
output_d(hangtram);
output_high(pin_d5);
}
if(i==10){
output_d(hangchuc);
output_high(pin_d6);}
if(i==15){
output_d(hangdonvi);
output_high(pin_d7);}
if(i>=16){i=0;}
}
void triger()
{
output_high(PIN_A0);
delay_us(12);
output_low(PIN_A0);
}
void init_ccp()
{
setup_ccp1(CCP_capture_RE);//do xung canh len R
setup_ccp2(CCP_capture_FE);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); //tang mot gia tri timer1 mat 4/5uS
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
CCP1value=0;
CCP1Oldvalue=0;
CCP1Captured=TRUE;
enable_interrupts(INT_CCP1);
enable_interrupts(INT_CCP2);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
}
void Main()
{
init_ccp();
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0xff); //ff xac lap cac chan port C la chan input
set_tris_a(0x00);
set_timer0(8);
while(true){
delay_ms(100);
triger();
if(CCP1Captured){
thoigiantruyen=CCP1value*0.8;
ketqua=thoigiantruyen/58;
CCP1Captured=FALSE;
if(ketqua>999){hangdonvi=0;hangchuc=0;hangtram=0;}
else{
hangdonvi=ketqua%10;
hangchuc=(ketqua/10)%10;
hangtram=(ketqua/100);
}
}
if(ketqua<175){output_high(PIN_A1);
delay_ms(500);
k=0;}
k++;
if(k>=5){
output_low(PIN_A1);
delay_ms(500);
k=0;
}
}
}
Rất mong nhận đk hồi âm của bạn sớm
Comment
-
đo được khoảng cách rồi thì điều khiển động cơ bước đơn giản thôi mà, nối chung 1 đầu cuộn dây các pha của động cơ bước lại nối với GND rồi dùng transistor đóng VCC vào các đầu còn lại theo vòng tròn thôi mà, nhớ có con diode mắc từ E->C trasistor bảo vệ tiếp giáp BE. Không nếu có điều kiện thì dùng L298-L297 là ok nhưng cái này rất là mắc đó.
Comment
Bài viết mới nhất
Collapse
-
bởi lvhnHãng nào tùy thích thôi bác! bây giờ các hãng đều hỗ trợ xem qua máy tính hay điện thoại đều được. Gắn Trước tiên mua về cắm nguồn set ip hết xong hãy lắp lên, cam poe chỉ cần 4 lõi là hoạt động bình thường nên 1 dây kéo cho 2 cam vẫn ok
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 15:49 -
-
Trả lời cho Tìm bạn thân quen cũ.bởi lvhnNhớ không nhầm thì lúc còn đi học có gặp chú 1 lần cf bãi xe Nguyễn Kim, giờ quán cf đó nghỉ bán rồi
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 15:44 -
-
Trả lời cho Thắc mắc pin 21v ?bởi lvhnCon số đấy biểu thị gần đúng thôi, cái đồng hồ đó có đảm bảo chính xác hay không? pin có cục lên 4v4 vẫn bình thường. Cái gì cũng có sai số trong phạm vi không quá lớn thì không ảnh hưởng gì đâu, bàn ngay ngón ngắn ngón dài mà
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 15:32 -
-
Trả lời cho Amply bị rò DC 22 voltbởi lvhnThay mấy con transisto nhỏ đầu vào, thường vi sai lỗi hay bị. Khám tổng quát chân các linh kiện xem có bị rỉ sét nhiều không?
-
Channel: Điện thanh
Hôm qua, 15:24 -
-
bởi dinhthuong92Mạch này hiệu suất ra led đạt khoảng 90.7% tại 12V in, 40W out.
-
Channel: Nguồn!
27-07-2026, 10:15 -
-
bởi dinhthuong92Có lẽ nguồn viết bài này chỉ mang tính định tính để nói rằng cần thay đổi tổng trở tải để có Pmax chứ trình bày chưa chi tiết và thấu đáo một cách định lượng. Công thức tổng quát phải có mặt L mới được, và nói là "tổng...
-
Channel: Nguồn!
27-07-2026, 10:09 -
-
Trả lời cho [Chia sẻ] Tổng hợp các công ty AI Việt Nam đang làm gì thật sự — Từ voicebot, computer vision đến AI agentsbởi nguyendinhvanCàng ngày, CNTT càng trở nên lôi thôi , rách việc.
Cái AI và Ge... trên trình duyệt chỉ tổ làm vướng mắt, mất thì gian.
Tôi toàm phải mất cộng tắt nó đi.-
Channel: Xu hướng, nhu cầu và thị trường
25-07-2026, 14:59 -
-
bởi trung30000Em có con amply 12 sò D 718 và e688 , biến áp 15A, 30v 0 30 v, một kênh thì hoạt động bình thường, kênh còn lại nổ bụp bụp, sột sột, đèn tín hiệu nhảy lên vạch max, khoảng 4 đến 5 giây, sau đó đèn tín hiệu trả về mức không, Em thấy như...
-
Channel: Điện thanh
24-07-2026, 13:50 -
-
Trả lời cho Tìm hiểu máy hàn lăn (Rolling Welding)bởi hoang_3ibác cần thì liên hệ Em: mayhanhaivuong.com (0903238399)...
-
Channel: Điện tử công nghiệp
24-07-2026, 10:58 -
-
Trả lời cho Công thức tính định luật kirchhoffbởi abcnewmemberGiải bằng hệ phương trình bật nhất 3 ẩn.
...
-
Channel: Hỗ trợ học tập
23-07-2026, 14:52 -
mạch này đầu tư hơi tốn $$$ đấy cái cảm biến siêu âm 5lit...

Comment