PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   Module Quadrature Encoder Interface (QEI) (http://www.picvietnam.com/forum/showthread.php?t=1646)

falleaf 29-10-2007 02:28 PM

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

huybo02 29-10-2007 11:55 PM

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:
http://www.picvietnam.com/forum//showthread.php?t=224
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:

Trích:

http://i3.photobucket.com/albums/y64.../encoder_p.jpg

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;
  }
}


nhh 30-10-2007 07:55 AM

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.

bigtitan 07-12-2007 10:46 AM

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.

truongthont 05-05-2008 06:07 PM

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

}


scentoflove 23-05-2008 01:16 AM

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.

tungtuantu 13-07-2008 06:46 PM

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

NGUYEN VU BAO 20-09-2008 06:16 PM

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
}

lion 21-09-2008 12:55 AM

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

conglong 24-03-2009 11:42 PM

Trích:

Nguyên văn bởi lion (Post 18994)
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 !.

wakener_thesun 13-11-2010 06:10 PM

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

ngcanh_dtdn 13-11-2010 09:29 PM

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.

wakener_thesun 13-11-2010 10:44 PM

Trích:

Nguyên văn bởi ngcanh_dtdn (Post 40088)
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

ngcanh_dtdn 13-11-2010 11:34 PM

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().


wakener_thesun 13-11-2010 11:48 PM

Trích:

Nguyên văn bởi ngcanh_dtdn (Post 40091)
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


Múi giờ GMT. Hiện tại là 02:27 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam