Thú cưng của tôi là khi giải mã cầu phương được thực hiện trong phần mềm. Khi được thực hiện trong phần mềm, bộ giải mã thường không thể theo kịp, đặc biệt là khi tốc độ xung nhanh hoặc MCU đang làm nhiều việc khác. Tôi đã thấy nhiều thiết bị sử dụng bộ mã hóa cầu phương trên núm nhập dữ liệu và hầu hết thời gian nó hoạt động tốt. Nhưng bộ giải mã sẽ bỏ qua các xung bất cứ khi nào MCU phải làm gì đó, như làm mới màn hình hoặc nói chuyện qua RS-232.
Tôi thực hiện giải mã cầu phương trong một đồ họa. Một cổng Xilinx Spartan-3A 50K có giá dưới 10 đô la và có thể giải mã nhiều kênh hơn so với chân. Và nó sẽ làm điều đó với tốc độ xung cầu phương trên 1 MHz. Không có MCU cho chi phí tương tự hoặc rẻ hơn có thể làm điều đó.
Chỉnh sửa: Những gì sau đây là một bản tóm tắt của rất nhiều ý kiến, và một số chi tiết thêm về phần của tôi. Thưởng thức!
Đúng là bạn có thể thực hiện một cách tiếp cận phần mềm nếu tốc độ xung đủ chậm. Nhưng khi điều này được thực hiện, bạn phải chắc chắn rằng "các trường hợp góc" được bảo hiểm. Những thứ như ngắt cho các thiết bị ngoại vi khác (như UART, ADC, v.v.) có thể ảnh hưởng đến tần suất bạn lấy mẫu dữ liệu cầu phương khiến quá trình giải mã cầu phương đôi khi bị mất xung. Các xung bị bỏ lỡ này là "ok" đối với một số ứng dụng, như núm nhập dữ liệu, nhưng vẫn gây khó chịu cho tôi.
@Leon Heller thực sự thích bộ xử lý XMOS cho những thứ tương tự. Đối với những người không biết, công cụ XMOS về cơ bản là một MCU đơn giản nhưng siêu nhanh. Khi hầu hết các MCU chạy trong phạm vi <25 MIPS, công cụ XMOS đang đẩy 500 MIPS. XMOS không thực hiện nhiều thiết bị ngoại vi dựa trên phần cứng, như UARTs. Thay vào đó họ "bit-bang" nó và làm UART trong phần mềm. Họ cũng bit-bang những thứ như USB và 10mbps Ethernet. Ok, tôi siêu đơn giản hóa điều này, nhưng bạn có được điểm. Đây là ý kiến của tôi: có những người làm đồ họa và có những người làm CPU. Nếu bạn là một loại CPU và không thích đồ họa thì bộ xử lý XMOS có thể phù hợp với bạn.
Chủ đề về các mã Gray trong một triển khai FPGA đã được đưa lên và thực hiện các bộ đếm vị trí lên / xuống trong mã màu xám. Thông thường có hai lý do để sử dụng mã Gray: nếu bạn có một số logic không đồng bộ đang diễn ra (2 đồng hồ trở lên) hoặc nếu bạn muốn các bộ đếm chiếm ít logic hơn. Thông thường, bạn sẽ không có logic không đồng bộ trong FPGA (ngoài việc lấy mẫu dữ liệu cầu phương ở các chân đầu vào) và FPGA đã có các chuỗi mang siêu nhanh (còn gọi là bộ cộng nhị phân). Vì vậy, thực sự, trong các trường hợp bình thường, không cần bất kỳ bộ đếm mã màu xám nào cho việc này.
Bạn có thể sử dụng CPLD cho việc này, thay vì một FPGA. Điều này sẽ làm việc cho 1 hoặc 2 bộ giải mã bậc hai, nhưng khi bạn thêm nhiều bộ giải mã, việc giao tiếp với MCU trở nên phức tạp hơn. Các GPU rất tốt cho việc này vì giao diện MCU có thể là SPI hoặc điều đơn giản khác không chiếm hàng chục chân trên MCU.
Cách "chính xác" để thực hiện điều này trong một đồ họa là trong đó đồ họa có bộ đếm 8-16 bit đơn giản theo dõi vị trí. Bộ đếm này không bao giờ được thiết lập lại sau khi khởi tạo, và đôi khi thậm chí không. Phần mềm (SW) sẽ thăm dò vị trí này thường xuyên và sẽ giữ một bản ghi về "vị trí trước đó". Lấy vị trí hiện tại và trừ đi vị trí trước đó sẽ cho phần mềm biết vị trí đã thay đổi bao xa.
Lý do bộ đếm vị trí không bao giờ được đặt lại là vì chúng tôi đang cố gắng tránh "đọc phá hủy". Đó là khi CPU đọc một thanh ghi gây ra điều gì đó không thể đảo ngược - như xóa bộ đếm vị trí. Đôi khi việc đọc phá hoại là không thể tránh khỏi, như khi đọc một phần mười, nhưng nói chung bạn muốn tránh chúng. Suy nghĩ đằng sau này là ngoài bài viết này. Tôi đã cố gắng tìm một trang web tốt để thảo luận về họ, nhưng tôi đã thất bại. Lấy làm tiếc.
Khi nói về tốc độ đếm, bên dưới, ý tôi là bộ đếm vị trí có thể tăng hoặc giảm nhanh như thế nào. Do tính chất cầu phương của vật thể, "tốc độ xung" là một phần tư tốc độ đếm. Tôi giả sử rằng với mỗi xung đầy đủ, chúng ta có thể đếm lên / xuống 4 lần. Tôi biết có nhiều cách khác để đếm (một đếm trên mỗi xung đầy đủ), nhưng tôi bỏ qua nó ngoài hiệu trưởng.
Bỏ qua bộ xử lý XMOS (giống như một bộ xử lý đồ họa, trong bối cảnh của một vài đoạn tiếp theo), MCU sẽ bị giới hạn ở tốc độ đếm tối đa dưới 500 Hz và trong nhiều trường hợp tối đa dưới 100 Hz. Tất nhiên có thể có một số ngoại lệ cao hơn 1 KHz, nhưng đối với hầu hết mọi người, điều đó khó thực hiện. Đối với MCU điển hình của bạn, bạn đang làm rất tốt để có được tần số trên 100 Hz, giả sử rằng MCU không dành riêng cho giải mã cầu phương.
Một núm nhập dữ liệu thông thường có 12 đến 20 xung trên mỗi vòng quay, hoặc 48 đến 80 đếm trên mỗi vòng quay. Giả sử núm có đường kính 1 inch, một người điển hình nhưng quá nhiệt tình có thể nhận được khoảng 4 vòng mỗi giây khi cố gắng cuộn qua nhiều dữ liệu. Điều đó đạt đến tốc độ đếm từ 192 đến 320 Hz. Vẫn trong khả năng của một MCU, nhưng chỉ vừa đủ và chỉ với lập trình cẩn thận.
Một đồ họa, tùy thuộc vào cách viết logic, có thể xử lý tốc độ đếm hơn 100 MHz. Tôi đã viết logic của mình để xử lý tốc độ đếm lên tới khoảng 50 KHz, nhưng nó có thể thực hiện nhiều bộ giải mã bậc hai trong một lượng logic rất nhỏ. Trong một Xilinx Spartan-3, bạn cần khoảng 50 lát và 1 Block-RAM để thực hiện bộ giải mã 32 đến 512 (bạn sẽ hết chân trước khi hết logic).
Vì vậy, cái nào tốt hơn, FPGA, MCU hay XMOS? Như thường lệ, nó phụ thuộc. Nó không chỉ phụ thuộc vào những thứ thông thường như tốc độ đếm và số lượng bộ giải mã, mà còn phụ thuộc vào những gì người thiết kế thoải mái sử dụng và những gì khác trong hệ thống. Sở thích của tôi là FPGA, nhưng đó chỉ là loại người của tôi! :)