* Giới thiệu:
Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) được dùng nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển được động cơ bước là ta đã có thể tự xây dựng được cho mình rất nhiều hệ thống tự động.
*Mục tiêu: Sau khi học xong bài học này, người học có khả năng:
- Trình bày được cấu tạo, chức năng và nguyên lý hoạt động của động cơ bước, mạch ULN 2003.
- Vẽ được sơ đồ nguyên lý mạch điều khiển động cơ bước
- Mô phỏng được chương trình mạch điều khiển động cơ bước bằng phần mềm mô phỏng
- Kết nối được phần cứng mạch điều khiển động cơ bước đúng yêu cầu kỹ thuật.
- Viết, nạp và chạy được chương trình điều khiển động cơ bước
- Rèn luyện tính tư duy và tác phong công nghiệp , đảm bảo an toàn cho người và thiết bị
*Nội dung:
133 trang |
Chia sẻ: Tiểu Khải Minh | Ngày: 23/02/2024 | Lượt xem: 59 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình vi điều khiển (Trình độ: Cao đẳng) - Trường Cao đẳng Nghề Kỹ thuật Công nghệ Bà Rịa Vũng Tàu, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
l
Mode: là chế độ vào ( INPUT), ra (OUTPUT). Lệnh tiếp theo.
pinMode(ledPin, OUTPUT);
Lệnh này thiết lập chân số 9 trên board là chân ngõ ra (OUTPUT). Nếu
không khai báo “ int ledPin = 9; ” thì bạn có thể viết cách sau nhƣng ý nghĩa
không thay đổi:
pinMode(9, OUTPUT);
Bắt buộc khai báo một hàm loop() trong Arduino IDE. Hàm này là vòng lặp
vô hạn
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000); digitalWrite(ledPin,
LOW);
delay(1000);
}
Tiếp theo ta sẽ phân tích hàm digitalWrite( ledPin, HIGH); lệnh này có ý
nghĩa là xuất ra chân digital có tên là ledPin ( chân 9) mức cao ( HIGH), mức cao
tƣớng ứng là 5 volt.
delay(1000);
Lệnh này tạo một khoảng trễ với thời gian là 1 giây. Trong hàm delay() của
IDE thì 1000 tƣơng ứng với 1 giây.
digitalWrite(ledPin, LOW);
Cũng giống nhƣ digitalWrite( ledPin, HIGH); lệnh này xuất ra chân ledPin
mức thấp (LOW) tức là 0 volt.
Và tiếp tục là một hàm delay().
Nhƣ vậy chúng ta có thể thấy chƣơng trình sẽ thực hiện tắt sáng led liên tục không
ngừng trừ khi ta ngắt nguồn
CÂU HỎI ÔN TẬP
Câu 1: Thiết kế phần cứng và lập trình điều khiển 8 led đơn chạy từ trái sang phải?
88
BÀI 6: GIAO TIẾP VỚI LED 7 ĐOẠN
*Giới thiệu
Bài học này giới thiệu về cách thiết kế , gia công và lập trình điều khiển led 7
đoạn đƣợc ứng dụng rộng rãi trong thực tế
*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo và nguyên lý hoạt động của led 7 đoạn
- Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp LED 7 đoạn với Arduino
- Mô phỏng đƣợc chƣơng trình mạch giao tiếp LED 7 đoạn với Arduino bằng
phần mềm mô phỏng
- Kết nối đƣợc phần cứng mạch giao tiếp LED 7 đoạn với Arduino đúng yêu
cầu kỹ thuật.
- Viết, nạp và chạy đƣợc chƣơng trình giao tiếp LED 7 đoạn với Arduino
*Nội dung:
1. Cấu tạo led 7 đoạn
Hình 6.1. Led 7 đoạn thực tế
Thực ra cấu trúc của LED 7 đoạn gồm 8 LED đơn, nhìn lên hình trên chắc Chúng
ta cũng thấy gồm có 7 đoạn và một dấu chấm nhỏ, mỗi đoạn và dấu chấm nhỏ đó là
một LED đơn.
Việc sử dụng LED 7 đoạn chúng ta có thể sử dụng để hiển thị các số, các chữ
cái anphabet và nhiều kiểu ký tự khác nhau. Nhƣ trên hình Chúng ta đã thấy, một
LED 7 đoạn đơn gồm 10 chân đó là các chân: a, b, c, d, e, f, g, 2 chân chung và
chân dấu chấm tròn (DP).
LED 7 đoạn gồm 2 loại đó là dƣơng chung và âm chung. Trong bài học này
chúng ta sẽ viết chƣơng trình và tải vào Arduino để hiển thị các số từ 0-9 ( Loại âm
chung).
89
Hình 6.2. Vi trí chân Led 7 đoạn
Để LED hiển thị chúng ta phải làm cho 8 LED đơn nhƣ ở trên hiển thị, ví dụ ở đây
8 LED ở đây là các led mang kí tự a, b, c, d, e, f, g và một dấu chấm ở chân cuối.
Bây giờ chúng ta thử suy nghĩ nếu chúng ta muốn hiển thị số 0 chúng ta phải làm
thế nào? Nhìn vào hình LED hiển thị ở đầu bài chúng ta thấy: Để hiển thị số 0 thì
chúng ta phải làm cho các LED đơn a, b, c, d, e, f phải sáng lên, dấu chấm và g
phải tắt đi. Nhƣ vậy để tạo số 0 chúng ta phải thể hiện mã code hệ nhị phân (binary)
là B111111100. Tƣơng tự đối với số 1 thì có những cái LED nào sáng? Chúng ta có
thể viết đƣợc mã làm xuất hiện số 1 đƣợc không? Đó là: B01100000. Tƣơng tự đối
với các số 2. 3, 4, 5, 6, 7, 9. Để dễ hiểu hơn tôi xin đƣa ra một bảng sau để Chúng
ta dò.
Lƣu ý: sáng là 1, tắt là 0.
Bảng 6.1. Giải mã Led 7 đoạn
90
2. Phần cứng
chuẩn bị:
Mạch Arduino (ở đây ta sử dụng Arduino UNO).
Breadboard còn gọi testboard.
Dây test board.
Điện trở 220 Ω.
1 led 7 đoạn đơn.
Lắp mạch:
CHÂN LED 7 ĐOẠN CHÂN ARDUINO
a 2
b 3
c 4
d 5
e 6
f 7
g 8
DP 9
Hình 6.3. Giao tiếp Arduino với Led 7 đoạn
91
3. Lập trình và giải thích.
// Khai báo chân
const int G = 8; // G= Arduino chân 8
const int F = 7; // F= Arduino chân 7
const int A = 2; // A = Arduino chân 2
const int B = 3; // B = Arduino chân 3
const int E = 6; // E = Arduino chân 6
const int D = 5; // D = Arduino chân 5
const int C = 4; // C = Arduino chân 4
const int dp = 9; // dp = Arduino chân 9
const int second = 1000; // thiết lập với mili giây, 1000 milliseconds = 1 second
const int digit = 10; // Số ký tự hiển thị10 digits (0 - 9)
const int segment = 7; // Số thanh hiển thị trong LED (7)
// Định nghĩa những thanh( led đơn) sáng
byte digseg[digit][segment] = {
{ 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
{ 1,1,0,1,1,0,1 }, // = 2
{ 1,1,1,1,0,0,1 }, // = 3
{ 0,1,1,0,0,1,1 }, // = 4
{ 1,0,1,1,0,1,1 }, // = 5
{ 1,0,1,1,1,1,1 }, // = 6
{ 1,1,1,0,0,0,0 }, // = 7
{ 1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,1,0,1,1 } // = 9
};
void setup() { // Định nghĩa chân xuất tín hiệu OUTPUT
writeDigit(digit);
delay(second);
}
delay(4*second);
}
CÂU HỎI ÔN TẬP
Câu 1: Thiết kế phần cứng và lập trình điều khiển mạch đếm từ 1 đến 8 ?
92
BÀI 7: GIAO TIẾP VỚI LCD
* Giới thiệu: LCD không chỉ hiển thị các chuỗi ký tự hay số đơn giản mà ta còn
có thể thêm vào các hiệu ứng giúp cho giao diện thêm sinh động và thú vị hơn tùy
theo ý muốn.
*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo và nguyên lý hoạt động của LCD
- Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp LCD với Arduino
- Mô phỏng đƣợc chƣơng trình mạch giao tiếp LCD với Arduino bằng phần
mềm mô phỏng
- Kết nối đƣợc phần cứng mạch giao tiếp LCD với Arduino đúng yêu cầu kỹ
thuật.
- Viết, nạp và chạy đƣợc chƣơng trình giao tiếp LCD với Arduino.
**Nội dung:
1. Cấu tạo LCD.
* Giới thiệu module LCD 16X02:
Trong bài này Chúng ta sẽ tìm cách điều khiển màn hình LCD bằng Arduino mà
không sử dụng module I2C LCD. Chỉ cần Arduino bạn có thể điều khiển đƣợc
LCD nhƣng lại tốn khá nhiều chân của arduino, Ở phần tiếp theo chúng ta sẽ sử
dụng module I2C để giải quyết vấn đề đó.
Hình 7.1. màn hình LCD16x2
2. Phần cứng
- Chuẩn bị :
93
Mạch Arduino (ở đây ta sử dụng Arduino UNO).
Breadboard còn gọi testboard
1 module LCD 16x02.
Dây cắm test board.
1 biến trở 10K.
- Lắp mạch:
Hình 7.2. Giao tiếp Arduino với LCD 16x2
94
3. Lập trình và giải thích
#include //Khai báo thư viện cho LCD ( Thư viện đã có sẵn)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //noi voi chan LCD LAN LUOT : Rs, E, D4,
D5, D6, D7
void setup() {
//Thông báo đây là LCD 1602
lcd.print("DIEN – DIEN TU!"); //In ra màn hình lcd dòng chữ DIEN – DIEN TU
}
void loop() {
lcd.setCursor(0, 1); // đặt con trỏ vào cột 0, dòng 1
lcd.print(" truong cao đang KT"); // In ra dong chu
}
CÂU HỎI ÔN TẬP
Câu 1: Viết chƣơng trình điều khiển chuỗi ký tự chạy từ trái qua phải ?
95
BÀI 8: ADC-ĐỌC TÍN HIỆU MỘT SỐ LOẠI CẢM BIẾN.
*Giới thiệu
Bài học này giới thiệu về cách thiết kế và lập trình cho một loại cảm biến
đƣợc ứng dụng nhiều trong thực tế
*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo và nguyên lý hoạt động của, cảm biến lm35, bộ
ADC trong Arduino.
- Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp cảm biến với Arduino
- Mô phỏng đƣợc chƣơng trình mạch giao tiếp cảm biến với Arduino bằng
phần mềm mô phỏng
- Kết nối đƣợc phần cứng mạch giao tiếp cảm biến với Arduino đúng yêu cầu
kỹ thuật.
- Viết, nạp và chạy đƣợc chƣơng trình giao tiếp cảm biến với Arduino.
*Nội dung:
1. Giới thiệu ADC
* Bộ chuyển đổi ADC:
ADC (Analog Digital Converter) là bộ chuyển đổi tín hiệu tƣơng tự sang số dùng
để chuyển đổi các tín hiệu tƣơng tự từ bên ngoài (nhiệt độ, độ ẩm, ) về dạng số
để vi điều khiển có thể xử lý đƣợc. Không phải tất cả các chân của Arduino đều có
khả năng ADC. Trên board Arduino, các chân đƣợc ký hiệu Ax (A0 đến A5 trên
UNO) để cho biết các chân này có thể đọc đƣợc điện áp tƣơng tự.
Bộ chuyển đổi ADC trên mỗi vi điều khiển là khác nhau. Trên Arduino là 10-bit,
có nghĩa là nó có khả năng phát hiện 1024 (2^10) mức tín hiệu số rời rạc.
* Điện áp tham chiếu Vref:
Điện áp tham chiếu là giá trị điện áp lớn nhất mà ADC có thể chuyển đổi đƣợc.
Mặc định khi đƣợc cấp nguồn điện áp tham chiếu của Arduino là 5V (có nghĩa là
5V ứng với giá trị ADC max là 1023, với board Arduino 3.3V thì 3.3V ứng với giá
trị lớn nhất là 1023). Ngoài ra Arduino còn đƣợc tích hợp các bộ tham chiếu nội, và
bộ tham chiếu ngoại tại chân AREF.
* Mối quan hệ giữa giá trị ADC và điện áp:
Với giá trị ADC lớn nhất là 2^n - 1 ↔ giá trị điện áp lớn nhất Vref .Với giá trị
ADC bất kỳ (Gia_tri_ADC) ↔ giá trị điện áp Vđo bất kỳ → Giá trị điện áp ra Vđo
tại một giá trị ADC đo đƣợc là (n là độ phân giải của bộ ADC):
96
Tính toán giá trị điện áp:
Với điện áp tham chiếu mặc định của Arduino là và độ phân giải là 10-bit, ta có
điện áp đo đƣợc tại chân A0 của triết áp là:
2. Phần cứng
Chuẩn bị:
Arduino UNO R3
Cảm biến nhiệt độ LM35
Lắp mạch :
Hình 8.1.Giao tiếp Arduino với LM35
Tính toán giá trị nhiệt độ:
Với cảm biến nhiệt độ LM35, chúng ta có cứ 10mV sự thay đổi của điện áp ứng
với 1°C. Với điện áp đọc đƣợc, giá trị của nhiệt độ là:
Chƣơng trình:
void setup() {
// Khởi tạo Serial tốc độ 9600bps
Serial.begin(9600);
}
97
void loop() {
// Đọc giá trị ADC tại chân A0
int adcValue = analogRead(A0);
// Tính toán giá trị nhiệt độ đo đƣợc
float temp = (float)adcValue * 500 / 1023;
// In ra Serial giá trị nhiệt độ với 2 chữ số sau dấu phẩy
Serial.print("Nhiet do: ");
Serial.println(temp, 2);
// Trễ 500ms
delay(500);
}
Kết quả:
Bật màn hình Serial monitor với tốc độ 9600bps, mỗi khi tác động thay đổi nhiệt độ
trên LM35, chúng ta sẽ nhận đƣợc giá trị hiển thị trên màn hình Serial monitor.
CÂU HỎI ÔN TẬP
Câu 1: Viết chƣơng trình điều khiển đọc giá trị cảm biến hiển thị thông số lên LCD
?
98
BÀI 9: NGẮT NGOÀI .
* Giới thiệu: Là một số sự kiện khẩn cấp bên trong hoặc bên ngoài bộ vi điều
khiển xảy ra, buộc vi điều khiển tạm dừng thực hiện chƣơng trình hiện tại, phục vụ
ngay lập tức nhiệm vụ mà ngắt yêu cầu – nhiệm vụ này gọi là trình phục vụ ngắt
(ISR: Interrupt Service Routine).
*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng:
- Trình bày đƣợc nguyên lý hoạt động của ngắt ngoài trong Arduino
- Vẽ đƣợc sơ đồ nguyên lý mạch ngắt ngoài
- Mô phỏng đƣợc chƣơng trình mạch ngắt ngoài Arduino bằng phần mềm mô
phỏng
- Kết nối đƣợc phần cứng mạch ngắt ngoài Arduino đúng yêu cầu kỹ thuật.
- Viết, nạp và chạy đƣợc chƣơng trình ngắt ngoài Arduino
- Rèn luyện tính tƣ duy và tác phong công nghiệp , đảm bảo an toàn cho
ngƣời và thiết bị
*Nội dung:
1. Giới thiệu ngắt ngoài
Interrupts, thƣờng đƣợc gọi là ngắt, là một tín hiệu khẩn cấp gởi đến bộ xử lí,
yêu cầu bộ xử lí tạm ngừng tức khắc các hoạt động hiện tại để “nhảy” đến một nơi
khác thực hiện một nhiệm vụ khẩn cấp nào đó, nhiệm vụ này gọi là trình phục vụ
ngắt – isr (interrupt service routine ). Sau khi kết thúc nhiệm vụ trong isr, bộ đếm
chƣơng trình sẽ đƣợc trả về giá trị trƣớc đó để bộ xử lí quay về thực hiện tiếp các
nhiệm vụ còn dang dở. Nhƣ vậy, ngắt có mức độ ƣu tiên xử lí cao nhất, ngắt
thƣờng đƣợc dùng để xử lí các sự kiện bất ngờ nhƣng không tốn quá nhiều thời
gian. Các tín hiệu dẫn đến ngắt có thể xuất phát từ các thiết bị bên trong chip (ngắt
báo bộ đếm timer/counter tràn, ngắt báo quá trình gởi dữ liệu bằng RS232 kết
thúc) hay do các tác nhân bên ngoài (ngắt báo có 1 button đƣợc nhấn, ngắt báo
có 1 gói dữ liệu đã đƣợc nhận).
Ngắt là một trong 2 kỹ thuật “bắt” sự kiện cơ bản là hỏi vòng (Polling) và ngắt.
Hãy tƣởng tƣợng bạn cần thiết kế một mạch điều khiển hoàn chỉnh thực hiện rất
nhiều nhiệm vụ bao gồm nhận thông tin từ ngƣời dùng qua các button hay keypad
(hoặc keyboard), nhận tín hiệu từ cảm biến, xử lí thông tin, xuất tín hiệu điều khiển,
hiển thị thông tin trạng thái lên các LCD(bạn hoàn toàn có thể làm đƣợc với
AVR), rõ ràng trong các nhiệm vụ này việc nhận thông tin ngƣời dùng (start, stop,
setup, change,) rất hiếm xảy ra (so với các nhiệm vụ khác) nhƣng lại rất “khẩn
cấp”, đƣợc ƣu tiên hàng đầu. Nếu dùng Polling nghĩa là bạn cần viết 1 đoạn chƣơng
99
trình chuyên thăm dò trạng thái của các button (tôi tạm gọi đoạn chƣơng trình đó là
Input()) và bạn phải chèn đoạn chƣơng trình Input() này vào rất nhiều vị trí trong
chƣơng trình chính để tránh trƣờng hợp bỏ sót lệnh từ ngƣời dùng, điều này thật
lãng phí thời gian thực thi. Giải pháp cho vấn đề này là sử dụng ngắt, bằng cách kết
nối các button với đƣờng ngắt của chip và sử dụng chƣơng trình Input() làm trình
phục vụ ngắt - isr của ngắt đó, bạn không cần phải chèn Input() trong lúc đang thực
thi và vì thế không tốn thời gian cho nó, Input() chỉ đƣợc gọi khi ngƣời dùng nhấn
các button. Đó là ý tƣởng sử dụng ngắt.
Hình 1 minh họa cách tổ chức ngắt thông thƣờng trong các chip AVR. Số lƣợng
ngắt trên mỗi dòng chip là khác nhau, ứng với mỗi ngắt sẽ có vector ngắt, vector
ngắt là các thanh ghi có địa chỉ cố định đƣợc định nghĩa trƣớc nằm trong phần đầu
của bộ nhớ chƣơng trình. Ví dụ vector ngắt ngoài 0 (external interrupt 0) của chip
atmega8 có địa chỉ là 0x001 (theo datasheet từ Atmel). Trong lúc chƣơng trình
chính đang thực thi, nếu có một sự thay đổi dẫn đến ngắt xảy ra ở chân INT0 (chân
4), bộ đếm chƣơng trình (Program Counter) nhảy đến địa chỉ 0x001, giả sử ngay tại
địa chỉ 0x001 chúng ta có đặt 1 lệnh RJMP đến một trình phục vụ ngắt (IRS1 chẳng
hạn), một lần nữa bộ đếm chƣơng trình nhảy đến IRS1 để thực thi trình phục vụ
ngắt, kết thúc ISR1, bộ đếm chƣơng trình lại quay về vị trí trƣớc đó trong chƣơng
trình chính, quá trình ngắt kết thúc. Không mang tính bắt buộc nhƣng tôi khuyên
bạn nên tổ chức chƣơng trình ngắt theo cách này để tránh những lỗi liên quan đến
địa chỉ chƣơng trình.
- Ngắt ngoài ( External Interrupt)
Ngắt ngoài xảy ra khi có một sự kiện bất ngờ xảy ra trên một trong số chân ngắt.
Sự kiện đó có thể là chân đó ở mức cao, hoặc ở mức thấp, hoặc đang đƣợc kéo lên
hoặc đang đƣợc kéo xuống. Hầu hết các board Arduino có ít nhất là 2 chân ngắt
- Ngắt trên arduino.
Trình ngắt trên arduino là (interrupt service routine- ISR), có chức năng là
tạo một một sự kiện cho mạch arduino. Hầu hết mạch arduino có 2 ngắt ngoài: ngắt
0 (chân số 2) ngắt 1 (chân số 3). Cụ thể nhƣ sau:
Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7
Due
(see below)
100
Đặc biệt đối với mạch Arduino Due thì tất cả chân đều có thể là chân ngắt hết. bạn
có thể gán chân ngắt bằng hàm attachInterrupt().
Cấu trúc của hàm ngắt
attachInterrupt(interrupt, ISR, mode)
attachInterrupt(thứ tự ngắt, tên chương trình con thực hiện ngắt, chế độ ngắt)
trong đó:
thứ tự ngắt: có kiểu (int), ta điền số 0 đối với ngắt 0, số 1 đối với ngắt 1.
tên chƣơng trình con thực hiện ngắt: khai báo một chƣơng trình con, để khi
sự kiện ngắt xảy ra thì sẽ thực hiện chƣơng trình con đó.
- Chế đó ngắt: khai báo kiểu ngắt, có 4 kiểu ngắt.
LOW: ngăt mức thấp, thực hiện chƣơng trình ngắt khi chân ngắt ở
mực thấp (0v)
CHANGE: Ngắt khi có thay đổi, thực hiện chƣơng trình ngắt khi có
thay đổi
trên chân ngắt, từ thấp lên cao, từ cao xuống thấp (cạnh lên, cạnh xuống)
RISING to: Ngắt cạnh lên, thực hiện chƣơng trình ngắt khi chân ngắt
từ mức
thấp lên mức cao.
FALLING: Ngắt cạnh xuống, thực hiện chƣơng trình ngắt khi chân
ngắt từ
mức cao lên mức thấp.
(
interrupt: số tứ thự của ngắt, từ 0-5, ví dụ bạn dùng ngắt tại pin 2 thì số thứ tự sẽ là
0
ISR : Hàm ngắt, đây là tiến trình sẽ thực hiện khi xảy ra ngắt, có thể đặt tên tùy
ý, hàm này đƣợc khai báo nhƣ một hàm con bình thƣờng
mode : chế độ ngắt, cố 5 chế độ nhƣ sau:
LOW (ngắt khi ở mức thấp)
HIGH (ngắt khi ở mức cao)
FALLING ( ngắt khi cạnh xuống)
RISING (ngắt khi cạnh lên)
CHANGE (ngắt khi mức logic ở chân thay
đổi)
)
Chú ý:
Hàm ngắt không có thông số trả về.
101
Khi sử dụng ngắt thì một số hàm nhƣ delay() có thể sẽ bị sai vài mili giây, vì trong
quá trình thực hiện lệnh delay thì xảy ra ngắt. cũng có ảnh hƣởng tƣơng tự đối với
các hàm truyền nhận UART.
- Ứng dụng của ngắt.
Ngắt thƣờng đƣợc sử dụng để giúp vi điều khiển thực hiện chƣơng trình
chính xác và thông minh hơn, có thể giúp bạn giải một số khó khăn về thời gian.
Một số chức năng thƣờng dùng ngắt nhƣ: Đếm encoder, quản lý các ngõ vào hiệu
quả hơn.
Dễ dàng nhận thấy đƣợc rằng để đọc xung của encoder, mà không mất xung nào thì
chƣơng trình của bạn không thể làm gì khác vì phải kiểm tra liên tục. Nhƣng đối
với ngắt thì khác, giúp bạn chủ động hơn trong việc bắt sự khi khi có cạnh lên hoặc
cạnh xuống ở chân ngắt.
2. Phần cứng
Hình 9.1. giao tiếp Arduino với nút nhấn
3. Lập trình và giải thích
int led = 13;
volatile int trangthai = LOW; // khai báo biến kiểu volatile, tránh sai số trong quá
102
trình thực hiện ngắt.
void setup() // đoạn chƣơng trình cài đặt
{
pinMode(led, OUTPUT); // khai báo led là ngõ ra
digitalWrite(2, HIGH); // Treo chân ngắt 0, chân số 2 lên mức cao.
attachInterrupt(0, daoled, CHANGE); // khai báo ngắt 0, chƣơng trình con
daoled, chế độ có sự
// thay đổi là sinh ngắt
}
void loop() // đoạn chƣơng trình chính, vòng lặp vô tận.
{
digitalWrite(led, trangthai); // gán tráng thái cho chân led.
}
void daoled() // chƣơng trình con ngắt, khi có ngắt xảy ra sẽ thực hiện
chƣơng trình này.
{
trangthai = !trangthai; // đảo trang thái.
}
CÂU HỎI ÔN TẬP
Câu 1:Thế nào là ngắt ngoài?
Câu 1: Viết chƣơng trình điều khiển ngắt ngoài hiển thị lên LCD ?
103
BÀI 10: TIMER-COUNTER .
* Giới thiệu:
Timer/Count có chức năng: Đếm sự kiện, Định thời và tạo xung PWM, để giữ mọi
thứ đơn giản, trong bài này chỉ giới thiệu chức năng cơ bản của Timer/Counter khi
lập trình trên Arduino là "Định thời"
*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng:
- Trình bày đƣợc chức năng,nguyên lý hoạt động của các thanh ghi timer –
counter trong Arduino
- Vẽ đƣợc sơ đồ nguyên lý mạch Led 7 đoạn sử sụng ngắt timer
- Mô phỏng đƣợc chƣơng trình mạch Led 7 đoạn sử sụng ngắt timer bằng
phần mềm mô phỏng
- Kết nối đƣợc phần cứng mạch Led 7 đoạn sử sụng ngắt timer đúng yêu cầu
kỹ thuật.
-Viết, nạp và chạy đƣợc chƣơng trình Led 7 đoạn sử sụng ngắt timer Arduino
*Nội dung:
1. Giới thiệu bộ timer- counter
Trên chip Atmega328p của Arduino có 3 bộ Timer/Counter là:
Timer/Counter0 (8bit), Timer/Counter1 (16 bit), Timer/Counter2 (8 bit).
Để không làm ảnh hƣởng đến hàm delay() và millis() của Arduino, ta sẽ không đề
cập đến Timer/Counter0.
Nhƣ đã giới thiệu, Timer/Count có chức năng: Đếm sự kiện, Định thời và tạo
xung PWM, để giữ mọi thứ đơn giản, trong bài này chỉ giới thiệu chức năng cơ bản
của Timer/Counter khi lập trình trên Arduino là "Định thời" (Arduino đã hỗ trợ
hàm built-in analogWrite để tạo xung PWM nên chúng ta cũng không đề cập đến
nữa).
Timer/Counter1: là 1 bộ Timer/Counter đa năng 16 bit, gồm 5 chế độ hoạt
động.
Timer/Counter2: là 1 bộ Timer/Counter 8 bit, gồm 4 chế độ.
Trong pham vi bài viết ta sẽ giới thiệu Normal Mode và Clear Timer on Compare
Match (CTC) mode trên Timer/Counter1 và Timer/Counter2.Để thuận tiện viết tắt
Timer/Counter thành T/C.
Trƣớc khi bắt đầu, có 1 số định nghĩa quan trong chúng ta cần rõ:
BOTTOM: là giá trị thấp nhất mà 1 T/C đạt đƣợc, tất nhiên BOTTOM luôn bằng
0.
104
MAX: là giá trị lớn nhất mà 1 T/C có thể đạt đƣợc, ở thanh ghi 8 bit giá trị MAX =
2^8 -1 = 255, ở thanh ghi 16 bit giá trị MAX = 2^16 - 1 = 65535. Và tất nhiên giá
trị MAX cũng là cố định với từng T/C.
TOP: là giá trị đỉnh mà tại có T/C thay đổi trạng thái, giá trị TOP không nhất thiết
phải bằng MAX mà có thể thay đổi bằng các thanh ghi. Chúng ta sẽ tìm hiểu sau.
Interrupt: (còn gọi là Ngắt) là 1 chƣơng trình có độ ƣu tiên cao nhất, đƣợc thực
hiện ngay lập tức khi có tín hiệu Interrupt.
Bảng 10.1: Interrupt Vectors của Timer/Counter trên ATmega328
1.1. Timer/Counter 1
1.1.1 Giới thiệu các thanh ghi
* Thanh ghi TCNT1 (Timer/Counter 1 Register)
Là thanh ghi 16 bit, lƣu giữ giá trị của Timer/Counter1, cho phép đọc-ghi trực tiếp,
do đó, chúng ta có thể thực hiện các phép gán hoặc thay đổi giá trị của TCNT1.
* Thanh ghi TCCR1B (Timer/Counter 1 Control Register B)
Là 1 trong 2 thanh ghi điều khiển hoạt đông của Timer/Counter1 (cùng
với TCCR1A, nhƣng với những mục đích đơn giản, chúng ta chỉ cần thanh
ghi TCCR1B).
Bảng 10.2: Thanh ghi TCCR1B
Trong thanh ghi TCCR1B chúng ta chỉ cần sử dụng 3 bit CS10, CS11, CS12 để
lựa chọn xung nhịp cho T/C1. Chúng ta sẽ tham khảo bảng này:
105
Bảng10. 3: Mô tả Clock Select Bit trên thanh ghi TCCR1B
Theo mặc định, chip Atmega328p trên Arduino chạy ở 16MHz, prescaler = 64.
Điều này có nghĩa là: theo mặc định, các bộ T/C trên Arduino sẽ có tần số hoạt
động là 16MHz/64 = 250kHz.
* Thanh ghiTIMSK1 (Timer/Counter1 Interrupt Mask Register)
Là thanh ghi lƣu giữ các Interrupt Mask của T/C1. Đây là thanh ghi giúp chúng ta
thực hiện các Timer Interrupt. Trên thanh ghi TIMSK1 chúng ta cần chú ý các bit
sau:
Bảng 10.4: Thanh ghi TIMSK1 (Timer/Counter1)
bit 5 - ICIE1: Input Capture Interrupt Enable - Cho phép ngắt khi dùng Input
Capture.
bit 2 - OCIE1B: Output Compare Interrupt Enable 1 channel B - Cho phép ngắt
khi dùng Output Compare ở channel B.
bit 1 - OCIE1A: Output Compare Interrupt Enable 1 channel A - Cho phép ngắt
khi dùng Output Compare ở channel A.
bit 0 - TOIE1: Overflow Interrupt Enable 1 - Cho phép ngắt khi xảy ra tràn trên
T/C.
(Chúng ta cứ bình tĩnh, những cái nhƣ Output Compare, Input Capture, Overflow ta
sẽ giới thiệu ở bên dƣới).
106
* Thanh ghi OCR1A và OCR1B (Output Compare Register channel A và channel
B)
Lƣu giữ giá trị so sánh ở kênh A và kênh B: khi T/C1 hoạt động, giá trị TCNT1
đƣợc tăng dần, giá trị này liên tục đƣợc so sánh với các giá trị trong thanh ghi
OCR1A và OCR1B, việc so sánh này chính là "Output Compare", khi giá trị của
TCNT1 bằng giá trị của OCR1A (hoặc OCR1B) thì "Match" xảy ra, lúc này sẽ có 1
Interrupt đƣợc thực hiện ( nếu đã đƣợc Enable ở thanh ghi TIMSK1).
* Thanh ghi ICR1 (Input Capture Register 1)
Giá trị của thanh ghi ICR1 sẽ đƣợc cập nhật theo thanh ghi TCNT1 mỗi lần có sự
kiện xảy ra trên chân ICP1 (tƣơng ứng là chân digital 8 của Arduino). Chức năng
này ta sẽ giới thiệu trong 1 bài viết khác.
1.1.2 Các chế độ của Timer/Counter 1
Bảng 10.5: Waveform Generation Mode Bit (Timer/Counter1)
ở đây sẽ giới thiệu 2 mode cơ bản nhất của T/C1 là: Normal Mode và CTC Mode.
*Normal Mode
Đây là chế độ hoạt động đơn giản nhất của T/C1 (mode 0), giá trị của thanh ghi
TCNT1 sẽ tăng từ 0 (BOTTOM) đến 65535 (MAX) và quay về 0. Nếu chúng ta
gán trƣớc cho TCNT1 một giá trị nào đó thì TCNT1 sẽ bắt đầu đếm từ giá trị này.
Ví dụ: Bạn muốn viết 1 chƣơng trình để đọc dữ liệu từ cảm biến nhiệt mỗi 0.1s,
nhƣng trong thân chƣơng trình lại có vài hàm delay(), do đó sẽ không đảm bảo là
bạn cập nhật đƣợc giá trị nhiệt độ mỗi 0.1s nếu chỉ dùng hàm if và hàm millis().
Phƣơng án ở đây là chúng ta sẽ dùng Interrupt của Timer/Counter.
107
Theo mặc định, chip Atmega328p trên Arduino chạy ở 16MHz, prescaler = 64, vì
vậy thời gian để TCNT1 tăng lên 1 đơn vị là 64/16MHz = 4us, thời gian để T/C1
đếm từ 0 đến 65535 là 4us*65536 = 0.262144s, mà thời gian chúng ta cần tạo là
0.1s (thỏa mãn vì 0.1 < 0.262144), do đó ta cần 0.1s/4us = 25000 lần đếm. Giá trị
ban đầu của TCNT1 = 65536 - 25000 = 40536.
Ví dụ ở chế độ Normal Mode:
#include
#define sensor A0
volatile int temp;
void setup()
{
Serial.begin(9600)
cli(); // tắt ngắt toàn cụ
/* Reset Timer/Counter1 *
TCCR1A = 0
TCCR1B = 0
TIMSK1 = 0
/* Setup Timer/Counter1 *
TCCR1B |= (1 << CS11) | (1 << CS10); // prescale = 6
TCNT1 = 40536
TIMSK1 = (1 << TOIE1); // Overflow interrupt enable
sei(); // cho phép ngắt toàn cụ
}
void loop()
{
/* add main program code here *
}
ISR (TIMER1_OVF_vect)
{
TCNT1 = 40536
temp = analogRead(sensor)
Serial.print(F("Temp:"))
Serial.println(temp)
}
Giải thích
- #include là thƣ viện Interrupt của AVR.
108
- Biến temp cần đƣợc khai báo volatile vì nó đƣợc sử dụng cả ở chƣơng trình chính
và ở chƣơng trình ngắt.
- cli() dùng để tắt ngắt toàn cục.
- Tham khảo bảng Waveform Generation Mode Bit, chúng ta thấy rằng để cài đặt
T/C1 ở mode 0, các bit cần đƣợc set nhƣ sau: WGM13 = 0, WGM12 = 0, WGM11
= 0, WGM10 = 0, vì mặc định các bit này là 0 nên chúng ta không cần quan tâm
đến nó ở thanh ghi TCCR1B nữa.
- TCCR1B |= (1 << CS11) | (1 << CS10) đƣợc dùng để cài đặt prescaler = 64.
(tham khảo bảng Clock Select Bit).
- sei() dùng để bật ngắt toàn cục.
các biểu thức nhƣ (1 << CS11) đƣợc dùng để set bit CS11 lên 1.
- ISR (Vector_name) là các trình phục vụ ngắt, trong đó ISR là keyword,
Vector_name ở chƣơng trình này là TIMER1_OVF_vect, có nghĩa là "Ngắt tràn trên
Timer/Counter1".
Ở trong trình phục vụ ngắt, chúng ta cần gán lại giá trị ban đầu cho TCNT1 =
40536 vì lúc này T/C1 đã đếm tràn qua 65535 và về lại 0. Nếu không gán lại
TCNT1 = 40536, chúng ta sẽ không tạo đƣợc 0.1s nhƣ mong muốn.
* Clear Timer on Compare Match (CTC) mode
Có 2 CTC mode trên T/C1 là mode 4 và mode 12
- Đầu tiên ta sẽ giới thiệu mode 4 trƣớc. Để chọn mode 4, chúng ta cần set các bit
nhƣ sau: WGM13 = 0, WGM12 = 1, WGM11 = 0, WGM10 = 0.
- CTC mode hoạt động nhƣ sau: thanh ghi OCR1A lƣu giữ giá trị TOP, thanh ghi
TCNT1 bắt đầu đếm từ 0, khi giá trị TCNT1 = OCR1A thì "Compare Match", lúc
này ngắt Compare Match có thể xảy ra nếu bit OCIE1A đã đƣợc set ở thanh ghi
TIMSK1.
Chú ý: là chỉ có thanh ghi OCR1A được sử dụng để lưu giá trị COMPARE trong
CTC mode Trở lại VD ở Normal Mode, ta sẽ thực hiện với CTC Mode nhƣ sau:
- Vi dụ:
#include
#define sensor A0
volatile int temp;
void setup()
{
Serial.begin(9600)
cli(); // tắt ngắt toàn cục
/* Reset Timer/Counter1 *
109
TCCR1A = 0
TCCR1B = 0
TIMSK1 = 0
/* Setup Timer/Counter1 *
TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10); // prescale = 64 and
CTC mode
OCR1A = 24999; // initialize OCR1
TIMSK1 = (1 << OCIE1A); // Output Compare Interrupt Enable
Timer/Counter1 channel
sei(); // cho phép ngắt toàn cục
}
void loop()
{
/* add main program code here *
}
ISR (TIMER1_COMPA_vect)
{
temp = analogRead(sensor)
Serial.print(F("Temp:"))
Serial.println(temp)
}
Giải thích
Để chọn mode 4, trong phần cài đặt cho thanh ghi TCCR1B ta cần set bit WGM12
lên 1, tức là (1 << WMG12).
Để tạo đƣợc 0.1s (ở 16MHz, prescaler = 64) ta cần T/C1 đếm 25000 lần, do đó giá
trị TOP = OCR1A = 24999.
Để enable Compare Match Interrupt Timer/Counter 1 channel A, chúng ta cần set
bit OCIE1A của thanh ghi TIMSK1 lên 1.
Ở phần hàm ngắt, ta thay đổi thành ISR (TIMER1_COMPA_vect) cho phù hợp với
Compare Match Interrupt T/C1
1.2. Timer/Counter 2
1.2.1. Các thanh ghi
Trên T/C2 cũng có những thanh ghi tƣơng tự T/C1
1.2.2. Thanh ghi TCNT2 (Timer/Counter 2 Register)
Là thanh ghi 8 bit, lƣu giữ giá trị của Timer/Counter2.
110
1.2.3. Thanh ghi TCCR2A và TCCR2B (Timer/Counter 2 Control Register A và
B)
Là 2 thanh ghi điều khiển hoạt động của Timer/Counter2.
Bảng 10.6: Thanh ghi TCCR2A và TCCR2B (Timer/Counter 2)
Bảng 10.7: Mô tả Clock Select Bit
1.2.4. Thanh ghi TIMSK2 (Timer/Counter2 Interrupt Mask Register)
Là thanh ghi lƣu giữ các Interrupt Mask của T/C2.
Bảng 10.8: Thanh ghi TIMSK2 (Timer/Counter 2)
111
1.2.5 Thanh ghi OCR2A và OCR2B (Output Compare Register channel A và
channel B)
Lƣu giữ giá trị so sánh ở kênh A và kênh B khi T/C2 hoạt động.
Bảng10. 9: Lưu giữ giá trị so sánh ở kênh A và kênh B khi T/C2 hoạt động.
1.2.6 Các chế độ hoạt động
Theo bảng Waveform Generation Mode bit, T/C2 có Normal Mode
0 và CTC mode 2.
Để không trùng lặp nội dụng với T/C1, ta chỉ giới thiệu cách set thanh ghi trong
T/C2.
Ở Normal Mode, Chúng ta chỉ cần set các bit CS20, CS21, CS22 trong
thanh ghi TCCR2B để chọn prescaler.
Ở CTC Mode: ngoài set các bit trong thanh ghi TCCR2B để chọn prescaler,
Chúng ta cần set bit WGM21 lên 1 bằng dòng: TCCR2A |= (1 << WGM21);
Cách set thanh ghi TIMSK2 tƣơng tự nhƣ TIMSK1: OCIE2A (Output Compare
Interrupt Enable 2 Channel A), OCIE2B, TOIE2 (Timer Overflow Interrupt 2
Enable).
2.Phần cứng
Muốn đặt ngắt, ta phải đặt lệnh trong hàm setup(){}.
Thƣ viện đính kèm gồm có thƣ viện timer cho Timer 1, Timer 3. Ta copy vào thƣ
mục thƣ viện của Arduino IDE.
Gồm có các hàm:
initialize(): // Khởi động ngắt Timer.
start() : // Khởi động lại sau khi sửa đổi.
112
startBottom() : // Cho Timer bắt đầu đếm lại từ giá trị 0 (Chú ý đây là giá
trị đếm của Timer chứ không phải giá trị bạn đặt).
read() : // Đọc giá trị hiện tại của Timer
stop(): //Dừng Timer.
attachInterrupt(): // Thêm địa chỉ hàm để gọi khi xảy ra ngăt và bắt đầu
đếm.
detachInterrupt(): // Hủy địa chỉ ngắt
pwm(char pin, int duty, long microseconds) : // Băm xung ra chân pin với số
chu kỳ là duty. Xung có độ rộng là microseconds.
disablePwm(char pin) : //Hủy băm xung.
3. Lập trình và giải thích
Ví dụ: nháy LED 0.15s
// Ví dụ này dùng ngắt Timer để nháy LED
// và sử dụng biến chia sẻ giữa hàm ngắt và chƣơng trình chính
const int led = LED_BUILTIN; // định nghĩa chân LED, Biến LED_BUILTIN
dùng để chỉ LED đƣợc gắn trên Board mạch.Ví dụ với Arduino UNO thì
LED_BUILTIN=13.
void setup(void)
{
pinMode(led, OUTPUT);
Timer1.initialize(150000); //Khởi động ngắt, thời gian đặt cho nó là
150000us=0.15s.
Timer1.attachInterrupt(blinkLED); //Khi xảy ra ngắt chƣơng trình sẽ gọi hàm
blinkLED().
Serial.begin(9600);
}
int ledState = LOW;
volatile unsigned long blinkCount = 0; // Biến dùng chung giữa CT chính và CT
ngắt.
void blinkLED(void)
{
if (ledState == LOW) {
ledState = HIGH;
blinkCount = blinkCount + 1; // tăng lên 1 mỗi lần LED sáng
} else {
113
ledState = LOW;
}
digitalWrite(led, ledState);
}
// Xuất số lần sáng ra Serial0.
// to the Arduino Serial Monitor
void loop(void)
{
unsigned long blinkCopy;
noInterrupts(); //Hủy các ngắt trƣớc đó.
blinkCopy = blinkCount;
interrupts(); //Cho phép ngắt
Serial.print(blinkCount = );
Serial.println(blinkCopy);
delay(100); }
CÂU HỎI ÔN TẬP
Câu 1: trong Arduino UNO có mấy bộ timer-counter?
Câu 2: Viết chƣơng chình dùng ngắt Timer để nháy LED trong 3 giây?
114
BÀI 11: ĐIỀU KHIỂN ĐỘNG CƠ DC
*Giới thiệu
Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất
của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) đƣợc dùng
nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển đƣợc DC Motor là
ta đã có thể tự xây dựng đƣợc cho mình rất nhiều hệ thống tự động.
*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo, chức năng và nguyên lý hoạt động của mạch L298.
- Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động cơ DC
- Mô phỏng đƣợc chƣơng trình mạch điều khiển động cơ DC bằng phần mềm
mô phỏng
- Kết nối đƣợc phần cứng mạch điều khiển động cơ DC đúng yêu cầu kỹ
thuật.
- Viết, nạp và chạy đƣợc chƣơng trình điều khiển động cơ DC
- Rèn luyện tính tƣ duy và tác phong công nghiệp , đảm bảo an toàn cho
ngƣời và thiết bị
*Nội dung:
1. Giới thiệu động cơ DC
Động cơ điện 1 chiều là thiết bị ngoại vi đƣợc sử dụng rất rộng rãi do điều
khiển đơn giản, giá cả phải chăng.
Hình 11.1. Động cơ DC
1.1. Định nghĩa
Động cơ một chiều DC ( DC là từ viết tắt của "Direct Current Motors") là
Động cơ điều khiển bằng dòng có hƣớng xác định hay nói dễ hiểu hơn thì đây là
loại động cơ chạy bằng nguồn điện áp DC- điện áp 1 chiều(Khác với điện áp AC
xoay chiều). Đầu dây ra của đông cơ thƣờng gồm hai dây (dây nguồn- VCC và dây
tiếp đất- GND). DC motor là một động cơ một chiều với cơ năng quay liên tục.
Khi ta cung cấp năng lƣợng, động cơ DC sẽ bắt đầu quay, chuyển điện năng
thành cơ năng. Hầu hết các động cơ DC sẽ quay với cƣờng độ RPM rất cao ( số
115
vòng quay/ phút). Tốc độ không tải của động cơ DC nếu không giảm tốc có thể đạt
từ 1000RPM tới 40.000RPM.
Ví dụ: Một động cơ DC RS775-9009 có tốc độ quay 22.000RPM cùng với
hộp giảm tốc Planet.
Ứng dụng của động cơ DC cũng rất đa dạng và hầu hết trong mọi lĩnh vực của đời
sống. Trong tivi, trong đài FM, ổ đĩa DC, máy in- photo, máy công nghiệp...v...v.
Đối với động cơ điện 1 chiều có loại không chổi than (Brussless DC Motor-
BLDC) và động cơ có chổi than (Brush DC Motor- DC Motor). Do động cơ BLDC
thực chất là động cơ điện 3 pha không đồng bộ vì vậy mình chỉ xét động cơ điện 1
chiều có chổi than.
1.2. Phân loại động cơ điện một chiều (đây là cách phân loại theo cách kích từ)
Động cơ điện 1 chiều phân loại theo kích từ thành những loại sau:
-Kích từ độc lập.
-Kích từ song song.
-Kích từ nối tiếp.
-Kích từ hỗn hợp.
Với mỗi 1 loại động cơ điện 1 chiều nhƣ trên thì có các ứng dụng khác nhau.
Nhƣng trên thực tế, ta chủ yếu tiếp xúc với loại động cơ DC công suất thấp có phần
Stator sử dụng nam châm vĩnh cửu nên thông thƣờng là không cần đến phần kích từ
cho động cơ. Ta nói đến và quan tâm tới kích từ cho động cơ DC khi nói đến các
loại động cơ DC công suất lớn, Stator của động cơ không phải là nam châm vĩnh
cửu mà là nam châm điện. Phần nam châm điện này cũng gồm lõi thép kỹ thuật và
các bó dây. Để Stator biến thành nam châm điện ta cần phải cấp điện cho phần
Startor của nó, khi đó ta gọi nó là kích từ. Nhƣ vậy với những loại động cơ DC
chúng ta tiếp cận không cần phải quan tâm tới "kích từ" của nó.
1.3. Cấu tạo và nguyên tắc hoạt động
- Cấu tạo:
Gồm có 3 phần chính stator( phần cảm), rotor ( phần ứng), và phần cổ góp- chỉnh
lƣu
Hình 11.2. Cấu tạo Động cơ DC
116
Cấu tạo chi tiết động cơ DC với phần than lộ và phần rotor dây đồng
- Stator của động cơ điện 1 chiều thƣờng là 1 hay nhiều cặp nam châm vĩnh
cửu, hay nam châm điện.
- Rotor có các cuộn dây quấn và đƣợc nối với nguồn điện một chiều.
- Bộ phận chỉnh lƣu, nó có nhiệm vụ là đổi chiều dòng điện trong khi chuyển
động quay của rotor là liên tục. Thông thƣờng bộ phận này gồm có một bộ cổ góp
và một bộ chổi than tiếp xúc với cổ góp.
- Nguyên lý hoạt động
Pha 1: Từ trƣờng của rotor cùng cực với stator, sẽ đẩy nhau tạo ra chuyển
động quay của rotor.
Pha 2: Rotor tiếp tục quay
Pha 3: Bộ phận chỉnh điện sẽ đổi cực sao cho từ trƣờng giữa stator và rotor
cùng dấu, trở lại pha
1.4.Điều chỉnh tốc độ động cơ điện một chiều
Các phƣơng trình điều chỉnh tốc độ.
117
-Thay đổi điện áp phần ứng.
-Thay đổi điện trở mạch rotor.
-Thay đổi từ thông.
Trên thực tế phƣơng pháp đƣợc sử dụng nhiều nhất là thay đổi điện áp phần ứng.
Trong đó điển hình là phƣơng pháp thay đổi độ rộng xung PWM.
2. Phần cứng
* Chuẩn bị:
- Động cơ DC 12 V
- Board Arduino
- Breadboard và dây nối
- Bộ điều khiển L298N
Hình 11.3. Bo mạch L298
- Thông số kỹ thuật:
Driver: L298N tích hợp hai mạch cầu H.
Điện áp điều khiển: +5 V ~ +12 V
Dòng tối đa cho mỗi cầu H là: 2A (=>2A cho mỗi motor)
Điện áp của tín hiệu điều khiển: +5 V ~ +7 V
Dòng của tín hiệu điều khiển: 0 ~ 36mA (Arduino có thể chơi đến 40mA nên
khỏe re nhé các bạn)
Công suất hao phí: 20W (khi nhiệt độ T = 75 ℃)
Nhiệt độ bảo quản: -25 ℃ ~ +130 ℃
118
- L298 chức năngcác chân:
- 12V power, 5V power.: Đây là 2 chân cấp nguồn trực tiếp đến động cơ. Ta
có thể cấp nguồn 9-12V ở 12V.
- jumper 5V, nếu để nhƣ hình ở trên thì sẽ có nguồn 5V ra ở cổng 5V power,
ngƣợc lại thì không. Ta để nhƣ hình thì ta chỉ cần cấp nguồn 12V vào ở 12V power
là có 5V ở 5V power, từ đó cấp cho Arduino
- Power GND chân này là GND của nguồn cấp cho Động cơ.
Chú ý: Nếu dùng Arduino thì nối với GND của Arduino
- 2 Jump A enable và B enable, để nhƣ hình
- Gồm có 4 chân Input. IN1, IN2, IN3, IN4.
- Output A: nối với động cơ A.tachú ý chân +, -. Nếu nối ngƣợc thì động cơ
sẽ chạy ngƣợc. Và chú ý nếu ta nối động cơ bƣớc, ta phải đấu nối các pha cho phù
hợp.
Board này gồm 2 phần điều khiển động cơ. Và có thể điều khiển cho 1 động
cơ bƣớc 6 dây hoặc 4 dây
* Lắp mạch :
Hình 11.4. Giao tiếp UNO với động cơ DC
3. Lập trình và giải thích
const int motorA1=9; //Khai báo chân IN
const int motorA2=10;
void setup()
{
pinMode(motorA1,OUTPUT); //Khai báo dạng INPUT
pinMode(motorA2,OUTPUT);
119
}
void loop()
{
digitalWrite(motorA1,HIGH); //Quay tới
digitalWrite(motorA2,LOW);
delay(1000); //Dừng 1s
digitalWrite(motorA1,LOW); //Quay lui
digitalWrite(motorA2,HIGH);
delay(1000); //Dừng 1s
}
CÂU HỎI VÀ BÀI TẬP
Câu 1: Trình bày cấu tạo và nguyên lý hoạt động của động cơ DC
Câu 2: Viết chƣơng trình điều khiển động cơ DC ?
120
BÀI 12: ĐIỀU KHIỂN ĐỘNG CƠ SERVO
* Giới thiệu:
Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất
của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) đƣợc dùng
nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển đƣợc DC servo
motor là ta đã có thể tự xây dựng đƣợc cho mình rất nhiều hệ thống tự động. Khái
niệm Servo mà tôi dùng trong bài học này để chỉ một hệ thống hồi tiếp. DC servo
motor là động cơ DC có bộ điều khiển hồi tiếp
*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo, chức năng và nguyên lý hoạt động của động cơ
servo
- Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động cơ servo
- Mô phỏng đƣợc chƣơng trình mạch điều khiển động cơ servo bằng phần
mềm mô phỏng
- Kết nối đƣợc phần cứng mạch điều khiển động cơ servo đúng yêu cầu kỹ
thuật.
- Viết, nạp và chạy đƣợc chƣơng trình điều khiển động cơ servo
*Nội dung:
1. Giới thiệu động cơ servo
1.1. Động cơ Servo nghĩ là gì ?
Hình 13.1 Động cơ Servo
Động cơ Servo là một bộ phận của hệ thống điều khiển chuyển động của
máy móc. Một trong các bộ phận không thể thiếu giúp Động cơ Servo có thể hoạt
động đó chính là Driver servo. Tƣơng tự nhƣ driver của máy tính. Động cơ Servo
cung cấp lực chuyển động cần thiết cho các thiết bị máy móc khi vận hành
1.2.Phân loại động cơ Servo.
121
Nhìn chung động cơ servo có 2 loại chính là: Động cơ DC Servo và động cơ
AC Servo.
- AC servo là loại động cơ cho phép xử lý các dòng điện cao nên thƣờng
đƣợc sử dụng trong máy móc công nghiệp đặc biệt là các loại máy CNC.
- DC servo không đƣợc thiết kế cho các dòng điện cao và thƣờng phù hợp
hơn cho các ứng dụng nhỏ hơn. Động cơ DC còn đƣợc chia làm 2 loại động cơ 1
chiều có chổi than và động cơ 1 chiều không chổi than.
Nhờ sự phát triển vƣợt bậc công nghệ điều khiển điện nên hiện nay hầu hết ngƣời
ta đều sử dụng động cơ AC Servo.
1.3.Cấu tạo của động cơ Servo.
* Động cơ DC Servo.
-Động cơ DC có chổi than: gồm 4 cấu tạo chính stato, rotor, chổi than và
cuộn cảm lõi.
- Ưu điểm: của động cơ DC có chổi than là tƣơng đối dễ điều khiển, giá thành
tƣơng đối rẻ.
- Nhược điểm: Khi vận hành thƣơng gây ra tiếng ồn, nhiệt độ cao khi vậ hành và
quán tính cao khi giảm tốc độ. Để khắc phục đƣợc vân đề này thì ngƣời ta hay dùng
động cơ DC không chổi than.
Hình 13.2 cấu tạo động cơ Servo
Động cơ DC không chổi than: Cấu trúc của nó tƣơng đối giống với động cơ có
chổi than. Điều khác biệt là các cuộn pha đƣợc lắp ở rotor là động cơ vĩnh cữu.
* Động cơ AC Servo
Động cơ AC Servo đƣợc sử dụng trong các ngành công nghiệp đa phần là
động cơ một chiều không chổi than. Động cơ Servo có cấu tạo 2 phần chính giống
với động cơ bƣớc là Rotor và Stator.
Rotor là một nam châm vĩnh cửu có từ trƣờng mạnh.
Stator là một cuộn dây đƣợc cuốn riên biệt, đƣợc cấp nguồn để làm quay Rotor.
122
- Ưu điểm: Điều khiển có tốc độ tốt, và trơn tru hầu nhƣ không giao động. Hiệu
suất có thể đạt hơn 90%.
Quá trình vận hành tạo ra ít nhiệt với tốc độ cao. Độ chính xác cao (tùy thuộc vào
độ chính xác của bộ mã hóa).
Mô-men xoắn, quán tính thấp, tiếng ồn thấp, không có bàn chải mặc.
- Nhược điểm: Hệ điều chỉnh tốc độ động cơ tƣơng đối phức tạp. Giá thành lại khá
cao.
Nguyên lý hoạt động.
Động cơ servo đƣợc hình thành bởi những hệ thống hồi tiếp vòng kín. Tín hiệu ra
của động cơ đƣợc nối với một mạch điều khiển. Khi động cơ vận hành thì vận tốc
và vị trí sẽ đƣợc hồi tiếp về mạch điều khiển này. Khi đó bầt kỳ lý do nào ngăn cản
chuyển động quay của động cơ, cơ cấu hồi tiếp sẽ nhận thấy tín hiệu ra chƣa đạt
đƣợc vị trí mong muốn. Mạch điều khiển tiếp tục chỉnh sai lệch cho động cơ đạt
đƣợc điểm chính xác nhất.
* Ứng dụng.
- Ứng dụng trong ngành điện điện tử:
Các máy móc lắp ráp tƣờng đòi hỏi tốc độ cao thì động cơ Servo đáp ứng
đƣợc yêu cầu này. Đặc biệt là đối với AC Servo.
- Ứng dụng trong ngành gia công cơ khí:
Hiện nay ngành gia công cơ khí đặc biệt là đối với việc gia công các sản
phẩm có độ chính xác cao ví dụ nhƣ máy cắt laser hay một số máy cắt khác thì
ngƣời ta sẽ lựa chọn động cơ Servo thay vì động cơ bƣớc nhƣ trƣớc đây. Bên cạnh
đó nó còn đƣợc ứng dụng rất nhiều trong các loại máy cắt CNC PLasma khác.
123
Ứng dụng trong ngành may mặc, ngành giấy, bao bì: Trong việc điều khiển các
máy cuộn vải, giấy, bao bì để cắt hoặc in ấn
2. Phần cứng
* Chuẩn bị :
- Mạch Arduino UNO.
- Breadboard còn gọi testboard.
- Dây cắm test board.
- 1 module servo SG90:
Hình 13.3 Động cơ Servo MG90
Động cơ servo cũng đƣợc chia làm nhiều loại, phụ thuộc vào góc quay tối đa
của chúng, 2 loại phổ biến hay sử dụng là:
Động cơ servo quay 180°: Futaba S3003, MG90[S] ...
Động cơ servo quay 360°: MG995, MG996R ...
Nhƣ đã đề cập bên trên, động cơ servo là loại động cơ cho phép ta điều khiển
một cách cực kì chính xác. Vì vậy, khác với động cơ thông thƣờng ta chỉ cần cấp
nguồn cho động cơ là có thể vận hành đƣợc. Động cơ servo yêu cầu ta phải cấp
nguồn (2 dây) và nhận điều khiển từ mạch chính (1 dây), mỗi dây thƣờng đƣợc
đánh màu nhƣ sau:
+ Đỏ: nhận điện nguồn, tuỳ vào loại động cơ mà giá trị này có thể khác nhau
+ Nâu: nối với cực âm của mạch
+ Vàng: nhận tín hiệu từ mạch điều khiển
* Lắp mạch :
124
Hình 13.3 Giao tiếp bo arduino UNO với động cơ Servo MG90
3. Lập trình và giải thích
#include
#define SERVO_PIN 9 // chan tin hieu cua servo noi voi chan so 9 arduino
Servo gServo;
void setup()
{
gServo.attach(SERVO_PIN);
}
void loop()
{
gServo.write(0); // điều chỉnh góc xoay của servo.
delay(1000);
gServo.write(90); // điều chỉnh góc xoay của servo.
delay(1000);
gServo.write(180); // điều chỉnh góc xoay của servo.
delay(1000);
}
CÂU HỎI VÀ BÀI TẬP
Câu 1: Trình bày cấu tạo và nguyên lý hoạt động của động cơ DC servo
Câu 2: Viết chƣơng trình điều khiển động cơ DC servo ?
125
BÀI 13: ĐIỀU KHIỂN ĐỘNG CƠ BƢỚC
* Giới thiệu:
Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất
của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) đƣợc dùng
nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển đƣợc động cơ bƣớc
là ta đã có thể tự xây dựng đƣợc cho mình rất nhiều hệ thống tự động.
*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo, chức năng và nguyên lý hoạt động của động cơ
bƣớc, mạch ULN 2003.
- Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động cơ bƣớc
- Mô phỏng đƣợc chƣơng trình mạch điều khiển động cơ bƣớc bằng phần
mềm mô phỏng
- Kết nối đƣợc phần cứng mạch điều khiển động cơ bƣớc đúng yêu cầu kỹ
thuật.
- Viết, nạp và chạy đƣợc chƣơng trình điều khiển động cơ bƣớc
- Rèn luyện tính tƣ duy và tác phong công nghiệp , đảm bảo an toàn cho
ngƣời và thiết bị
*Nội dung:
1. Giới thiệu động cơ bƣớc
1.1. Động cơ bƣớc là gì?
Động cơ bƣớc (stepper motor), thực chất là một động cơ đồng bộ dùng để
biến đổi các tín hiệu điều khiển dƣới dạng các xung điện rời rạc kế tiếp nhau thành
các chuyển động góc quay.
Hình 13.1. Động cơ bước
1.2 Cấu tạo động cơ bƣớc
Về cấu tạo động cơ bƣớc gồm có các bộ phận là stato, roto là nam châm vĩnh
cửu hoặc trong trƣờng hợp của động cơ biến từ trở là những khối răng làm bằng vật
liệu nhẹ có từ tính. Động cơ bƣớc đƣợc điều khiển bởi bộ điều khiển bên ngoài.
Động cơ bƣớc và bộ điều khiển đƣợc thiết kế sao cho động cơ có thể giữ nguyên
bất kỳ vị trí cố định nào cũng nhƣ quay đến một vị trí bất kỳ nào.
126
Động cơ bƣớc có thể sử dụng trong hệ thống điều khiển vòng hở đơn giản,
hoặc vòng kín, tuy nhiên khi sử dụng động cơ bƣớc trong hệ điều khiển vòng hở
khi quá tải, tất cá các giá trị của động cơ đều bị mất và hệ thống cần nhận diện lại.
Hình 13.2. Cấu tạo động cơ bước
1.3. Đặc điểm của động cơ bƣớc
Động cơ bƣớc hoạt động dƣới tác dụng của các xung rời rạc và kế tiếp nhau.
Khi có dòng điện hay điện áp đặt vào cuộn dây phần ứng của động cơ bƣớc làm
cho roto của động cơ quay một góc nhất định gọi là bƣớc của động cơ.
Góc bƣớc là góc quay của trục động cơ tƣơng ứng với một xung điều khiển.
Góc bƣớc đƣợc xác định dựa vào cấu trúc của động cơ bƣớc và phƣơng pháp điều
khiển động cơ bƣớc.
Tính năng mở máy của động cơ đƣợc đặc trƣng bởi tần số xung cực đại có
thể mở máy mà không làm cho roto mất đồng bộ.
Chiều quay động cơ bƣớc không phụ thuộc vào chiều dòng điện mà phụ
thuộc vào thứ tự cấp xung cho các cuộn dây.
1.4 Phân loại động cơ bƣớc
Động cơ bƣớc đƣợc chia thành 3 loại chính là:
Động cơ bƣớc biến từ trở.
Động cơ bƣớc nam châm vĩnh cửu
Động cơ bƣớc hỗn hợp/lai.
1.5. Phƣơng pháp điều khiển động cơ bƣớc
Hiện nay có 4 phƣơng pháp điều khiển động cơ bƣớc.
127
Hình 13.3. xung điều khiển động cơ bước
* Phương pháp điều khiển động cơ bước
- Điều khiển dạng sóng (Wave): là phƣơng pháp điều khiển cấp xung điều
khiển lần lƣợt theo thứ tự chon từng cuộn dây pha.
- Điều khiển bƣớc đủ (Full step): là phƣơng pháp điều khiển cấp xung đồng
thời cho 2 cuộn dây pha kế tiếp nhau.
- Điều khiển nửa bƣớc (Half step): là phƣơng pháp điều khiển kết hợp cả 2
phƣơng pháp đều khiển dạng sóng và điều khiển bƣớc đủ. Khi điều khiển theo
phƣơng pháp này thì giá trị góc bƣớc nhỏ hơn hai lần và số bƣớc của động cơ bƣớc
tăng lên 2 lần so với phƣơng pháp điều khiển bƣớc đủ tuy nhiên phƣơng pháp này
có bộ phát xung điều khiển phức tạp.
- Điều khiển vi bƣớc (Microstep): là phƣơng pháp mới đƣợc áp dụng trong
việc điều khiển động cơ bƣớc cho phép động cơ bƣớc dừng và định vị tại vị trí nửa
bƣớc giữa 2 bƣớc đủ.
Ƣu điểm của phƣơng pháp này là động cơ có thể hoạt động với góc bƣớc
nhỏ,độ chính xác cao. Do xung cấp có dạng sóng nên động cơ hoạt động êm
hơn,hạn chế đƣợc vấn đề cộng hƣởng khi động cơ hoạt động.
2. Phần cứng
*Chuẩn bị:
- Mạch Arduino UNO
- Breadboard còn gọi testboard.
- Dây cắm test board.
- 1 bộ nguồn ngoài (5V đến 12V) ( trong bài này chúng ta có thể sử dụng
nguồn 5Vdc của arduino nhƣng khuyến cáo hạn chế sử dụng để tránh việc hư
board arduino).
- 1 module điều khiển động cơ bƣớc ULN2003.
128
Hình 13.4. module điều khiển động cơ bước
+ Thông số kỹ thuật:
Điện áp cung cấp: 5 ~ 12VDC.
Tín hiệu ngõ vào: 4 chân in1, in2, in3, in4.
Tìn hiệu ngõ ra: Jack cắm động cơ bƣớc 28BYJ-48.
4 led hiển thị trạng thái hoạt động của động cơ.
- 1 động cơ bƣớc stepper 28BYJ-48:
129
Thông số kỹ thuật:
Điện thế hoạt động 5V
Số pha 4
Tỉ lệ bánh răng *64
Một bƣớc tƣơng đƣơng 5.625° (64 bƣớc)
Tần số 100Hz
Điện trở trong 50Ω±7%(25℃)
Động cơ bƣớc sử dụng trong phần này là động cơ bƣớc 4 pha (thực ra là 2
pha đƣợc chia ra làm 2 ở mỗi pha ngay tại vị trí giữa) (gồm 5 dây), 4 trong 5 dây
này đƣợc kết nối với 2 cuộn dây trong động cơ và 1 dây là dây nguồn chung cho cả
2 cuộn dây. Mỗi bƣớc của động cơ quét 1 góc 5.625 độ, vậy để quay 1 vòng động
cơ phải thực hiện 64 bƣớc.
* Lắp mạch:
Hình 13.5. Giao tiếp UNO với động cơ bước
3. Lập trình và giải thích
#define IN1 8 // IN1 nối với chân D8 của arduino
#define IN2 9 // IN2 nối với chân D9 của arduino
#define IN3 10 // IN3 nối với chân D10 của arduino
#define IN4 11 // IN4 nối với chân D11của arduino
int Steps = 4096;
int cstep = 0;
void setup()
{
130
Serial.begin(9600);
pinMode(IN1, OUTPUT); // các chân IN quy định là các chân ra
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop()
{
for(int x=0;x<Steps;x++)
{
step1();
//delay(1);
delayMicroseconds(2500);
}
delay(1000);
}
void step1()
{
//stepp
switch(cstep)
{
case 0:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
case 1:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
break;
case 2:
digitalWrite(IN4, LOW);
131
break;
}
cstep=cstep+1;
if(cstep==8)
{cstep=0;}
}
CÂU HỎI VÀ BÀI TẬP
Câu 1: Trình bày cấu tạo và nguyên lý hoạt động của động cơ bƣớc?
Câu 2: Viết chƣơng trình điều khiển động cơ bƣớc?
ĐÁNH GIÁ KẾT QUẢ: (tính theo thang điểm 10)
Mục tiêu Nội dung Điểm chuẩn
Kiến thức
- Phân tích đƣợc hoat động của mạch 1
- Giải thích đƣợc các điều kiện cần và đủ
cho mạch hoạt động .
1
- Khởi động, truy xuất, lập trình đƣợc hoạt
động của mạch
1
Kỹ năng
- Sử dụng thành thạo phần mềm lập trình
cho vi điều khiển
2
- Kết nối thiết bị và nạp đƣợc dữ liệu cho vi
điều khiển đảm bảo đúng yêu cầu
2
Thái độ - Đảm bảo an toàn cho ngƣời và thiết bị 3
132
Tài liệu tham khảo:
[1]Dự án Giáo dục kỹ thuật và Dạy nghề (VTEP), Tổng cục Dạy Nghề, Hà Nội,
2003
[2]Walter H. Buchbaum. Sc.D, Microprocessor and IC families
[3]HPI Fachbuchreihen Pflaum Verlag Munchen - Mikrocompute Lehrbuch
[4] I. Scott Makenzie - The avr Atmega16 microcontroller
[5] Ngô Diên tập - lập trinhc với vi điều khiển avr
Các file đính kèm theo tài liệu này:
- giao_trinh_lap_trinh_vi_dieu_khien_trinh_do_cao_dang_truong.pdf