Thông báo

Collapse
No announcement yet.

[Encoder] Vấn đề mất xung encoder khi điều khiển động cơ!

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

  • [Encoder] Vấn đề mất xung encoder khi điều khiển động cơ!

    Chào các anh!

    Em đang làm 1 bộ điều khiển vị trí động cơ DC ( theo nguyên tắc cascade). Em gặp vấn đề như sau:

    Khi set cho động cơ 1 vị trí nhất định thì động cơ di chuyển đến và dừng ở 1 vị trí lân cận với vị trí đặt (sai lệch 1-3 xung). Tuy nhiên, khi đánh dấu và xem xét chuyển động thực của động cơ thì e nhận thấy sai lệch vị trí lớn hơn sai lệch mà vi điều khiển phát hiện được. Như vậy, có phải em đã bị mất xung trong quá trình động cơ chạy hay không? Mong các anh sớm giải đáp giúp em với nhé!

    Thanks

    Haquang

  • #2
    như vậy là trong quá trình chạy xảy ra hiện tượng trượt khớp răng của động cơ với bánh xe chăng
    Cái gì biết nói biết. Cái không biết nói không biết. Ấy là biết đấy!
    email:

    Comment


    • #3
      Có sai số chứ bạn, do mặt sân chăng, hoặc do chính encoder của bạn, không dám chắc là chạy tốt hoàn toàn.
      Học đến bao giờ mới thành tài?

      Comment


      • #4
        Em mới chỉ test điều khiển động cơ không thôi, chưa cho chạy với tải!

        Sai số mà Vi điều khiển không xác định được (error = 0) thì chắc không thể khắc phục trên thuật toán được rồi! Em nghe các bác tiền bối bảo bọn nước ngoài nó điều chỉnh chuẩn xác đến từng xung, không biết e pải tiếp tục thế nào để nâng cao độ chính xác, các bác nhỉ??

        Comment


        • #5
          Đó có lẽ là vấn đề phần cứng của bạn. Bạn nên mô tả kỹ hơn và nếu có hình ảnh cụ thể thì mọi người mới giúp đỡ được chứ

          Comment


          • #6
            Em chưa thiết kế mạch đặt mà thử trên mạch test nên chưa đưa sơ đồ lên được! Để em mô tả phần hardware lại vậy:

            1. Vi điều khiển: PIC
            2. Đầu vào: Đọc xung encoder từ ngắt ngoài trên chân RB0, kênh còn lại e nối vào RB1. Đếm xung trên RB0 và dựa vào mức tín hiệu của RB1 để đếm tiến hay lùi. Phần này em đã test và khi quay đủ 1 vòng (bằng tay) thì đếm được 240 xung (encoder 240 xung).
            3. Đầu ra: PWM
            4. Thuật toán PID: em dùng PID cho cả 2 vòng điều khiển. Đưa các thông số vị trí đặt, tốc độ đặt, sai lệch vị trí lên PC để theo dõi. Phần này test từng bước trên PC và em thấy đúng theo lí thuyết PID.


            Em mô tả như thế không biết đã đủ chưa?? Mong các anh comment cho em để em khắc phục lỗi sai lệch nhé!

            Comment


            • #7
              dùng encoder tín hiệu vi sai sẽ tốt hơn dùng single end.

              b.r

              Comment


              • #8
                Nguyên văn bởi haquang Xem bài viết
                Em chưa thiết kế mạch đặt mà thử trên mạch test nên chưa đưa sơ đồ lên được! Để em mô tả phần hardware lại vậy:

                1. Vi điều khiển: PIC
                2. Đầu vào: Đọc xung encoder từ ngắt ngoài trên chân RB0, kênh còn lại e nối vào RB1. Đếm xung trên RB0 và dựa vào mức tín hiệu của RB1 để đếm tiến hay lùi. Phần này em đã test và khi quay đủ 1 vòng (bằng tay) thì đếm được 240 xung (encoder 240 xung).
                3. Đầu ra: PWM
                4. Thuật toán PID: em dùng PID cho cả 2 vòng điều khiển. Đưa các thông số vị trí đặt, tốc độ đặt, sai lệch vị trí lên PC để theo dõi. Phần này test từng bước trên PC và em thấy đúng theo lí thuyết PID.


                Em mô tả như thế không biết đã đủ chưa?? Mong các anh comment cho em để em khắc phục lỗi sai lệch nhé!
                Đọc xung encoder như vậy sẽ không chính xác được đâu bạn . Bạn phải mắc cả 2 kênh vào 2 ngắt trên VDK và cả 2 ngắt đều phải kiểm soát cả cạnh xuống và cạnh lên .

                Comment


                • #9
                  Nguyên văn bởi kaokuong Xem bài viết
                  Đọc xung encoder như vậy sẽ không chính xác được đâu bạn . Bạn phải mắc cả 2 kênh vào 2 ngắt trên VDK và cả 2 ngắt đều phải kiểm soát cả cạnh xuống và cạnh lên .
                  Anh KaoKuong giải thích thêm giúp em được không ạ? Tại sao lại phải bắt xung cả 2 kênh mới chính xác? Về mặt nguyên tắc thì mình bắt 1 kênh là đủ chứ nhỉ??

                  Nếu dùng 2 ngắt thì 1 ngắt là ngắt ngoài trên RB0 rồi, còn 1 ngắt là trên chân nào ( Ngắt RB, RC hay ngắt timer,..). Mong a đưa ra lời khuyên cho em với!

                  Còn nữa, encoder ghi là 240 xung tức là tương ứng với 1 vòng quay động cơ, mỗi kênh của encoder sẽ bắt được 240 xung lên. Như vậy, nếu bắt cả 2 kênh và cả 2 sườn xung thì sẽ là 4x240 xung trên 1 vòng?

                  Mình sẽ giải quyết thế nào trong trường hợp mất 1 xung nào đó trên 1 kênh nào đó tại 1 thời điểm nào đó??

                  Hi, em có hơi nhiều thắc mắc, mong a giải đáp nhé!


                  Thanks

                  b.r
                  Haquang

                  Comment


                  • #10
                    Mình không có thói quen share code mà chỉ hướng dẫn thôi. Do đó bạn có thắc mắc gì thì nêu ra mình sẽ cố gắng trả lời trong phạm vi hiểu biết .Bạn chịu khó mày mò sẽ phát hiện ra nhiều điều thú vị .
                    - Nếu chỉ bắt 1 cạnh rồi dựa vào mức của kênh còn lại bạn sẽ chỉ đếm được chính xác khi motor quay liên tục còn khi có sự thay đổi tới lui thì nó sẽ bị nhầm chiều quay ngay. Bạn có thể vẽ giản đồ thời gian và đặt ra các khả năng sẽ thấy sai.
                    -Bạn phải dùng 2 ngắt ngoài với độ nhạy cảm cả cạnh lên và xuống .
                    - Với 1 encoder 240 xung mỗi kênh bạn phát hiện ra sự thay đổi trên cả 2 cạnh bạn sẽ có được độ phân giải 960 xung/vòng . người ta gọi đó là chế độ x4 .
                    -Nếu giải thuật tốt ,tốc độ VXL đáp ứng kịp và không bị nhiễu bạn sẽ không bao giờ sai 1 xung nào dù hoạt động mấy ngày liên tục.

                    Comment


                    • #11
                      Nguyên văn bởi kaokuong Xem bài viết
                      Mình không có thói quen share code mà chỉ hướng dẫn thôi. Do đó bạn có thắc mắc gì thì nêu ra mình sẽ cố gắng trả lời trong phạm vi hiểu biết .Bạn chịu khó mày mò sẽ phát hiện ra nhiều điều thú vị .
                      - Nếu chỉ bắt 1 cạnh rồi dựa vào mức của kênh còn lại bạn sẽ chỉ đếm được chính xác khi motor quay liên tục còn khi có sự thay đổi tới lui thì nó sẽ bị nhầm chiều quay ngay. Bạn có thể vẽ giản đồ thời gian và đặt ra các khả năng sẽ thấy sai.
                      -Bạn phải dùng 2 ngắt ngoài với độ nhạy cảm cả cạnh lên và xuống .
                      - Với 1 encoder 240 xung mỗi kênh bạn phát hiện ra sự thay đổi trên cả 2 cạnh bạn sẽ có được độ phân giải 960 xung/vòng . người ta gọi đó là chế độ x4 .
                      -Nếu giải thuật tốt ,tốc độ VXL đáp ứng kịp và không bị nhiễu bạn sẽ không bao giờ sai 1 xung nào dù hoạt động mấy ngày liên tục.
                      Trước hết, cảm ơn bác vì lời khuyên của bác. Em cũng hiểu ra vấn đề mà bác nói. Em đang ở nhà nên chưa test được xem có đúng là vấn đề đang xảy ra với project của em không. Em sẽ kiểm tra lại khi lên cơ quan.


                      Có điều, xin lỗi bác, em hơi phật lòng với câu đầu tiên của bác! Trong tất cả các thắc mắc từ trước đến nay em hỏi trên diễn đàn, chưa bao giờ em mở miệng xin code ai cả. Và nói thẳng thắn, bác không có thói quen share code thì em cũng không có thói quen xin code.

                      Dù sao cũng thanks bác nhiều lắm

                      Comment


                      • #12
                        Nguyên văn bởi haquang Xem bài viết
                        Trước hết, cảm ơn bác vì lời khuyên của bác. Em cũng hiểu ra vấn đề mà bác nói. Em đang ở nhà nên chưa test được xem có đúng là vấn đề đang xảy ra với project của em không. Em sẽ kiểm tra lại khi lên cơ quan.


                        Có điều, xin lỗi bác, em hơi phật lòng với câu đầu tiên của bác! Trong tất cả các thắc mắc từ trước đến nay em hỏi trên diễn đàn, chưa bao giờ em mở miệng xin code ai cả. Và nói thẳng thắn, bác không có thói quen share code thì em cũng không có thói quen xin code.

                        Dù sao cũng thanks bác nhiều lắm
                        Công nhận đọc lại câu đó mình cũng thấy phản cảm thật. Có lẽ mình lang thang trên các diễn đàn thấy nhiều bạn học sinh gặp vấn đền chẳng chịu tìm hiểu gì đã hỏi và thậm chí nhờ làm dùm nên mình mang thành kiến không tốt .
                        Trước đây lần đầu tiên làm bộ đếm có xác định chiều quay mình cũng gặp vấn đề như bạn đó .Làm mình mất ăn mất ngủ mấy ngày phải cầu cứu diễn đàn và được chỉ là dùng IC chuyên dụng nhưng kiếm chẳng ra ic đó đành phải mò mẫm viết code cho VDK .

                        Comment


                        • #13
                          Bạn thử cho hệ thống chạy thử trong 1 thời gian dài hơn xem sao, nếu thấy sai số lớn dần lên thì có thể là do chương trình, nếu sai số giữ nguyên như vậy bạn hãy căn chỉnh lại phần cứng.
                          Thân

                          Comment


                          • #14
                            Thanks các bác!
                            Em tạm xong phần điều khiển động cơ quay trong 1 góc <360 độ. Em đã thử chỉnh định hệ số PID của 2 vòng, thấy sai số tạm chấp nhận được! Thời gian tới em sẽ xem xét sai số của hệ xem có cải thiện được không!

                            Cảm ơn các bác đã giúp đỡ nhiều

                            B.r
                            Haquang

                            Comment


                            • #15
                              mình co encoder 5 dây, nhưng ko hiểu rõ mấy, các dây tín hiệu mình nối thẳng vào PIC hay là còn phải qua 1 mạch gì nữa, có người nói mình là phải qua mạch so sánh để đạt được vận tốc theo ý muốn, ko biết co đúng o,
                              ai giúp mình với
                              thanks !!!
                              |

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X