Báo cáo thực hành cảm biến trong điều khiển đọc xung encoder cung cấp cho các bạn sơ đồ nguyên lý cảm biến trong điều khiển đọc xung encoder, lập trình trên arduino,... Với các bạn chuyên ngành Điện - Điện tử thì đây là tài liệu tham khảo hữu ích.
Trang 1GIÁ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
Trang 2I. GI I THI U ENCODER:Ớ Ệ
II. S Đ NGUYÊN LÝ:Ơ Ồ
Trang 3III. 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)
Trang 4#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);
Trang 5// 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ờ
Trang 6// Ki m tra vi c chuy n đ i tr ng thái, xem có th t s thay đ i tr ng thái ể ệ ể ổ ạ ậ ự ổ ạ
ch a: Test transition, did things really change?ư
if( digitalRead(encoderPinA) != A_set ) { // debounce m t l n n a: debounce ộ ầ ữ once more
A_set = !A_set;
// C ng 1 n u có tín hi u A r i có tín hi u B: adjust counter + if A leads Bộ ế ệ ồ ệ
if ( A_set && !B_set )
encoderPos += 1;
rotating = false; // Không c n debounce n a cho đ n khi đầ ữ ế ược nh n l n n a: ấ ầ ữ
no more debouncing until loop() hits again
}
}
// Ng t khi thay đ i tr ng thái B, tắ ổ ạ ở ương t nh A: Interrupt on B changing ự ư ở state, same as A above
void doEncoderB(){
if ( rotating ) delay (1);
if( digitalRead(encoderPinB) != B_set ) {
B_set = !B_set;
// Tr 1 n u B r i đ n A: adjust counter 1 if B leads Aừ ế ồ ế
if( B_set && !A_set )
encoderPos = 1;
Trang 7rotating = false; }
}