cảm biến siêu âm SRF05 với PIC 16F877a!!!!!!!!!!!!!!!!!!!!!!!!!!

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • chungpmth
    Thành viên mới
    • Jun 2012
    • 15

    #16
    Nguyên văn bởi minh_cly Xem bài viết
    Chết, code mình thiếu, bạn sửa như vậy nè:
    #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
    }
    }
    bạ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????

    Comment

    • minh_cly
      Thành viên tích cực
      • Mar 2011
      • 595

      #17
      Nguyên văn bởi chungpmth Xem bài viết
      bạ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????
      Mình ko có module để đây, nên sao mình test đc.
      Computer Science major - Vietnamese-German University
      Sponsored by

      Comment

      • chungpmth
        Thành viên mới
        • Jun 2012
        • 15

        #18
        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

        • minh_cly
          Thành viên tích cực
          • Mar 2011
          • 595

          #19
          Nguyên văn bởi chungpmth Xem bài viết
          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
          Chắc chắn là cái vấn đề nó nằm ở 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

          • elvies
            Thành viên mới
            • Jun 2009
            • 10

            #20
            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

            • minh_cly
              Thành viên tích cực
              • Mar 2011
              • 595

              #21
              Nguyên văn bởi elvies Xem bài viết
              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!
              Ax, quê quá, sai lỗi sơ đẳng. Cảm ơn bạn nha.
              Computer Science major - Vietnamese-German University
              Sponsored by

              Comment

              • lambk89
                Thành viên mới
                • Jan 2010
                • 28

                #22
                Bạ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.

                Comment

                • minh_cly
                  Thành viên tích cực
                  • Mar 2011
                  • 595

                  #23
                  Nguyên văn bởi lambk89 Xem bài viết
                  Bạ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.
                  Có mà bạn, cái hàm setup_timer1 và enable_interrupt trong CCS đó.
                  Computer Science major - Vietnamese-German University
                  Sponsored by

                  Comment

                  • lambk89
                    Thành viên mới
                    • Jan 2010
                    • 28

                    #24
                    hajxx! 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.

                    Comment

                    • dktdk13
                      Thành viên mới
                      • Feb 2011
                      • 26

                      #25
                      Nguyên văn bởi lambk89 Xem bài viết
                      hajxx! 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.
                      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...
                      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

                      • haitacx4
                        Thành viên mới
                        • Oct 2012
                        • 2

                        #26
                        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?

                        Nguyên văn bởi dktdk13 Xem bài viết
                        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...
                        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;
                        }
                        }
                        }
                        Giúp mình với!!! Email của mình haitaisaolaithe@yahoo.com.vn
                        Rất mong nhận đk hồi âm của bạn sớm

                        Comment

                        • dktdk13
                          Thành viên mới
                          • Feb 2011
                          • 26

                          #27
                          ờ đợi tí gửi mail cho có cả mô phỏng bằng proteus đấy... mạch này đầu tư hơi tốn $$$ đấy cái cảm biến siêu âm 5lit...

                          Comment

                          • dktdk13
                            Thành viên mới
                            • Feb 2011
                            • 26

                            #28
                            đ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

                            • haitacx4
                              Thành viên mới
                              • Oct 2012
                              • 2

                              #29
                              cảm ơn.

                              cam on ban.

                              Comment

                              • chocolet_90
                                Thành viên mới
                                • Dec 2012
                                • 1

                                #30
                                ai làm ok mạch này cho mình xin voi nhé congquynh08@gmail.com

                                Comment

                                Về tác giả

                                Collapse

                                chungpmth Tìm hiểu thêm về chungpmth

                                Bài viết mới nhất

                                Collapse

                                Đang tải...