RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Module Quadrature Encoder Interface (QEI)

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • falleaf
    PIC Bang chủ
    • May 2005
    • 2627

    #1

    Module Quadrature Encoder Interface (QEI)

    Mở luồng này để các bạn thảo luận và trang bị những kiến thức cơ bản về QEI vì chưa thấy luồng thảo luận về vấn đề này được mở ra.

    Chúc vui.

    Tài liệu tham khảo:
    [1] Section 16. Quadrature Encoder Interface (QEI) - dsPIC30F FRM
    [2] Cảm biến encoder, dùng loại nào: Absolute - Incremental
    [3] AN908: Using the dsPIC30F for Vector Control of an ACIM
    [4] Datasheet dsPIC30F6010A
    Last edited by falleaf; 30-10-2007, 03:13 PM.
    Công ty TNHH Thương mại và Giao nhận R&P
    store.hn@rpc.vn - store.hcm@rpc.vn

    Học PIC như thế nào?
  • huybo02
    Đệ tử 4 túi
    • Aug 2006
    • 61

    #2
    QEI ( Quadrature Encoder Interface ) là module dùng để giao tiếp với Quadrature Encoder (hay còn gọi là incremental encoder ).

    Thông tin về incremental encoder đã được anh F giới thiệu trong phần cảm biến:

    Incremental encoder có thể dùng để định vị và xác định vận tốc của một chuyển động quay quanh trục và được dùng phổ biến trong các động cơ do cấu tạo đơn giản,rẻ tiền và độ phân giải lớn.
    Incremental encoder gồm 2 pha: pha A và pha B và có thể thêm pha index. Pha A và B để xác định vận tốc và chiều quay. Pha index dùng để đối chiếu, xác định số vòng quay và tham chiếu vị trí.

    Để tính vận tốc ta có thể xác định số xung của encoder trong 1 khoảng thời gian và chia cho độ phân giải ta được vận tốc trong 1 đơn vị thời gian. Ví dụ encoder có độ phân giải 400pps (pulses per revolution) và trong 1s ta đếm được 1000 xung => tốc độ quay là 1000/400 = 2.5 vòng/giây. Để xác định vận tốc này trong PIC ta có thể dùng ngắt ngoài RB0, mỗi lần ngắt ta đếm thêm 1 xung và sau một khoảng thời gian ta xác định số xung, chia cho khoảng thời gian thì tìm được vận tốc.

    Để xác định chiều quay ta dùng cả hai pha A và B. Nếu pha A nhanh hơn pha B => quay theo chiều thuận và ngược lại. Một cách khác để xác định chiều quay được anh F giới thiệu:



    Hình trên là hình xung incremental encoder.

    Các bạn thấy rằng nếu như khi xung A đang từ mức cao xuống mức thấp, mà lúc đó B đang ở mức thấp, thì chúng ta sẽ xác định được chiều chuyển động của encoder theo chiều mũi tên màu cam.

    Nếu A đang từ mức cao xuống mức thấp, mà B đang ở mức cao, thì chúng ta sẽ biết encoder đang quay theo chiều màu nâu.
    Ta có thể dùng phương pháp này để lập trình cho QEI bằng cách phát hiện cạnh xung xuống của pha A, cập nhật giá trị pha B và suy ra chiều quay.

    Có thể nối pha A vào RB0 dùng ngắt ngoài theo cạnh xuống và lúc xảy ra ngắt kiểm tra giá trị của pha B (nối vào RB1 chẳng hạn và RB1 được khai báo là input):

    Code:
    #INT_EXT
    void ngat_RB0()
    {
    xung++;                             // tăng biến xung
    if (RB1 ==0) chieu =thuan;     // xét giá trị pha B nếu pha B ở mức thấp => chiều thuận 
    else chieu = nguoc;               // ngược lại chiều ngược
    }
    hoặc dùng ngắt onchange RB với ngắt xảy ra cả hai cạnh lên và xuống. Bằng cách này ta có thể dùng encoder với độ phân giải gấp 4 lần độ phân giải danh định:

    Code:
    #INT_RB
    void ngat_RB()
    {
       xung++;
       n = m;             //giá trị trước của pha A
       m = RB7;          // giá trị hiện tại của pha A
       if (m<n)           // cạnh xuống pha A
       {
          if(RB6==1)    // xét giá trị pha B
          q=0;             // => chiều quay 
          else  q=1;
       }
    }
    Last edited by huybo02; 30-10-2007, 12:06 AM.

    Comment

    • nhh
      Đệ tử 9 túi
      • Feb 2006
      • 174

      #3
      PIC/dsPIC có hỗ trợ module QEI thì ko việc gì phải dùng đến ngắt ngoài RB0 hay ngắt RB4-RB7, thế thì còn gì là module QEI.

      Lật ngay datasheet con nào hỗ trợ QEI như PIC18F4331, dsPIC2010,...phần QEI rất rõ ràng.

      Ko hiểu bạn đang thảo luận về module QEI hay cách đọc encoder.
      Ngày mai bắt đầu từ ngày hôm nay

      Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
      http://www.picvietnam.com/forum//showthread.php?t=1263

      Comment

      • bigtitan
        Đệ tử 3 túi
        • Oct 2005
        • 47

        #4
        Vậy dùng QEI như thế nào.Bác nào có thể cho xin code ví dụ được ko,ds hay 18F cũng đc.

        Comment

        • truongthont
          Nhập môn đệ tử
          • Jul 2007
          • 1

          #5
          Cho mình hỏi về cách thiết lập module QEI trong 30f4011,nhận xung encoder 2 pha từ động cơ.encoder của mình không có chân INDEX.
          Mình thiết lập như thề này nhưng vẫn chưa đọc đuoc POSCNT
          Ai biết thì chỉ dùm mình nhé.

          Code:
          void InitQEI(void) 
          {
           
          ADPCFG  |=  0x0038;    // Configure QEI pins as digital inputs
          QEICONbits.QEIM  =  0; // Disable QEI Module
          QEICONbits.CNTERR = 0;// Clear any count errors
          QEICONbits.QEISIDL  =  0;// Continue operation during sleep
          QEICONbits.SWPAB  =  0;  // QEA and QEB not swapped
          QEICONbits.PCDOUT  =  0; // Normal I/O pin operation
          QEICONbits.POSRES  =  1; // Index pulse resets position counter
          DFLTCONbits.CEID  =  1;  // Count error interrupts disabled
          DFLTCONbits.QEOUT  =  1; // Digital filters output enabled for QEn pins 
          DFLTCONbits.QECK  =  5;  //  1:64 clock divide for digital filter for QEn 
          //DFLTCONbits.INDOUT  =  1;// Digital filter output enabled for Index pin
          //DFLTCONbits.INDCK  =  5;//  1:64 clock divide for digital filter for Index
          POSCNT  =  0;			 // Reset position counter
          QEICONbits.QEIM  =  6;   // X4 mode with position counter reset by Index 
          
          }
          Last edited by namqn; 05-05-2008, 05:29 PM.

          Comment

          • scentoflove
            Đệ tử 6 túi
            • Mar 2006
            • 129

            #6
            QEI của dspic 30f4011 có digital filter output. Em muốn hỏi hoạt động của bộ filter này như thế nào.

            Comment

            • tungtuantu
              Đệ tử 3 túi
              • Apr 2006
              • 54

              #7
              em thấy luồng này rất hay sao ko phát triển thêm hả anh F, bác viết bài huóng dẫn bọn em với

              Comment

              • NGUYEN VU BAO
                Nhập môn đệ tử
                • Jun 2005
                • 1

                #8
                Dưới đây là cách khởi động QEI.
                NHớ TRIS các chân A,B,và index
                Giá trị xung nằm trong thanh ghi POSCNT

                void setup_encoder(void)
                {
                ADPCFG = 0xffff; // all digital IO
                MAXCNT = 0xffff; // (used as preset when index pulse seen)
                POSCNT = 0x0000;
                QEICON = 0; // clr CNTERR bit (among others)
                QEICONbits.QEIM = 6; // x4 reset by index pulse
                QEICONbits.POSRES = 0; // TRICK! dont allow index to reset counter
                DFLTCON = 0; // digital filter set off
                DFLTCONbits.IMV = 3; // in x4 mode,
                DFLTCONbits.QEOUT = 1; // enable digital filter on phase a,b,i
                /* set up interrupts for encoder */
                IFS2bits.QEIIF = 0; // clear Interrupt flag
                IPC10bits.QEIIP = 1; // bits <2:0> are the priority
                IEC2bits.QEIIE = 1; // go live
                }

                Comment

                • lion
                  Đệ tử 6 túi
                  • May 2007
                  • 126

                  #9
                  em cũng đang tìm hiểu cái này , nhưng em biết ít tiếng anh chuyên ngành quá nên không cắt được nghĩa

                  bác nào tốt bụng thì có thể hướng dẫn cụ thể cho anh em trong bang học hỏi với .
                  Nếu dịch cái modul QEI ra tiếng việt thì càng tốt, để có cái sườn mà nghiên cứu

                  Comment

                  • conglong
                    Đệ tử 4 túi
                    • Jan 2008
                    • 68

                    #10
                    Nguyên văn bởi lion View Post
                    em cũng đang tìm hiểu cái này , nhưng em biết ít tiếng anh chuyên ngành quá nên không cắt được nghĩa

                    bác nào tốt bụng thì có thể hướng dẫn cụ thể cho anh em trong bang học hỏi với .
                    Nếu dịch cái modul QEI ra tiếng việt thì càng tốt, để có cái sườn mà nghiên cứu
                    Thiết nghĩ QEI là module không thể thiếu để điều khiển động cơ có sử dụng thuật toán PID nên mong các anh (nhh...), các thầy (Thấy Nam hoặc F) hướng dẫn những người mới làm quen với PIC / dsPIC về module này kĩ hơn , như có một tutorial về QEI như Thầy Nam đã làm với các module ADC, PWM, I2C..., Em đã đọc dsPIC30 RMF document nhưng vẫn thấy trừu tượng với module này qua.
                    Em cảm ơn.
                    Trân trọng !.
                    Không có gì là Không thể, chỉ một điều Không thể khi bạn nghĩ nó Không thể !.
                    Bạn có thể nếu bạn tin bạn có thể !.

                    Comment

                    • wakener_thesun
                      Nhập môn đệ tử
                      • Oct 2009
                      • 6

                      #11
                      em đang làm về module này, nhưng gặp phải vấn đề ko biết phải viết CCS cho module này như thế nào. em đã đọc hết datasheet của con 18f4431, cũng biết được cách hoạt động của module này rồi. Nhờ các anh hướng dẫn giúp.

                      cụ thể là em đang viết chương trình nhận xung từ encoder. loại encoder em đang sử dụng là loại encoder 6 dây, bao gồm 1 dây nguồn, 1 dây mass, 2 dây là pha a và pha b, 2 dây còn lại không sử dụng. 2 dây pha này em nối vào 2 chân QEA và QEB của píc8F4431, em xin hỏi viết code như thế nào để có thể đếm xung nhận được từ 2 pha của encoder

                      Thanks
                      Last edited by wakener_thesun; 13-11-2010, 06:20 PM.

                      Comment

                      • ngcanh_dtdn
                        Nhập môn đệ tử
                        • Jul 2010
                        • 4

                        #12
                        CCS phiên bản mới đã có lệnh hỗ trợ QEI nhưng mình chưa thử bao giờ, bạn vào đó đọc xem có thu được gì không.
                        ngcanhdtdn@gmail.com

                        Comment

                        • wakener_thesun
                          Nhập môn đệ tử
                          • Oct 2009
                          • 6

                          #13
                          Nguyên văn bởi ngcanh_dtdn View Post
                          CCS phiên bản mới đã có lệnh hỗ trợ QEI nhưng mình chưa thử bao giờ, bạn vào đó đọc xem có thu được gì không.
                          mình đang dùng version 4.074 mà ko thấy có. Version mà bạn nói là version bao nhiêu?

                          thanks

                          Comment

                          • ngcanh_dtdn
                            Nhập môn đệ tử
                            • Jul 2010
                            • 4

                            #14
                            Bản mình đang dùng là v4.107 trong Help có đoạn sau
                            Code:
                            setup_qei( )
                            --------------------------------------------------------------------------------
                            Syntax: setup_qei( [unit,]options, filter,maxcount );
                             
                            Parameters: Options- The mode of the QEI module. See the devices .h file for all options
                            
                            Some common options are:
                            
                              · QEI_MODE_X2
                            
                              · QEI_TIMER_GATED
                            
                              · QEI_TIMER_DIV_BY_1
                            
                            filter- This parameter is optional and the user can specify the digital filter clock divisor.
                            
                            maxcount- This will specify the value at which to reset the position counter.
                            
                            unit- Optional unit number, defaults to 1.
                             
                            Returns: void 
                             
                            Function: Configures the Quadrature Encoder Interface. Various settings like modes, direction can be setup. 
                             
                            Availability: Devices that have the QEI module.
                            
                            Requires: Nothing.
                             
                            Examples: setup_qei(QEI_MODE_X2|QEI_TIMER_INTERNAL,QEI_FILTER_DIV_2,QEI_FORWARD);
                            
                            Example Files: None 
                            
                            Also See:  qei_set_count() , qei_get_count() , qei_status().
                            ngcanhdtdn@gmail.com

                            Comment

                            • wakener_thesun
                              Nhập môn đệ tử
                              • Oct 2009
                              • 6

                              #15
                              Nguyên văn bởi ngcanh_dtdn View Post
                              Bản mình đang dùng là v4.107 trong Help có đoạn sau
                              Code:
                              setup_qei( )
                              --------------------------------------------------------------------------------
                              Syntax: setup_qei( [unit,]options, filter,maxcount );
                               
                              Parameters: Options- The mode of the QEI module. See the devices .h file for all options
                              
                              Some common options are:
                              
                                · QEI_MODE_X2
                              
                                · QEI_TIMER_GATED
                              
                                · QEI_TIMER_DIV_BY_1
                              
                              filter- This parameter is optional and the user can specify the digital filter clock divisor.
                              
                              maxcount- This will specify the value at which to reset the position counter.
                              
                              unit- Optional unit number, defaults to 1.
                               
                              Returns: void 
                               
                              Function: Configures the Quadrature Encoder Interface. Various settings like modes, direction can be setup. 
                               
                              Availability: Devices that have the QEI module.
                              
                              Requires: Nothing.
                               
                              Examples: setup_qei(QEI_MODE_X2|QEI_TIMER_INTERNAL,QEI_FILTER_DIV_2,QEI_FORWARD);
                              
                              Example Files: None 
                              
                              Also See:  qei_set_count() , qei_get_count() , qei_status().
                              vậy bạn gửi bộ setup cho mình qua mail được ko? mail mình là daovietkimlong@gmail.com

                              thanks

                              Comment

                              Working...