Tải bản đầy đủ (.docx) (8 trang)

Hướng dẫn thực hành động cơ GA12 n20 bằng Arduino

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (320.2 KB, 8 trang )

Hướng dẫn thực hành động cơ giảm tốc GA12-N20

1, Mục tiêu
-

Nắm bắt được các chân kết nối của bộ động cơ kèm encoder GA12-N20.
Nắm bắt được các chân chức năng cơ bản của board arduino Uno R3.
Biết cách đọc các thông số cơ bản dựa vào môi trường Arduino UNO R3 của
động cơ đó là :
Thông số vị trí.
Thông số chiều quay.
Thông số tốc độ (RPM : vòng /phút).

2, Dụng cụ cần chuẩn bị







Để tiến hành lắp mạch ta cần sử dụng các linh kiện điện tử sau :
01 board mạch nạp arduino Uno R3.
01 bộ động cơ kèm encoder GA12-N20.
01 cáp nạp dữ liệu từ máy tính xuống arduino.
Dây câu mạch.
Máy tính có cài đặt trình biên dịch arduino IDE.

3, Nguyên lí đo
A, Nguyên tắc xác định vị trí và chiều quay của động cơ.
Do đặt lệch nhau 90 độ nên Pha B (cảm biến B ) sẽ trễ pha hơn Pha A và độ trễ là


90 độ
Giản đồ xung thu được của encoder có dạng sau :


Nhìn vào giản đồ xung ta thấy , khi pha A chuyển trạng thái từ HIGH -> LOW thì
trạng thái của Pha B có thể là HIGH hoặc LOW.
Xét trạng thái của Pha B khi Pha A đang chuyển từ mức tín hiệu logic HIGH>LOW
Nếu :



Pha B có mức tín hiệu đang HIGH thì động cơ quay cùng chiều đồng
hồ.
Pha B có mức tín hiệu đang LOW thì động cơ quay ngược chiều đồng
hồ.

Ngắt (interrupt) là những lời gọi hàm tự động khi hệ thống sinh ra một sự kiện.
Những sự kiện này được nhà sản xuất vi điều khiển thiết lập bằng phần cứng và
được cấu hình trong phần mềm bằng những tên gọi cố định.
Đối với Arduino UNO có cung cấp 2 ngắt đó là pin ngắt 0  chân số 2
Và pin ngắt 1  chân số 3.
Cú pháp trong lập trình :


attachInterrupt(interrupt, ISR, mode);
interrupt: Số thứ tự của ngắt. Trên Arduino Uno, bạn có 2 ngắt với số thứ tự là 0
và 1. Ngắt số 0 nối với chân digital số 2 và ngắt số 1 nối với chân digital số 3.
ISR: tên hàm sẽ gọi khi có sự kiện ngắt được sinh ra.
mode: kiểu kích hoạt ngắt, ở đây chúng ta sử dụng hàm ngắt với mode FALLING
tức là trạng thái chuyển từ mức cao xang mức thấp .

Chúng ta sử dụng ngắt 0 tức chân số 2 (digital pwm) để thực hiện ngắt tại pha
A cảm biến.

B, Nguyên tắc xác định tốc độ của động cơ
Để xác định được tốc độ chúng ta cần phải có 2 tham số là :
1.
2.

Quãng đường di chuyển : ở đây chính là số vòng di chuyển được trong 1
thời gian nhất định.
Thời gian để động cơ quay được 1 số vòng nhất định.

Theo như phần cứng thì đĩa từ có độ phân giải là 7 có nghĩa là cứ cảm biến Hall
đếm được 7 xung thì ta coi như động cơ đã quay được 1 vòng.
Vận tốc = (Số xung nhận từ cảm biến trong 1 giây *60)/7

Để xác định được thời gian trong board mạch Arduino UNO R3 , nhà sản xuất đã
cung cấp công cụ Timer/counter khi lập trình tính toán , cụ thể :
Timer/Counter là module hoạt động độc lập và không thể thiếu của bất kỳ
Microcontroller nào. Chức năng của Timer/Counter gồm: định thời, đếm sự kiện,
tạo xung PWM,....


Chúng ta sử dụng chân số 5 (digital PWM) của board arduino để thực hiện
đếm xung trên pha B cảm biến.

3 , Lắp mạch và lập trình
Thực hiện lắp mạch theo sơ đồ sau :

Nạp code cho board arduino Uno R3.



const int PIN_interrupt=0; // Xác định sử dụng chân ngắt 0
const int phase_A= 2; // Kết nối pha A với pin 2 của Arduino
const int phase_B= 5; // Kết nối pha B với pin 5 timer/counter 1 của Arduino
int count = 0; // Khởi tạo biến đếm xung
long int timetrc,tocdo=0;// khởi tạo biến lưu tốc độ và thời gian tính toán
int direction_of_rotation=3;

void setup(){
// khởi động bộ đếm của Timer/Counter 1
TCCR1A=0;
TCCR1B=0b111;
attachInterrupt(PIN_interrupt,ham_ngat,FALLING);
/*ham ngat cau truc interrupt (chan ngat , viec can lam ,dieu kien ngat) )*/
pinMode(phase_A, INPUT_PULLUP);
pinMode(phase_B, INPUT_PULLUP);
Serial.begin(9600);
}
void loop()
{
// Cứ 1000 milli giây thì lại xét có bao nhiêu xung được đếm ;
// Vận tốc = Số xung/thời gian
if(millis()-timetrc>=1000)
{
noInterrupts(); // Tắt toàn bộ các ngắt
tocdo=(TCNT1*60)/7; // TCNT1 lưu lại số xung của pha B
Serial.println("Dong co encoder GA12_N20");
Serial.println("RPM :");
Serial.println(tocdo);

Serial.println("__________________");
Serial.println("Vi tri :");
Serial.println(count);


if (tocdo ==0){
Serial.println("\n Motor dung yen");
Serial.println("__________________");
goto tt;
}
if (direction_of_rotation==1){
Serial.println("\n Motor xoay phai");
Serial.println("__________________");
goto tt;
}
if (direction_of_rotation==0){
Serial.println("\n Motor xoay trai");
Serial.println("__________________");
goto tt;
}
tt:
timetrc=millis();
TCNT1=0;
interrupts();
}
}
int ham_ngat()
{
if(digitalRead(phase_B) ==LOW)
{

count++;
direction_of_rotation=1;
}
else
{
count--;
direction_of_rotation=0;


}
}
Tiến hành biên dịch gỡ lỗi và nạp code xuống board mạch.
Kết quả :




×