PDA

View Full Version : Hỏi về thuật toán và bài tập với encoder?


dvnccbmacbt
08-07-2007, 12:19 PM
Chào mọi người. Em đang tìm hiểu về encoder. đã hiểu được nguyên lý hoạt động nhưng chưa biết cách ứng dụng nó vào điều khiển. Có ai có bài tập hay những giải thuật đã thực hiện với encoder rồi cho em xin với! Em đang học cách điều khiển robot. Em xài pic6f877a và mô phỏng bằng proteus.
Cho em hỏi thêm: trong proteus thì mô phỏng encoder được không và phải làm thế nào?
Em cảm ơn nhiều!

Mecha
08-07-2007, 02:18 PM
Bạn đã đọc bài viết ở luồng này chưa?

Encoder: absolute và incremental? Dùng loại nào?
http://www.picvietnam.com/forum//showthread.php?t=224

Làm việc với encoder = đếm xung & phát hiện hướng quay. Thuật toán để làm công việc này có khác nhau phụ thuộc vào loại encoder nào được sử dụng, absolute hay incremental.

Bạn đọc bài viết kia trước đã, có thể bạn sẽ tự tìm ra thuật toán làm việc với encoder đấy.

dvnccbmacbt
08-07-2007, 03:22 PM
Cảm ơn anh! Em đọc cả rồi. Nhưng có hai câu hỏi:
1. Làm sao để mô phỏng encoder trong proteus?
2. bài tập hay 1 ứng dụng cụ thể nào đó đã sử dụng encoder.
Em có nghĩ về các thuật toán nhưng không có bài tập và mô phỏng để thực hiện. Mong mọi người giúp đỡ.
Em không biết loại encoder nào phổ biến hơn và ...rẻ hơn. Mọi người cho em lời khuyên với. Chắc là incremental phải không?

dvnccbmacbt
09-07-2007, 03:58 PM
Cho em hỏi thêm về encoder:
1. Em thấy trong datasheet viết có resolution. Cái này có ý nghĩa là gì vậy?
2. Có tài liệu viết: Encoder phát ra 500-2000 xung/vòng. Có phải ý nghĩa của nó là độ phân giải (resolution). Như vậy là encoder có 500-2000 lỗ/ 1 vòng, phải không?

falleaf
09-07-2007, 04:03 PM
Cho em hỏi thêm về encoder:
1. Em thấy trong datasheet viết có resolution. Cái này có ý nghĩa là gì vậy?
2. Có tài liệu viết: Encoder phát ra 500-2000 xung/vòng. Có phải ý nghĩa của nó là độ phân giải (resolution). Như vậy là encoder có 500-2000 lỗ/ 1 vòng, phải không?

Sau khi bạn đọc bài viết trên, hẳn bạn đã biết rằng với một encoder có 500 lỗ, thì chúng ta có thể đọc nó ở 500 xung/vòng, hoặc có một giải pháp khác đọc cả cạnh lên và cạnh xuống, đọc cả hai kênh A và B. Như vậy chúng ta sẽ có thể đọc lên tới gấp 4 lần, nghĩa là thành 2000 xung/vòng.

Xung/vòng thường ký hiệu là ppr = pulse per revolution. Đây đúng là độ phân giải của encoder. Thông thường bạn sẽ thấy người ta ghi độ phân giải là trị số cao nhất, nghĩa là 2000ppr thì nó đồng nghĩa với việc encoder có 500 lỗ, đọc tối đa được 2000ppr. Nhưng nếu người ta ghi rõ 2000-8000ppr hoặc 500-2000ppr, thì đó có nghĩa là encoder có bao nhiêu lỗ và độ phân giải tối đa đọc được ghi phía sau (mặc định gấp 4 lần số lỗ).

Chúc vui

Mecha
09-07-2007, 04:05 PM
Cho em hỏi thêm về encoder:
1. Em thấy trong datasheet viết có resolution. Cái này có ý nghĩa là gì vậy?
2. Có tài liệu viết: Encoder phát ra 500-2000 xung/vòng. Có phải ý nghĩa của nó là độ phân giải (resolution). Như vậy là encoder có 500-2000 lỗ/ 1 vòng, phải không?

Số xung phát ra khi encoder quay 360 độ gọi là độ phân giải (resolution) của encoder. Và đúng như bạn nói nếu độ phân giải là 500 xung/vòng thì khi chế tạo người ta phải tạo ra 500 lỗ.

Chú Hiệp giải thích đầy đủ hơn đấy :)

Nhưng anh nghĩ khi ghi độ phân giải của encoder họ ghi chỉ số chuẩn, nghĩa là nếu encoder phát 500 xung/quay thì sẽ được ghi là có độ phân giải là 500 ppr. Tuy nhiên trên datasheet nó sẽ nói là có cho phép dạng phát xung đồng thời cả hai kênh AB (lệch nhau 90 độ điện) hay không. Nếu có ghi thì người sử dụng ngầm hiểu là có thể lập trình để bộ nhận xung đọc được 2000 xung/vòng quay.

andy
11-07-2007, 05:27 PM
Các anh ơi, nhân tiện em cũng đang tim hiểu về encoder cho em hỏi chút xíu luôn.
Em định đọc xung từ encoder, kiểm tra chiều tiến hay lùi(quay thuận hay ngược) rồi cho hiển thị ra led số xung đã đọc. Nhưng tần số của xung có thể lên đến 250kHz, quá lớn nên em chưa biết xử lý thế nào. Các anh chỉ giùm em nhé. Em cảm ơn nhiều nhiều...

Mecha
12-07-2007, 05:17 AM
Các anh ơi, nhân tiện em cũng đang tim hiểu về encoder cho em hỏi chút xíu luôn.
Em định đọc xung từ encoder, kiểm tra chiều tiến hay lùi(quay thuận hay ngược) rồi cho hiển thị ra led số xung đã đọc. Nhưng tần số của xung có thể lên đến 250kHz, quá lớn nên em chưa biết xử lý thế nào. Các anh chỉ giùm em nhé. Em cảm ơn nhiều nhiều...

Tần số lên tới 250kHz cơ à! Mình chưa bao giờ đếm xung tần số cao như thế này. Ở đây mình chỉ đề xuất một phương án là dùng bộ đếm xung bằng phần mềm. Bạn tạo môt vòng quét (bằng chương trình con) có chu kỳ T = 4 micro giây. Trong chương trình con này bạn viết các lệnh để nhận biết sườn xung lên. Vấn đề là thời gian để thực hiện các lệnh này phải nhỏ hơn 4 micro giây nếu không sẽ xảy ra hiện tượng đệ qui (các lệnh của chu kỳ trước chưa thực hiên xong thì lại được thực thi ở chu kỳ tiếp theo).

cuopbienquin
12-07-2007, 10:06 AM
http://i190.photobucket.com/albums/z275/rosanhdieu/encoder-1.jpg
Mình cũng xin hỏi thêm chút ít.Tốc độ quay của động cơ gắn encoder chính là tần số output của chanel A (B) phải không???Ví dụ tần số 1KHZ ,nghĩa là 1 xung A tương ứng 1ms.Giả sử đối vớ encoder 4xung/vòng thì tốc độ quay là 4ms/vòng hay 250vong./s
Làm cách nào để đọc được số xung từ A và B hiển thị qua Led mà ta biết tại thời điẻm nào đó nó quay góc bao nhiêu?tốc đọ thế nào,chiều nào?
Mình đã có đọc sơ qua trên trang web nó nói về điều khiển này mà cũng không hiểu rõ nguyên lý và thực toán lám.Đây là link của nó.
http://www.google.com.vn/search?q=encoder%2BPIC&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a
Mong các bạn gíp đỡ
Chúc vui.

andy
12-07-2007, 10:32 AM
Tần số lên tới 250kHz cơ à! Mình chưa bao giờ đếm xung tần số cao như thế này. Ở đây mình chỉ đề xuất một phương án là dùng bộ đếm xung bằng phần mềm. Bạn tạo môt vòng quét (bằng chương trình con) có chu kỳ T = 4 micro giây. Trong chương trình con này bạn viết các lệnh để nhận biết sườn xung lên. Vấn đề là thời gian để thực hiện các lệnh này phải nhỏ hơn 4 micro giây nếu không sẽ xảy ra hiện tượng đệ qui (các lệnh của chu kỳ trước chưa thực hiên xong thì lại được thực thi ở chu kỳ tiếp theo).

Anh Mecha oi! Làm sao trong 4 micro giây có thể đọc xung rồi kiểm tra chiều tiến lùi...Encoder em đang nghiên cứu cho tín hiệu ra TTL với 3 dãy xung A,B,C. Trong đó A và B có cùng chu kỳ và lệch pha nhau 90 độ, C có chu kỳ gấp đôi B. Tần số ra biến thiên nhưng lớn nhất là 250KHz.
Em định dùng bộ đếm để đếm xung trong một khoảng thời gian nhất định(vd:50ms dùng ngắt Timer) rồi cho hiển thị số xung đếm được. Còn xđ tiến lùi thì như anh Falleaf có một bài đã post lên, khi có sườn ở xung A thì đọc giá trị của B là biết chiều nhưng em chưa biết thuật toán thế nào cho hợp lý, khi có sườn ở A thì ngắt rồi đọc B, thì sẽ bị ngắt liên tục và không đảm bảo về thời gian. Xử lý về thời gian chỗ này rất phức tạp. Hay có loại nào có chân chuyên đếm xung không các anh? Các anh xem có cách nào giúp em nhé, em cảm ơn các anh.........

falleaf
12-07-2007, 02:43 PM
Bạn đọc lại bài viết về encoder mà F giới thiệu, hoàn toàn trong đó không có khái niệm nào nói về tần số encoder. Do vậy, bạn đang hiểu sai một khái niệm gì ở đây. Nếu bạn muốn hiểu chắc chắn, bạn chỉ nên sử dụng những khái niệm mà F giới thiệu trong bài viết đó (link do anh Mecha giới thiệu). Ngoài ra, không sử dụng các khái niệm khác để giải thích vấn đề khúc mắc của mình. F chưa thấy đề cập khái niệm tần số encoder nghĩa là sao cả, nên nói thực rằng không hiểu con số 250KHz này có nghĩa là gì. Nếu như tốc độ quay của các bạn, và độ phân giải của encoder của các bạn đạt đến giá trị rất cao thì bạn mô tả xung nhận vào lên tới 250KHz thì có vẻ hợp lý, nhưng bạn nên xem lại bài viết đó một cách cẩn thận, và nếu không hiểu thì đặt câu hỏi ngay trong bài viết đó.

Chúc vui

Mecha
12-07-2007, 03:20 PM
Ý của bạn andy là muốn xử lý chính xác xung tín hiệu ra từ encoder. Giả sử andy dùng encoder có độ phân giải 500 xung/vòng quay. Vậy khi động cơ quay 500 vòng/giây tương ứng với 30k vòng/phút thì đầu tín hiệu ra của encoder sẽ là là xung với tần số lên đến 250 kHz (T = 4 micro giây). Vì vậy muốn đếm được chính xác số xung thì vòng quét (tạo bởi chương trình con) hay Timer phải có chu kỳ nhỏ hơn hoặc bằng 4 micro giây. Nếu andy chỉ dùng Timer co T = 50ms, khi bạn đếm xung 250 kHz thì mới đếm được xung đầu tiên thì đã có (12500-1) xung khác xuất hiện và bạn sẽ không xử lý kịp. Vậy vấn đề như mình đã nói "tổng thời gian để thực hiện các lệnh xử lý xung phải nhỏ hơn 4 micro giây". Nghĩa là bạn lập trình rồi cộng tổng số chu kỳ máy của các lệnh trong chương trình con. Nếu nhỏ hơn 4 micro giây thi oki :) Mình nghĩ việc này là không thể cho các chip với tốc độ xử lý lệnh như hiện nay.

falleaf
12-07-2007, 04:08 PM
Thế nên em mới nói vấn đề, vừa phải phụ thuộc độ phân giải, vừa phải phụ thuộc tốc độ quay. Khái niệm này là khái niệm hoàn toàn không có. Một cách thực hiện nếu muốn lấy được một độ chính xác tương đối, và chu kỳ lấy mẫu nhỏ, tức là thả cho động cơ quay, và chỉ bắt xung trên kênh Z. Khi tới gần thời điểm lấy mẫu, thì tắt hết mọi hoạt động của MCU và chờ tín hiệu encoder thôi. Tuy nhiên, với tốc độ xử lý 4us thì không thể có con MCU nào làm kịp, vì riêng quá trình vào ngắt ra ngắt là hết thời gian rồi. Nếu dùng mấy con DSP khủng thì may ra có thể xử lý được.

Tất nhiên, nếu làm việc với PIC, ở tần số 40MHz thì khả năng vẫn có thể xử lý được, nhưng phải xử lý cực kỳ khéo léo và phải code thật cẩn thận bằng MPASM. Bởi chạy ở 4MHz tương đương mức 1MHz chu kỳ máy, tương đương 1us/lệnh. Nếu có khoảng 10 lệnh/us, thì trong 4us có thể xử lý 40 lệnh máy. Như vậy vẫn có khả năng xử lý kịp.

Nhưng một động cơ chạy 30K vòng/phut. Anh có thấy động cơ nào chạy ở tốc độ đó chưa? Các động cơ thường thì chạy khoảng 3K vòng/phút, và nếu như có nhanh thì lên tới 10K vòng/phút là ghê lắm rồi. Mà ở tốc độ này thì em nghĩ chơi độ phân giải 500ppr là bất hợp lý.

Chúc vui

Mecha
12-07-2007, 04:22 PM
Trục chính máy phay CNC tốc độ trung bình-cao quay ở tốc độ đó. Thế nên ở tốc độ cao như vậy chỉ nên chọn encoder 500 xung thâm chí chỉ nên chọn cỡ 100 xung thôi để giảm tần số xung xuống 50 kHz. Ở tần số này, chu kỳ Timer được nâng lên 20us và ở tần số 40MHz, ta có thể xử lý 200 lệnh máy. Chắc sẽ đủ để coding.

Tốc độ quay cao cỡ như thế này anh cho rằng còn có thể tìm thấy khá nhiều trong thực tế, ví dụ trong các máy quay ly tâm (dùng để xét nghiệm máu ý).

Mecha
12-07-2007, 05:56 PM
Vấn đề thời gian vòng quét nhỏ cỡ 10us trở xuống cũng có thể tìm thấy trong máy xung gia công tia lửa điện (EDM). Để tránh hiện tượng ngắn mạch giữa hai điện cực, điện áp chênh lệch giữa điện cực Anot và Katot được kiểm tra và so sánh liên tục với điện áp ngưỡng và phải lập tức đảo chiều quay của động cơ bước để kéo điện cực Anot lên. Do đó chỉ có vòng quét với chu kỳ rất nhỏ mới có thể đáp ứng được.

Mở rộng ra một chút, trong các bài toán lập trình điều khiển trong thực tế, tần số lấy mẫu được coi là tương đương với chu kỳ của Timer hay vòng quét chương trình.

Do đó anh nghĩ mình có thể tạo một chương trình mẫu dạng (kiểu template) để khi cần là có thể mang ra thay số (đặt thông số capture cho Timer) là dùng được ngay.

Mecha
12-07-2007, 06:04 PM
Ví dụ đây là một "khung chương trình" của 89C52


;************************************************* *******
;* Clock 24 MHz, 1 chu ky 0.5 us
;************************************************* *******

; Khai bao cac hang so khoi dong ban dau o day

; Khai bao bien o day

;-----------------------------
Start:
mov a,#0Ch
da a
djnz r0,$
clr EA
clr ET0
clr ET1
clr EX0
clr EX1
jmp Clear_RAM
;----------------------------------------------------------------------------
; Clear RAM internal 20h - 0FFh for 89C52
;----------------------------------------------------------------------------
Clear_RAM:
mov r0,#20h
CLR_loop:
mov @r0,#0
inc r0
cjne r0,#0ffh,CLR_loop
mov sp,#Stack
;----------------------------------------------------------------------------
; Setup cac tham so khac o day

;--------------------------------------------------------
; Vong quet chuong trinh chinh
;--------------------------------------------------------
Main:
jbc flg_time.0,prg10us
n100us:
jbc flg_time.1,prg100us
n1ms:
jbc flg_time.2,prg1ms
n10ms:
jbc flg_time.3,prg10ms
n100ms:
jbc flg_time.4,prg100ms
n1sec:
jbc flg_time.5,prg1sec
n1minute:
jmp Main


;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg10us:
;cac lenh cua vong quet 10us
jmp n100us

;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg100us:
;cac lenh cua vong quet 100us
jmp n1ms

;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg1ms:
;cac lenh cua vong quet 1ms
jmp n10ms

;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg10ms:
;cac lenh cua vong quet 10ms
jmp n100ms

;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg100ms:
;cac lenh cua vong quet 100ms
jmp n1sec


;----------------------------------------------------------
; Thu tuc xu ly cac ngat
;----------------------------------------------------------

IntTimer0:
push 0
clr TR0 ; cam timer 0
;cac lenh trong ngat Timer0
endtimer0:
setb TR0 ; Cho phep timer 0
pop 0
reti

;----------------------------
;Tao chu ky vong quet khac nhau
IntTimer1:
push 0
clr TR1 ; cam timer 1

setb flg_time.0 ;bit 0 : da thay doi 10us
mov r0,#cn_10us
inc @r0
cjne @r0,#10,endtimer1

setb flg_time.1 ;bit 1: da thay doi 100us
mov @r0,#0
mov r0,#cn_100us
inc @r0
cjne @r0,#10,endtimer1

setb flg_time.2 ;bit 2: da thay doi 1ms=1000us
mov @r0,#0
mov r0,#cn_1ms
inc @r0
cjne @r0,#10,endtimer1

setb flg_time.3 ;bit 3: da thay doi 10ms
mov @r0,#0
mov r0,#cn_10ms
inc @r0
cjne @r0,#10,endtimer1

setb flg_time.4 ;bit 4: da thay doi 100ms
mov @r0,#0
mov r0,#cn_100ms
inc @r0
cjne @r0,#10,endtimer1

setb flg_time.5 ;bit 5: da thay doi 1sec=1000ms
mov @r0,#0
mov r0,#cn_1sec
inc @r0
cjne @r0,#60,endtimer1

setb flg_time.6 ;bit 6: da thay doi 1minute=60s
mov @r0,#0
mov r0,#cn_1minute
inc @r0
cjne @r0,#60,endtimer1

setb flg_time.7 ;bit 7: da thay doi 1hour=60minutes
mov @r0,#0
mov r0,#cn_1hour
inc @r0

endtimer1:
mov TL1,#Low(MotorPulse)
mov TH1,#High(MotorPulse)
setb TR1
pop 0
reti

;----------------------------
IntEx0:
reti
;----------------------------
IntRS232:
reti
;----------------------------
IntEx1:
reti

;----------------------------
endprog: db ' End of program at here, bye!'
END

RedRose
16-07-2007, 10:28 AM
Xin hỏi rằng nếu tốc độ xử lý không xử lý được số xung thì có thể dùng biện pháp phần cứng nào để xử lý ko?
(liệu có thể dùng bộ đếm như kiểu chia tần không?, lúc đó pha còn chính xác ko nhỉ)

Giúp em với nhé, em đang phải đọc 1 encoder quang mà vẫn chưa thành công.
Cám ơn mọi người trước!

namqn
16-07-2007, 06:31 PM
Xin hỏi rằng nếu tốc độ xử lý không xử lý được số xung thì có thể dùng biện pháp phần cứng nào để xử lý ko?
(liệu có thể dùng bộ đếm như kiểu chia tần không?, lúc đó pha còn chính xác ko nhỉ)

Giúp em với nhé, em đang phải đọc 1 encoder quang mà vẫn chưa thành công.
Cám ơn mọi người trước!
Bạn có thể dùng một bộ đếm nhị phân để giảm tốc độ xung vào vi điều khiển, kết hợp với việc đọc giá trị tức thời của bộ đếm ngoài đó, bạn sẽ có được độ phân giải cần thiết mà không làm quá tải bộ vi điều khiển. Ví dụ, dùng bộ đếm nhị phân 4-bit, lúc đó tốc độ xung vào vi điều khiển sẽ giảm 16 lần, bạn sẽ đọc các bit thấp nhất của số đếm xung bằng cách đọc giá trị tức thời của bộ đếm ngoài qua 4 đường I/O của PIC, các bit cao hơn sẽ nằm trong vi điều khiển.

Thân,

RedRose
17-07-2007, 11:59 AM
Cảm ơn anh Nam, em cũng đã nghĩ như vậy.
Em chưa hiểu đoạn anh nói về cách "đọc giá trị tức thời của bộ đếm ngoài qua 4 đường I/O của PIC, các bit cao hơn sẽ nằm trong vi điều khiển" lắm

Em nghĩ đơn giản là dùng bộ đếm 4bit thì tốc độ xung sẽ giảm 16 lần, và xung đó chính là xung thể hiện ở bit cao nhất bộ đếm. Như vậy thì ta tiến hành đếm xung ở chân này của bộ đếm?
(vì vậy mà em mới hỏi về pha, em định cho cả 2 kênh A,B qua 2 bộ đếm để giảm tốc độ xung, sau đó giải mã như bình thường?)

Mecha
17-07-2007, 05:08 PM
Cảm ơn anh Nam, em cũng đã nghĩ như vậy.
Em chưa hiểu đoạn anh nói về cách "đọc giá trị tức thời của bộ đếm ngoài qua 4 đường I/O của PIC, các bit cao hơn sẽ nằm trong vi điều khiển" lắm

Em nghĩ đơn giản là dùng bộ đếm 4bit thì tốc độ xung sẽ giảm 16 lần, và xung đó chính là xung thể hiện ở bit cao nhất bộ đếm. Như vậy thì ta tiến hành đếm xung ở chân này của bộ đếm?
(vì vậy mà em mới hỏi về pha, em định cho cả 2 kênh A,B qua 2 bộ đếm để giảm tốc độ xung, sau đó giải mã như bình thường?)

- Trường hợp encoder chỉ phát xung trên một chân, hướng (chiều) của xung được quy định bởi 1 chân khác: Dùng bộ đếm nhị phân 4 bit, tốc độ xung sẽ được giảm xuống 4^2=16 lần. Khi đó việc đọc trực tiếp xung phát ra từ encoder sẽ chuyển sang đọc giá trị logic tại 4 cổng tín hiệu ra của bộ đếm nhị phân 4 bit (từ 2^0 đến 2^3). Vấn đề bây giờ là chốt giá trị logic tức thời trên 4 cổng này (giả sử chốt khi trạng thái 4 cổng là 1111). Có thể dùng 1 con AND 4 đầu vào, khi 4 cổng đều ở giá trị 1111 thì đầu ra của AND sẽ là 1 và bạn có thể dùng nó để tạo ngắt (chương trình ngắt cập nhập giá trị của bộ đếm xung thêm 16 xung). Vấn đề còn lại là phải chú ý đến chân đại diện cho chiều xung hay chiều quay của encoder. Trong chương trình ngắt sẽ phải đọc trạng thái của chân này và bộ đếm xung sẽ cộng thêm hay trừ đi 16 xung phụ thuộc vào trạng thái của chân này (thường là quay thuận thì cộng, quay ngược thì trừ). Tuy nhiên có một trường hợp khi bộ đếm nhị phân đang đọc xung thì chiều quay thay đổi, khi đó ta sẽ bị sai số một số xung nhất định.

- Trường hợp encoder phát xung trên hai kênh A và B: mình nghĩ là không dùng được giải pháp bộ đếm nhị phân ngoài được vì khi đó thông tin về độ lệch pha giữa A và B (để quyết định chiều quay của encoder) bị mất hay nói cách khác là không thể nhận biết được khi lập trình trên PIC.

Tôi nghĩ thông tin đã đủ, bạn làm mạch thử nghiệm và thông báo kết quả cho mọi người nhé.

namqn
17-07-2007, 08:12 PM
- Trường hợp encoder phát xung trên hai kênh A và B: mình nghĩ là không dùng được giải pháp bộ đếm nhị phân ngoài được vì khi đó thông tin về độ lệch pha giữa A và B (để quyết định chiều quay của encoder) bị mất hay nói cách khác là không thể nhận biết được khi lập trình trên PIC.
...
Vẫn làm được đấy Phong, dùng mạch logic ở bên ngoài luôn. Sinh viên của anh đã làm cách đây 3, 4 năm gì đó, chỉ cần 1 con D-FF và 2 kênh A, B đó thôi.

Thân,

Mecha
17-07-2007, 08:39 PM
Vẫn làm được đấy Phong, dùng mạch logic ở bên ngoài luôn. Sinh viên của anh đã làm cách đây 3, 4 năm gì đó, chỉ cần 1 con D-FF và 2 kênh A, B đó thôi.

Thân,

Nếu chỉ dùng thêm bộ đếm nhị phân thì không giải quyết được vấn đề cho kiểu phát xung AB. Tuy nhiên nếu dùng thêm Flip-Flops (FF) thì sẽ giải quyết được, nhưng theo em là phải dùng thêm 1 con SR-FF chứ 1 con D-FF không làm được vì nó chỉ có 1 đầu vào D, không kham nổi hai cổng AB.

Nguyên lý của SR-FF:
http://i13.photobucket.com/albums/a262/dbphong/PicVN/Others/SR_FlipFlops.jpg

Theo hình vẽ, giả sử nếu sử dụng chân Set (S) cho cổng A, chân Reset (R) cho cổng B thì:
- Nếu A sớm pha hơn B (S=1, R=0) thì suy ra encoder quay thuận (Q=1)
- Nếu A chậm pha hon B (S=0, R=1) thì suy ra encoder quay nghịch (Q=0)
Vì vậy ta có thể sử dụng chân Q như chân địch chiều quay. Vấn đề giờ có thể quy về "Trường hợp encoder chỉ phát xung trên một chân, hướng (chiều) của xung được quy định bởi 1 chân khác".

namqn
17-07-2007, 10:36 PM
Nếu chỉ dùng thêm bộ đếm nhị phân thì không giải quyết được vấn đề cho kiểu phát xung AB. Tuy nhiên nếu dùng thêm Flip-Flops (FF) thì sẽ giải quyết được, nhưng theo em là phải dùng thêm 1 con SR-FF chứ 1 con D-FF không làm được vì nó chỉ có 1 đầu vào D, không kham nổi hai cổng AB.

Nguyên lý của SR-FF:
http://i13.photobucket.com/albums/a262/dbphong/PicVN/Others/SR_FlipFlops.jpg

Theo hình vẽ, giả sử nếu sử dụng chân Set (S) cho cổng A, chân Reset (R) cho cổng B thì:
- Nếu A sớm pha hơn B (S=1, R=0) thì suy ra encoder quay thuận (Q=1)
- Nếu A chậm pha hon B (S=0, R=1) thì suy ra encoder quay nghịch (Q=0)
Vì vậy ta có thể sử dụng chân Q như chân địch chiều quay. Vấn đề giờ có thể quy về "Trường hợp encoder chỉ phát xung trên một chân, hướng (chiều) của xung được quy định bởi 1 chân khác".
Dùng SR-FF thì như Phong đã nói, còn dùng D-FF thì 1 kênh đưa vào chân D, một kênh là clock cho D-FF. Cũng sẽ xác định được chiều quay.

Chẳng hạn, kênh A đưa vào chân D và kênh B đưa vào chân clock:
- Nếu A sớm pha hơn B, thì lúc có clock (tức là B lên 1) logic '1' được đưa vào FF (chiều thuận)
- Nếu A chậm pha hơn B, thì lúc có clock (tức là B lên 1) logic '0' được đưa vào FF (chiều nghịch)

Thân,

sandro_bk
19-07-2007, 03:17 PM
mình dùng con 18f4331 để đọc encoder,con này có module đọc encoder nhưng trong tập lệnh của CCS ko thấy có lệnh nào sử dụng cho module này cả,có bạn nào làm đọc encoder rồi chỉ mình với,