Xem mẫu
GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC NÔNG LÂM THÀNH PHỐ HỒ CHÍ MINH
KHOA CƠ KHÍ – CÔNG NGHỆ
BÁO CÁO THỰC HÀNH CẢM BIẾN TRONG ĐIỀU KHIỂN
ĐỌC XUNG ENCODER
GVHD : Ths. LÊ VĂN BẠN
SVTH : Trần Đức Bảo
LỚP : DH12TD
MSSV : 12138017
Thang 6 năm 2015
I. GIỚI THIỆU ENCODER:
II. SƠ ĐỒ NGUYÊN LÝ:
III. LẬP TRÌNH TRÊN ARDUINO:
/*
Chương trình ngắt cho Encoder quay
Một encoder quay thông thường có 3 chân, nhìn từ mặt trước là A C B
Quay theo chiều kim đồng hồ A(on)>B(on)>A(off)>B(off)
Quay ngược chiều kim đồng hồ B(on)>A(on)>B(off)>A(off)
Ngoài ra còn có một chân có nút nhấn và 2 chân nguồn
*/
#define encoderPinA 2 // Tương ứng chân DT trên Encoder: right (labeled DT on our decoder, yellow wire)
#define encoderPinB 3 // Tương ứng chân CLK trên Encoder: left (labeled CLK on our decoder, green wire)
#define clearButton 8 // Chân của nút nhấn switch (labeled SW on our decoder, orange wire)
// Chân + nối nguồn 5V và chân GND nối cực âm connect the +5v and gnd appropriately
volatile unsigned int encoderPos = 0; // Cho vị trí đầu bằng 0 a counter for the dial
unsigned int lastReportedPos = 1; // Vị trí cuối bằng 1 i change management
static boolean rotating=false; // Quản lý debounce (giống như là chống nhiễu) debounce management
// các biến cho trình phục vụ ngắt interrupt service routine vars
boolean A_set = false;
boolean B_set = false;
void setup() {
pinMode(encoderPinA, INPUT_PULLUP); // INPUTPULLUP tương đương Mode INPUT và tự động nhận trạng thái HIGH hoặc LOW
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(clearButton, INPUT_PULLUP);
// Chân encoder trên ngắt 0 (chân 2): encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, doEncoderA, CHANGE);
// Chân encoder trên ngắt 1 (chân 3) encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, doEncoderB, CHANGE);
Serial.begin(9600); // chuyển dữ liệu lên cổng Serial Port
}
// Vòng lặp chính, công việc được thực hiện bởi trình phục vụ ngắt: main loop, work is done by interrupt service routines, this one only prints stuff
void loop() {
rotating = true; // Khởi động bộ debounce (có thể hiểu như bộ chống nhiễu): reset the debouncer
if (lastReportedPos != encoderPos) {
Serial.print("Index:");
Serial.println(encoderPos, DEC);
lastReportedPos = encoderPos;
}
if (digitalRead(clearButton) == LOW ) {
encoderPos = 0;
}
}
// Ngắt khi chuyển trạng thái của A: Interrupt on A changing state
void doEncoderA(){
// debounce
if ( rotating ) delay (1); // Chờ 1 chút wait a little until the bouncing is done
...
- tailieumienphi.vn
nguon tai.lieu . vn