Làm thế nào chính xác tôi có thể có được Arduino bằng cách sử dụng bộ mã hóa quay?


15

Động cơ bước thường có giá cho một động cơ lớn. Tuy nhiên, với động cơ DC tiêu chuẩn, mạnh mẽ và bộ mã hóa quay, bạn có thể "mô phỏng" động cơ bước. Làm thế nào chính xác là các bộ mã hóa quay với Arduino chỉ với một vòng lặp cơ bản và không có nhiều mã khác? Nó sẽ "bỏ lỡ một xung" và không ghi lại đủ vòng quay thường xuyên? Làm thế nào tôi có thể xử lý điều này với nhiều mã hơn? Có cách nào tốt hơn để làm điều này? Sẽ làm gián đoạn giúp đỡ? Có một số loại mạch sẽ giúp với vấn đề này?

Lưu ý: Nó có thể sẽ không vượt quá 4 vòng quay một giây ... (Đó có thể là rất nhiều nhưng nếu bạn đang thực hiện cơ chế loại vít dẫn chỉ có thể là 24 inch một phút nếu có 10 vòng quay trên một inch chuyển động tuyến tính. )


Tôi đã sử dụng các bộ mã hóa quay mà từ chối hoạt động bình thường khi được quay nhanh. Tôi đoán nó thay đổi theo giá cả.
jippie

Câu trả lời:


10

Ngắt là những gì bạn sẽ sử dụng trong tình huống này.

Tốc độ mà bạn đã đề cập là đủ chậm để bạn thể đếm nó bên trong một vòng lặp, tuy nhiên điều này không được khuyến khích, vì một vòng lặp thông thường sẽ mất nhiều chu kỳ đồng hồ để hoàn thành và tùy thuộc vào số lượng instuctiuons trên mỗi vòng lặp , bạn có thể bỏ lỡ một số tính.

Ngắt được thực hiện cho mục đích này, vì chúng có thể được kích hoạt bất cứ lúc nào, bất kể trạng thái của vòng lặp.

Có một hàm được đặt tên attachInterrupt()sẽ có ba đối số.

  1. Pin ngắt
  2. Dịch vụ ngắt thường xuyên
  3. Chế độ

Dưới đây là một ví dụ để đếm một ngắt

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Các chế độ như sau:

THẤP, THAY ĐỔI, RỦI RO, LẮP ĐẶT

Thông tin thêm về việc sử dụng ngắt có thể được tìm thấy ở đây .

Tùy thuộc vào bộ mã hóa bạn sử dụng, bạn sẽ cần điều chỉnh mã theo nhu cầu của mình và thực hiện thêm một số tính toán để xác định vị trí của mình, nhưng đây sẽ là điểm khởi đầu tốt.

Chỉnh sửa Dưới đây là một số mã ví dụ từ Arduino Sandbox để sử dụng bộ mã hóa quay.


1
Một máy dò cạnh điều khiển ngắt trên Duemilanove dễ dàng xử lý 100 cạnh mỗi giây (6500 vòng / phút trên động cơ).
Stranger Stranger

@WayfaredStranger Vậy thì không có vấn đề gì với Uno cả. Cảm ơn!
Chim cánh cụt vô danh

1
@AnnonomusPerson - Bạn sẵn sàng bỏ ra bao nhiêu công việc? Nếu bạn đi trần trụi ( ISR_NAKED()), bạn có thể bỏ qua việc tiết kiệm ngữ cảnh C tự động và giảm tốc độ ngắt 100-500 Khz mà không gặp vấn đề gì, nhưng về cơ bản bạn đang viết lắp ráp trong C tại thời điểm đó.
Sói Connor

1
Nếu bạn muốn có một tài liệu banannas hoàn toàn về việc tối ưu hóa crap tuyệt đối khỏi phản ứng gián đoạn, hãy xem tại đây . Đặt mã trực tiếp trong bảng ngắt để giảm thêm độ trễ ngắt!
Sói Connor

1
Ngoài ra, lưu ý rằng nếu bạn đang sử dụng các ngắt có độ trễ thấp, chức năng đính kèm arduino sẽ tiêm toàn bộ chi phí gọi chức năng bổ sung so với sử dụng ngắt ISR()trực tiếp.
Sói Connor

3

Thêm một số tài liệu tham khảo vào các thư viện và ví dụ đã được viết, để cho phép so sánh giữa các cách tiếp cận khác nhau và trải nghiệm với tốc độ so với mức độ nhạy cảm với các bước còn thiếu.

Đọc bộ mã hóa quay: http://playground.arduino.cc/Main/RotaryEncoders

Bộ mã hóa cầu phương quá nhanh đối với Arduino (có Giải pháp): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Thư viện mã hóa Teensy: https://www.pjrc.com/teensy/td_libs_Encoder.html

Đọc bộ mã hóa quay trên Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.