Bộ mã hóa vòng quay là loại cảm biến vị trí được sử dụng để xác định vị trí góc của trục quay. Nó tạo ra tín hiệu điện, tương tự hoặc kỹ thuật số, theo chuyển động quay.
Có nhiều loại bộ mã hóa vòng quay khác nhau được phân loại theo Tín hiệu đầu ra hoặc Công nghệ cảm biến. Bộ mã hóa quay đặc biệt mà chúng ta sẽ sử dụng trong hướng dẫn này là một bộ mã hóa quay gia tăng và đó là bộ cảm biến vị trí đơn giản nhất để đo vòng quay.
Bộ mã hóa quay này còn được gọi là bộ mã hóa cầu phương hoặc bộ mã hóa quay tương đối và đầu ra của nó là một loạt các xung sóng vuông.
Cách hoạt động của bộ mã hóa vòng quay
Chúng ta hãy xem xét kỹ hơn bộ mã hóa và xem nguyên tắc làm việc của nó. Đây là cách các xung sóng vuông được tạo ra: Bộ mã hóa có đĩa với các vùng tiếp xúc cách đều nhau được nối với chân C chung và hai chân tiếp xúc riêng biệt khác A và B, như minh họa bên dưới.
Khi đĩa sẽ bắt đầu xoay từng bước, các chân A và B sẽ bắt đầu tiếp xúc với chốt chung và hai tín hiệu đầu ra sóng vuông sẽ được tạo ra tương ứng.
Bất kỳ đầu ra nào trong hai đầu ra đều có thể được sử dụng để xác định vị trí xoay nếu chúng ta chỉ đếm các xung của tín hiệu. Tuy nhiên, nếu chúng ta muốn xác định hướng xoay là tốt, chúng ta cần xem xét cả hai tín hiệu cùng một lúc.
Chúng ta có thể nhận thấy rằng hai tín hiệu đầu ra được di dời ở 90 độ ra khỏi pha từ nhau. Nếu bộ mã hóa quay theo chiều kim đồng hồ thì đầu ra A sẽ ở phía trước đầu ra B.
Vì vậy, nếu chúng ta đếm các bước mỗi khi tín hiệu thay đổi, từ Cao xuống Thấp hoặc từ Thấp đến Cao, chúng ta có thể nhận thấy tại thời điểm đó hai tín hiệu đầu ra có giá trị ngược lại. Ngược lại, nếu bộ mã hóa quay ngược chiều kim đồng hồ thì tín hiệu đầu ra có giá trị bằng nhau. Vì vậy, xem xét điều này, chúng ta có thể dễ dàng lập trình bộ điều khiển của chúng tôi để đọc vị trí bộ mã hóa và hướng quay.
Ví dụ Arduino mã hóa quay
Hãy tạo một ví dụ thực tế về nó bằng cách sử dụng Arduino. Các mô-đun cụ thể mà tôi sẽ sử dụng cho ví dụ này đi kèm trên một bảng đột phá và nó có năm chân. Pin đầu tiên là đầu ra A, pin thứ hai là đầu ra B, chân thứ ba là nút Pin và tất nhiên hai chân kia là VCC và chân GND.
Chúng tôi có thể kết nối các chân đầu ra với bất kỳ pin kỹ thuật số nào của Bảng mạch Arduino.
Bạn có thể nhận được các thành phần cần thiết cho Hướng dẫn Arduino này từ các liên kết dưới đây:
- Mô-đun bộ mã hóa quay ………………. Amazon / Banggood
- Bảng Arduino …………………………… Amazon / Banggood
- Breadboard và Jump Wires ……… Amazon / Banggood
* Xin lưu ý: Đây là những liên kết liên kết. Tôi có thể thực hiện một khoản hoa hồng nếu bạn mua các thành phần thông qua các liên kết này. Tôi sẽ đánh giá cao sự hỗ trợ của bạn theo cách này!
Mã nguồn
Đây là mã Arduino:
- /* Arduino Rotary Encoder Tutorial
- *
- * by Dejan Nedelkovski, www.HowToMechatronics.com
- *
- */
- #define outputA 6
- #define outputB 7
- int counter = 0;
- int aState;
- int aLastState;
- void setup() {
- pinMode (outputA,INPUT);
- pinMode (outputB,INPUT);
- Serial.begin (9600);
- // Reads the initial state of the outputA
- aLastState = digitalRead(outputA);
- }
- void loop() {
- aState = digitalRead(outputA); // Reads the "current" state of the outputA
- // If the previous and the current state of the outputA are different, that means a Pulse has occured
- if (aState != aLastState){
- // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
- if (digitalRead(outputB) != aState) {
- counter ++;
- } else {
- counter --;
- }
- Serial.print("Position: ");
- Serial.println(counter);
- }
- aLastState = aState; // Updates the previous state of the outputA with the current state
- }
Mô tả mã: Vì vậy, trước tiên chúng ta cần phải xác định các chân mà bộ mã hóa của chúng tôi được kết nối và xác định một số biến cần thiết cho chương trình. Trong phần thiết lập, chúng ta cần xác định hai chân là đầu vào, bắt đầu giao tiếp nối tiếp để in kết quả trên màn hình nối tiếp, cũng như đọc giá trị ban đầu của đầu ra A và đặt giá trị vào biến aLastState.
Sau đó, trong phần vòng lặp, chúng ta đọc đầu ra A một lần nữa nhưng bây giờ chúng ta đặt giá trị vào biến aState. Vì vậy, nếu chúng ta xoay bộ mã hóa và xung được tạo ra, hai giá trị này sẽ khác nhau và câu lệnh "if" đầu tiên sẽ trở thành sự thật. Ngay sau đó sử dụng câu lệnh “if” thứ hai, chúng ta xác định hướng quay. Nếu trạng thái đầu ra B khác với đầu ra A trạng thái bộ đếm sẽ được tăng lên một, nếu không thì nó sẽ bị giảm. Cuối cùng, sau khi in kết quả trên màn hình nối tiếp, chúng ta cần cập nhật biến aLastState với biến aState.
Đó là tất cả những gì chúng ta cần cho ví dụ này. Nếu tải lên mã, bắt đầu Serial Monitor và bắt đầu xoay bộ mã hóa, chúng tôi sẽ bắt đầu nhận được các giá trị trong màn hình nối tiếp. Các mô-đun cụ thể mà tôi đã làm cho 30 đếm mỗi chu kỳ đầy đủ.
Ví dụ 2 - Điều khiển động cơ bước sử dụng bộ mã hóa quay
Ngoài ví dụ cơ bản này, tôi đã thực hiện thêm một ví dụ về kiểm soát vị trí động cơ bước bằng cách sử dụng bộ mã hóa vòng quay.
Đây là mã nguồn của ví dụ này:
- /* Stepper Motor using a Rotary Encoder
- *
- * by Dejan Nedelkovski, www.HowToMechatronics.com
- *
- */
- #include <LiquidCrystal.h> // includes the LiquidCrystal Library
- LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
- // defines pins numbers
- #define stepPin 8
- #define dirPin 9
- #define outputA 10
- #define outputB 11
- int counter = 0;
- int angle = 0;
- int aState;
- int aLastState;
- void setup() {
- // Sets the two pins as Outputs
- pinMode(stepPin,OUTPUT);
- pinMode(dirPin,OUTPUT);
- pinMode (outputA,INPUT);
- pinMode (outputB,INPUT);
- aLastState = digitalRead(outputA);
- lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display }
- }
- void loop() {
- aState = digitalRead(outputA);
- if (aState != aLastState){
- if (digitalRead(outputB) != aState) {
- counter ++;
- angle ++;
- rotateCW();
- }
- else {
- counter--;
- angle --;
- rotateCCW();
- }
- if (counter >=30 ) {
- counter =0;
- }
- lcd.clear();
- lcd.print("Position: ");
- lcd.print(int(angle*(-1.8)));
- lcd.print("deg");
- lcd.setCursor(0,0);
- }
- aLastState = aState;
- }
- void rotateCW() {
- digitalWrite(dirPin,LOW);
- digitalWrite(stepPin,HIGH);
- delayMicroseconds(2000);
- digitalWrite(stepPin,LOW);
- delayMicroseconds(2000);
- }
- void rotateCCW() {
- digitalWrite(dirPin,HIGH);
- digitalWrite(stepPin,HIGH);
- delayMicroseconds(2000);
- digitalWrite(stepPin,LOW);
- delayMicroseconds(2000);
- }