anh cho em hỏi về cái QEI của 30F4011, em đọc datasheet và hiểu theo như này, anh xem có đúng ko ah
- có phải số xung đếm được từ encoder được lưu trong POSCNT ?
110 = Quadrature Encoder Interface enabled (x4 mode) with Index Pulse reset of position counter : đây là chế độ x4 xung, giá trị trong POSCNT sẽ bị xóa về 0 khi chân index có xung, nghĩa là POSCNT bị xóa về 0 sau mỗi vòng
101 = Quadrature Encoder Interface enabled (x2 mode) with position counter reset by match (MAXCNT): POSCNT = 0 khi POSCNT = MAXCNT, mà MAXCNT là giá trịn do mình đặt vào, ví dụ em có encoder 250 xung/vong, thì em sẽ đặt MAXCNT = 250x4=1000 xung, thì khi POSCNT = 1000 thì POSCNT=0 (cũng là quay dc 1 vòng thì reset).
Em chưa hiểu về bộ filter lắm, anh có thể nói thêm về cái này dduocj ko ah.
Về ngắt của QEI:
- When operating in reset on match mode, QEIM<2:0> = ‘111’ and ‘101’, an interrupt occurs on position counter rollover/underflow : Ngắt khi gặp xung index
- When operating in reset on index mode, QEIM<2:0> = ‘110’ and ‘100’, an interrupt occurs on detection of index pulse and optionally when CNTERR bit is set: Ngắt khi POSCNT=MAXCNT
- When operating as a Timer/Counter, QEIM<2:0> = ‘001’, an interrupt occurs on a period match event or a timer gate falling edge event when TQGATE = 1: cái này em chưa hiểu lắm
Em xin đưa ra 1 ví dụ cụ thẻ nhé.
em có 1 encoder 250 x/v, ko có index, bây h em muốn đọc tốc độ động cơ và xuát ra LCD
- nếu em dùng ngắt khi POSCNT = MAXCNT, thì ch trinh ngắt là đọc POSCNT , như thế em chỉ biết dduocj số xung đếm dduocj, ko biết nó đêm dc trong bao lâu để suy ra tốc đọ.
- neu em dùng ngắt timer thì cứ 1s ngắt 1 lần thì trong ctr ngắt em đọc POSCNT, nhvis dụ trong 1s đó đếm dduocj 1500 xung chẳng hạn, nhung đếm đến 1000 thì bị reset về ko, lúc đó giá trị đọc dc chỉ là 500xung, như thế thì tốc đọ đọc về ko đúng
Anh cho em xin giải pháp cho vấn đề này nhé
Em có gắng đọc datasheet và chiểu dduocj như thế, tiếng anh chuyên ngahnhf của em còn kém lắm, mong anh giúp em nhé.
Thanks anh nhiều