Thông báo

Collapse
No announcement yet.

đếm xung encoder và xác định chiều quay

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • đếm xung encoder và xác định chiều quay

    các bạn trả lời giúp mình một câu hỏi này nhé: nội dung : mình làm bài tập đọc encoder, gửi chiều quay và số xung đọc được của chiều quay đó lên cho máy tính (mình dùng encoder tuơng đối)(mình có kèm theo code viết trong c)- trên máy tính khi mình thử với nút nhấn thì nó nhận ổn định lắm, nhưng khi đưa encoder thât nối với VDK thì nó nhảy loạn xạ, trong chuơng trình viết cho VDK mình dùng ngắt ngoài 1 nối với 1 chân tạo xung encoder, khi nào có ngắt ngoài thì mình kiểm tra tiếp xung còn lại, nếu xung còn lại đang ở mức 1 thì xác định nó dang quay thuận - nếu đang ở mức 0 thì là quay nghịch, code mình viết như vậy đấy, mà sao khi mình thử với encoder quay bằng tay(chỉ quay theo một chiều duy nhất) thế mà có lúc nó nó gửi lên cho máy tính đang quay thuận có lúc gửi cho máy tính là quay nghịch- còn đếm xung cũng vậy, đếm lung tung. huhu ai đã làm về encoder rồi vui lòng giúp em với

    em cảm ơn

    code:

    #include<reg51.h>
    #include<math.h>

    sbit xung_a=P3^3; // thu xung a cua encoder-ngat ngoai 1 -PIN 13
    sbit xung_b=P1^7; //thu xung b cua encoder
    bit thu;
    void isr_external1(void) interrupt 2
    {
    //delayms(14);
    thu=xung_b;
    if(thu==1)
    gui_serial('k'); //gui kt quay nguoc chieu kim dong ho
    else
    gui_serial('c'); //quay cung chieu dong ho
    led=~led;
    }

    void main(void)
    {
    TMOD=0x20;
    TH1=-3;
    TR1=1;
    SM1=1;
    REN=1;
    EA=1;
    EX1=1;
    IT1=1;
    xung_a=1;
    xung_b=1;
    TI=0;
    while(1);
    }
    void gui_serial(unsigned char tam)
    {
    TI=0;
    SBUF=tam;
    while(TI==0);
    }

  • #2
    Nguyên văn bởi thanhnguyen0 Xem bài viết
    các bạn trả lời giúp mình một câu hỏi này nhé: nội dung : mình làm bài tập đọc encoder, gửi chiều quay và số xung đọc được của chiều quay đó lên cho máy tính (mình dùng encoder tuơng đối)(mình có kèm theo code viết trong c)- trên máy tính khi mình thử với nút nhấn thì nó nhận ổn định lắm, nhưng khi đưa encoder thât nối với VDK thì nó nhảy loạn xạ, trong chuơng trình viết cho VDK mình dùng ngắt ngoài 1 nối với 1 chân tạo xung encoder, khi nào có ngắt ngoài thì mình kiểm tra tiếp xung còn lại, nếu xung còn lại đang ở mức 1 thì xác định nó dang quay thuận - nếu đang ở mức 0 thì là quay nghịch, code mình viết như vậy đấy, mà sao khi mình thử với encoder quay bằng tay(chỉ quay theo một chiều duy nhất) thế mà có lúc nó nó gửi lên cho máy tính đang quay thuận có lúc gửi cho máy tính là quay nghịch- còn đếm xung cũng vậy, đếm lung tung. huhu ai đã làm về encoder rồi vui lòng giúp em với

    em cảm ơn

    code:

    #include<reg51.h>
    #include<math.h>

    sbit xung_a=P3^3; // thu xung a cua encoder-ngat ngoai 1 -PIN 13
    sbit xung_b=P1^7; //thu xung b cua encoder
    bit thu;
    void isr_external1(void) interrupt 2
    {
    //delayms(14);
    thu=xung_b;
    if(thu==1)
    gui_serial('k'); //gui kt quay nguoc chieu kim dong ho
    else
    gui_serial('c'); //quay cung chieu dong ho
    led=~led;
    }

    void main(void)
    {
    TMOD=0x20;
    TH1=-3;
    TR1=1;
    SM1=1;
    REN=1;
    EA=1;
    EX1=1;
    IT1=1;
    xung_a=1;
    xung_b=1;
    TI=0;
    while(1);
    }
    void gui_serial(unsigned char tam)
    {
    TI=0;
    SBUF=tam;
    while(TI==0);
    }


    Mình đang làm đồ án về cái đề tài giống bạn. Mình sử dụng 89xxx, encoder 100 xung, xung A và B mình đưa vào 2 chân T0 và T1 Mình chưa viết được chương trình giao tiếp máy tính nữa. Có gì bạn giúp đỡ mình với nhé ,cung thảo luận và chia sẻ. Bạn gửi đề tài vào email nay nhé: dakknight_lonely02@yahoo.com
    PS: Cùng trao đổi nhé

    Comment


    • #3
      Sao bạn không đềm số xung và hiển thị số xung đếm được lên PC, còn chiều quay thì nên dùng led để hiển thị trước đã vì khi bạn dùng tay quay có thể lúc bạn buông tay ra để quay lần tiếp theo thì động cơ bị "giật lùi" nên VDK sẽ đọc là chiều ngược lại.
      Bạn cấp nguồn cho động cơ quay liên tục thử xem chiều đọc được có bị lộn nữa không!

      Mình viết bằng ASM nên nên không biết nói code của bạn thế nào.

      Comment


      • #4
        Nguyên văn bởi designer Xem bài viết
        Sao bạn không đềm số xung và hiển thị số xung đếm được lên PC, còn chiều quay thì nên dùng led để hiển thị trước đã vì khi bạn dùng tay quay có thể lúc bạn buông tay ra để quay lần tiếp theo thì động cơ bị "giật lùi" nên VDK sẽ đọc là chiều ngược lại.
        Bạn cấp nguồn cho động cơ quay liên tục thử xem chiều đọc được có bị lộn nữa không!

        Mình viết bằng ASM nên nên không biết nói code của bạn thế nào.
        như bạn nói có thể đúng là động cơ khi quay bằng tay có thể bị giật lùi. nên nó nhảy tùm lum, mình cho encoder gửi xung liên tục lên PC, có nghĩa là mỗi khi có ngắt ngoài là gửi lên máy tính liền, cách này chỉ áp dụng với động cơ quay với tốc độ chậm, còn khi mình tăng tốc động cơ lên nhanh hơn thì trên PC nó "đơ" luôn.

        kg biết mọi người có ý kiến hay cách nào khác để đọc giá trị của encoder chính xác hơn kg thì giúp mình với !!!

        cảm ơn nhiều

        Comment


        • #5
          Nguyên văn bởi Mr_se7en Xem bài viết
          Mình đang làm đồ án về cái đề tài giống bạn. Mình sử dụng 89xxx, encoder 100 xung, xung A và B mình đưa vào 2 chân T0 và T1 Mình chưa viết được chương trình giao tiếp máy tính nữa. Có gì bạn giúp đỡ mình với nhé ,cung thảo luận và chia sẻ. Bạn gửi đề tài vào email nay nhé: dakknight_lonely02@yahoo.com
          PS: Cùng trao đổi nhé
          chào bạn, có gì mình cùng trao đổi nha!! à mà mình làm là kg phải đề tài đâu bạn ạ, chỉ là bài tập thôi bạn.

          Comment


          • #6
            Nguyên văn bởi thanhnguyen0 Xem bài viết
            chào bạn, có gì mình cùng trao đổi nha!! à mà mình làm là kg phải đề tài đâu bạn ạ, chỉ là bài tập thôi bạn.
            Ok! bạn gửi vào email mình đi rồi có địa chỉ mình gửi lại cho bạn sơ đồ và mô phỏng . Nhớ gửi cả giao tiếp nữa nhé (full) để mình cùng nghiên cứu

            Comment


            • #7
              Nguyên văn bởi thanhnguyen0 Xem bài viết
              như bạn nói có thể đúng là động cơ khi quay bằng tay có thể bị giật lùi. nên nó nhảy tùm lum, mình cho encoder gửi xung liên tục lên PC, có nghĩa là mỗi khi có ngắt ngoài là gửi lên máy tính liền, cách này chỉ áp dụng với động cơ quay với tốc độ chậm, còn khi mình tăng tốc động cơ lên nhanh hơn thì trên PC nó "đơ" luôn.

              kg biết mọi người có ý kiến hay cách nào khác để đọc giá trị của encoder chính xác hơn kg thì giúp mình với !!!

              cảm ơn nhiều
              Đúng là khi encoder quay bằng tay có thể bị giật lùi vì trục encoder ko tròn mà có cạnh. mình vừa chế 1 cái bánh xe và 1 cái động cơ cho encoder quay. Dùng biến áp thay đổi được điện áp để điều khiển động cơ

              Comment


              • #8
                Nguyên văn bởi thanhnguyen0 Xem bài viết
                như bạn nói có thể đúng là động cơ khi quay bằng tay có thể bị giật lùi. nên nó nhảy tùm lum, mình cho encoder gửi xung liên tục lên PC, có nghĩa là mỗi khi có ngắt ngoài là gửi lên máy tính liền, cách này chỉ áp dụng với động cơ quay với tốc độ chậm, còn khi mình tăng tốc động cơ lên nhanh hơn thì trên PC nó "đơ" luôn.

                kg biết mọi người có ý kiến hay cách nào khác để đọc giá trị của encoder chính xác hơn kg thì giúp mình với !!!

                cảm ơn nhiều
                Bạn đang hỏi vì sao chương trình của bạn xác định chiều quay không đúng nên mình nói chung như vậy, còn về PC bị "đơ" còn phụ thuộc vào tốc độ truyền nhận dữ liệu, bạn truyền lên PC lúc nào nữa (nếu mỗi ần co ngắt ngoài là truyền lên PC 1 lần thì không "đơ" mới lạ). Bạn có thể định thời gian truyền lên PC 100ms/lần xem, nhắc lại chiều quay bạn nên dùng 2 con led hiển thị trên phần cứng trước đã rồi hãy nghĩ tới việc truyền nó lên PC, khi hiển thị led sẽ không có chuyện PC bi "đơ" vì bạn có làm gì dính đến PC nữa đâu.

                Có gì sai mọi người chỉ giúp mình nha.

                Comment


                • #9
                  jump:
                  If encoder1=0 and encoder2 =0 then
                  Goto next
                  else
                  Goto jump
                  end if
                  next:

                  if encoder 1=1 then
                  goto next1
                  else
                  goto next
                  end if

                  next1:
                  if encoder2 =1 then
                  Print " Quay phải"
                  else
                  Print " Quay trái"
                  end if

                  Nếu encoder quay nhanh tí thì thời gian thực hiện đoạn code trên cũng ko ảnh hưởng lớn đến chương trình ^^
                  Have fun

                  0988467839

                  Comment


                  • #10
                    cảm ơn các bạn designer và duonghoangMr_se7en đã nhiệt tình góp ý.

                    còn cách của bạn designer và duonghoang để mình thử lại rồi thông báo kết quả cho sau nhé .

                    chân thành cảm ơn.

                    Comment


                    • #11
                      Nguyên văn bởi thanhnguyen0 Xem bài viết
                      cảm ơn các bạn designer và duonghoangMr_se7en đã nhiệt tình góp ý.

                      còn cách của bạn designer và duonghoang để mình thử lại rồi thông báo kết quả cho sau nhé .

                      chân thành cảm ơn.
                      Sao chưa gửi mail vậy?

                      Comment


                      • #12
                        Nguyên văn bởi Mr_se7en Xem bài viết
                        Sao chưa gửi mail vậy?
                        đợi tui viết cái code, mốt nộp bài tập mà cái encoder chưa đọc ổn định nữa, bực mình ghê, bây giờ đang đang chạy đua với thời gian đây, chờ tui rảnh rảnh tí tui gửi cho nha.!

                        Comment


                        • #13
                          Nguyên văn bởi thanhnguyen0 Xem bài viết
                          đợi tui viết cái code, mốt nộp bài tập mà cái encoder chưa đọc ổn định nữa, bực mình ghê, bây giờ đang đang chạy đua với thời gian đây, chờ tui rảnh rảnh tí tui gửi cho nha.!
                          Ok, thanks bạn nhiều

                          Comment


                          • #14
                            Bạn đã làm xong chưa? sao chưa thấy gửi wa cho mình vậy???????????

                            Comment


                            • #15
                              Mình làm cái này rồi, lúc đó cũng hiển thị quay giật lùi khi động cơ sắp dừng lại. Tuy nhiên sau khi tối ưu thời gian xử lý ngắt cho mỗi lần ngắt thì hết, đảm bảo sai số encode gần như là không. Mình viết chương trình ở đây bằng ASM bạn có thể tham khảo. Chương trình viết bằng C mình mất rồi, bạn có thể chuyển qua C được. Còn nếu không chạy được nữa thì có lẽ nên kiểm tra lại encoder đi bạn ạ.
                              http://dientuvietnam.net/forums/showthread.php?t=31853
                              Ở đây có cả hiển thị giao điện bằng máy tính viết bằng VB, bạn chỉ cần viết chương trình vxl tương thích với chương Vb là có thể điều khiển được động cơ luôn.
                              Còn chương trình C để mình tìm lại đã. Nếu cần mình sẽ gởi bạn chương trình VB hoàn chỉnh.
                              Thân chào!
                              Last edited by tri_cuong46; 29-12-2009, 08:59.
                              Cường - Giải Pháp IOT Việt
                              https://iotvn.vn

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X