bền khá cao,đảm bảo tính ổn định.
ii. Một số module chính cho việc điều khiển Robot:
Input-Output: Vi điều khiểnATmega16 có 32 đường vào ra chia làm bốn Port: PORTA-PORTB-PORTC-PORTD mỗi Port 8bit có thể tương tác điều khiển từng bit một. Các cổng ra có điện trở nội kéo lên nên khi dùng chức năng input ta khơng cần dùng điện trở kéo lên ở bên ngồi. Các Port được điều khiển bởi các bô thanh ghi sau: thanh ghi dữ liệu cổng PORT, thanh ghi dữ liệu điều khiển cổng DDR và cuối cùng là địa chỉ chân vào của cổng PIN.
− Cấu trúc chân của AVR có thể phân biệt rõ chức năng (vào ra) trạng thái (0 1) từ đó ta có 4 kiểu vào ra cho một chân của avr. Khác với 89 là chỉ có 2 trạng thái duy nhất (0 1) . Đặc biệt nguồn từ chân của AVR đủ khoẻ để điều khiển Led trực tiếp (mA) cịn 89 chỉ là vài uA .
Hình 2.1.9: IO AVR Logic
− Bảng trạng thái truy xuất I/O:
Hình 2.1.10: Các trạng thái truy xuất IO AVR
- Read I/O:
o Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit n trong port) đó là đầu vào (xóa thanh ghi DDRx hoặc bit).
o Kích hoạt điện trở pull-up bằng cách set thanh ghi PORTx ( bit).
o Cuối cùng đọc dữ liệu từ địa chỉ PINxn (trong đó x: là cổng và n là bit).
- Write I/O:
o Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit n trong port) đó là đầu ra (xóa thanh ghi DDRx hoặc bit).
#include <avr/io.h>
#include <avr/interrupt.h> #include <util/delay.h> int main(void){
DDRB=0xFF; //PORTB la output PORT PORTB=0x00;
DDRD=0x00; //PORTD la input PORT PORTB=0xFF; while (1){ //vịng lặp vơ tận //do nothing } return 0; }
Timer-Counter: Bộ định thời (timer/counter0) là một module định thời/đếm 8 bit/16 bit, Atmega 16 có 4 bộ định thời là Timer 0-Timer 2 8 bit và Timer 1 16 bit dùng để định thời gian và đếm sự kiện với các đặc điểm sau:
- Bộ đếm một kênh
- Xóa bộ định thời khi trong mode so sánh (tự động nạp)
- PWM
- Tạo tần số
- Bộ đếm sự kiện ngoài - Bộ chia tần 10 bit
- Nguồn ngắt tràn bộ đếm và so sánh
Về phần kiến trúc, các thanh ghi Timer có thể tham khảo trong Datasheet của AVR. Trong đề tài này em dùng PWM của AVR cho việc điều khiển động cơ với chế độ Phase correct PWM.
Hình 2.1.11: Lưu đồ xung Phase Corect PWM AVR
- Chế độ này hoạt động dựa trên hai sườn lên xuống.Bộ đếm sẽ đếm liên tục từ giá trị BOTTOM đến giá trị MAX và sau đó từ giá trị MAX đến giá trị BOTTOM. Trong chế độ so sánh không đảo chân so sánh (OCx) sẽ bị xóa khi giá trị TCNTx bằng giá trị OCRx trong quá trình đếm lên và sẽ được set bằng 1 khi giá trị so sánh xuất hiện trong quá trình đếm xuống. Chế độ so sánh đảo thì các giá trị là ngược lại.
- Với hoạt động hai sườn xung này thì chế độ này khơng tạo ra được tần số nhỏ như chế độ một sườn xung. Nhưng do tính cân đối của hai sườn xung thì nó tốt hơn cho điều khiển động cơ. Chế độ phase correct PWM hoạt động cố định là 8 bit. Trong chế độ này bộ đếm sẽ tăng cho đến khi đạt giá trị MAX ,khi đó nó sẽ đổi chiều đếm.
- Các bước sử dụng Timer:
o Step 1: Set pin Timer là output bằng cách set giá trị trong thanh ghi DDRn.X
o Step 2: chọn chế độ Timer bằng cách set thanh ghi TCCRX o Step 3: chọn xung clock bằng cách set thanh ghi TCCRX o Step 4: chọn giá trị của thanh ghi OCRX-TCNTX
o Code Ví dụ:
#include <avr/io.h>
#include <avr/interrupt.h> #include <until/delay.h> int main(void){
DDRB=0xFF; //PORTB la output PORT PORTB=0x00;
TCCR0=(1<<CS01);//CS02=0, CS01=1, CS00=0:
chon Prescaler = 8
TCNT0=131; //gan gia tri khoi tao cho T/C0 TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0 sei(); //set bit I cho phep ngat toan cuc while (1){ //vịng lặp vơ tận //do nothing } return 0; } Interrupt:
- Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tình trạng sẵn sàng cho đổi dữ liệu của mình.Ví dụ: Khi bộ truyền nhận UART nhận được một byte nó sẽ báo cho CPU biết thơng qua cờ RXC,hoặc khi nó đã truyền được một byte thì cờ TX được thiết lập… - Khi có tín hiệu báo ngắt CPU sẽ tạm dừng cơng việc đạng thực hiện
lại và lưu vị trí đang thực hiên chương trình (con trỏ PC) vào ngăn xếp sau đó trỏ tới vector phuc vụ ngắt và thức hiện chương trình phục vụ ngắt đó cho tới khi gặp lệnh RETI (return from interrup) thì CPU lại lấy PC từ ngăn xếp ra và tiếp tục thực hiện chương trình mà trước khi có ngắt nó đang thực hiện. Trong trường hợp mà có nhiều ngắt u cầu cùng một lúc thì CPU sẽ lưu các cờ báo ngắt đó lại và thực hiện lần lượt các ngắt theo mức ưu tiên.
- Atmega16 có 3 ngắt ngồi INT0(PORTD.2) INT1(PORTD.3) và INT2(PORTB.2). Khi xảy ra một trong các sự kiện đối với các chân này :
o Low level - Điện áp ở chân ngắt xuống mức logic 0 V o Any change - Bất kì sự thay đổi điện áp từ chân ngắt o Falling Edge - Khi có 1 sườn điện áp xuống (5V->0V) o Rising Edge -Khi có 1 sườn điện áp lên (0V->5V)
Sau đó 1 cờ ngắt sẽ dựng lên 1 và báo cho biết có ngắt , nhảy đến chương trình con thực hiện ngắt .
- Về phần kiến trúc, các thanh ghi Iterrupt có thể tham khảo trong Datasheet của AVR. Thiết lập ngắt ngoài như sau:
o Step 1: chọn chế độ ngắt trong than ghi MCUCR o Step 2: cho phép ngắt toàn cục trên thanh ghi GICR o Step 3: cho phép ngắt trong thanh ghi trạng thái SREG o Code ví dụ:
#include <avr/io.h>
#include <avr/interrupt.h> #include <avr/delay.h> volatile int8_t val=0 int main(void){
DDRD=0x00; //khai báo PORTD là Input để sử dụng 2 chân ngắt.
PORTD=0xFF; //sử dụng điện trở nội kéo lên.
MCUCR|=(1<<ISC11)|(1<<ISC01); //cả 2 ngắt là ngắt cạnh xuống
GICR |=(1<<INT1)|(1<<INT0); //cho phép 2 ngắt hoạt động
sei(); //set bit I cho phép ngắt toàn cục
DDRC=0xFF; //PORTC là Output while (1){ //vịng lặp vơ tận PORTC++; //quét PORTC _delay_loop_2(60000); } return 0; } //Trình phục vụ ngắt của INT0 ISR(INT0_vect){
val++; //nếu có ngắt INT0 xảy ra, tăng val thêm 1
if (val>9) val=0; //giới hạn không vượt quá 9 PORTB=val;
}
d. Khối input điều khiển dùng Opto cách ly quang:
Opto hay cịn gọi là cách ly quang là linh kiện tích hợp có cấu tạo gồm 1 led và 1 photo diot hay 1 photo transitor. Được sử dụng đẻ các ly giữa các khối chênh lệch nhau về điện hay cơng suất nhu khối có cơng suất nhỏ với khối điện áp lớn hay đơn giản chỉ là chống nhiễu giữa hai khối điều khiển trong mạch. Tín hiệu input vào PORTA của AVR nhận được từ GPIO của kit TinyS3C6410 sẽ
đưa qua Opto PC817 kết hợp với Transistor BJT dùng như một khóa K để thay đổi trạng thái đầu vào.
Hình 2.1.12: Mạch Opto giao tiếp AVR
e. Khối đệm đảo tín hiệu đầu vào và đầu ra:
ULN2803 là IC đệm đảo có 9 chân trong đó có 8 ngõ vào và 8 ngõ ra, dưới đây là hình dạng và cấu tạo bên trong của 2803:
Hình 2.1.13: IC2803 đệm đảo
Bộ đệm đảo dung IC2803 nhằm đảo bít nếu ngõ vào ở mức cao qua 2803 ra sẽ là mức thấp và ngược lại. ULN2803 chịu dựng mức điện áp từ 6V-15V hơn loai CMOS hay cả PMOS. Tín hiệu đầu vào và đầu ra của AVR được đệm đảo nhằm đảm bảo các mức tín hiệu ổn định và tránh gây nhiễu giữa các khối với MCU trung tâm.
f. Khối điều khiển động cơ dùng mạch cầu H với Mosfet:
MOSFET là viết tắt của cụm Meta Oxide Semiconductor Field-Effect Transistor tức Transisor hiệu ứng trường có dùng kim loại và oxit bán dẫn.
Hình sau mơ tả cấu tạo của MOSFET kênh n và ký hiệu của 2 loại MOSFET kênh n và kênh p.
Hình 2.1.14: Cấu tạo MOSFET
MOSFET có 3 chân gọi là Gate (G), Drain (D) và Source (S) tương ứng với B, E và C của BJT. Cơ bản, đối với MOSFET kênh N, nếu điện áp chân G lớn hơn chân S khoảng từ 3V thì MOSFET bão hịa hay dẫn. Khi đó điện trở giữa 2 chân D và S rất nhỏ (gọi là điện trở dẫn DS), MOSFET tương đương với một khóa đóng. Ngược lại, với MOSFET kênh P, khi điện áp chân G nhỏ hơn điện áp chân S khoảng 3V thì MOSFET dẫn, điện trở dẫn cũng rất nhỏ. Vì tính dẫn của MOSFET phụ thuộc vào điện áp chân G (khác với BJT, tính dẫn phụ thuộc vào dòng IB), MOSFET được gọi là linh kiện điều khiển bằng điện áp, rất lý tưởng cho các mạch số nơi mà điện áp được dùng làm mức logic (ví dụ 0V là mức 0, 5V là mức 1).
Hình 2.1.15: Hoạt động của MOSFET
MOSFET thường được dùng thay các BJT trong các mạch cầu H vì dịng mà linh kiện bán dẫn này có thể dẫn rất cao, thích hợp cho các mạch cơng suất lớn. Do cách thức hoạt động, có thể hình dung MOSFET kênh N tương đương một BJT loại npn và MOSFET kênh P tương đương BJT loại pnp. Thông thường
kênh N và một linh kiện kênh P, hai MOSFET này có thơng số tương đồng nhau và thường được dùng cùng nhau.. Cũng giống như BJT, khi dùng MOSFET cho mạch cầu H, mỗi loại MOSFET chỉ thích hợp với một vị trí nhất định, MOSFET kênh N được dùng cho các khóa phía dưới và MOSFET kênh P dùng cho các khóa phía trên.
Ban đầu MOSFET ko được kích, ko có dịng điện trong mạch, điện áp chân S bằng 0. Khi MOSFET được kích và dẫn, điện trở dẫn DS rất nhỏ so với trở kháng của motor nên điện áp chân S gần bằng điện áp nguồn là 12V. Tác dụng của Mosfet là các van đóng mở dẫn dịng điện từ nguồn xuống tải với cơng suất lớn. Tìn hiệu điều khiển các van là tín hiệu nhỏ và cho dẫn dòng và điện áp lớn để cung cấp cho tải. Tín hiệu điều khiển của thường là tín hiệu đầu ra của vi điều khiển là nhỏ hơn 5V (do các điều chế PWM) mà điều khiển động cơ cần dòng điện và điện áp lớn. Các van điều khiển hay các chân điều khiển chỉ cần tín hiệu nhỏ là mở khóa dẫn dịng cho tải. Mạch cầu H có thể đảo chiều dịng điện qua tải nên thế nó hay được dùng trong các mạch điều khiển động cơ DC và các mạch băm áp. Đối với mạch điều khiển động cơ thì mạch cầu H có thể đảo chiều động cơ quá là đơn giản. Chỉ cần mở khóa các van đúng chiều mà mình mong muốn.
Mạch này là điều khiển động cơ DC-24 hay nhỏ hơn 24V dùng cầu H sử dụng Mosfet cơng suất. Trong mạch này do tín hiệu từ vi điều khiển khơng đủ để mở khóa Fet cho nên phải dùng con kích xung là opto P521.
Ngồi ra các bạn còn thiết kế ra những mạch cầu H công suất lớn hơn như thế phải cần dùng các con FET hay IGBT có Id lớn phù hợp với tải khi đó mạch cầu H của bạn phải dùng tất cả các FET cùng kênh và có mạch lái
Trong thực tế có 1 loại IC bán dẫn được tích hợp ln cả cầu H trong đó ta chỉ cần cấp xung điều khiển, có bảo vệ dịng :
+ L293 : Với điện áp đầu vào là 36V và dịng điện đỉnh qua nó là 1.2A + L298 : Với điện áp đầu vào là 46V và dịng điện đỉnh qua nó là 4A Mạch nguyên lý
* Dùng hai Mosfet kênh N IRF 540 và 2 Mosfet kênh P IRF9540 (chống hiện tượng trùng dẫn)
* Dùng mạch Kit ATMEGA8 (VĐK bất kì) tạo xung PWM để cấp vào mạch
* Dùng 4 Opto đáp ứng để tần số trên 10KHz để cách ly mạch điều khiển và mạch cơng suất (p521 tần số on off 3ms)
Hình 2.1.16: Mạch cầu H gồm 4 MOSFET
Nguyên lý hoạt động:
- Chạy thuận phân áp cho Q1 và Q4 bằng cách cấp D1 =0; D2 =1. Dòng từ nguồn qua Q1 rồi qua động cơ sau đó qua Q4 rồi trở về nguồn.
- Chạy nghịch phân áp cho Q2 và Q3 bằng cách cấp D2=0; D1=1. Dòng từ nguồn qua Q2 rồi qua động cơ sau đó qua Q3 trở về nguồn.
- Thay đổi tốc độ động cơ bằng cách cấp trực tiếp PWM âm vào Q3 và Q4. Mạch tự hãm khi D1=D2=0 hay D1=D1=0;
II.1.3. Lập trình điều khiển Robot:
a. Lập trình board Tiny6410:
Xét về tổng quát thì lập trình board Tiny6410 trong đề tài này gồm 2 phần chính, đó là:
• Lập trình tương tác giữa Web Server và Web Client, client gửi tín hiệu điều khiển về cho Server
• Truy xuất GPIO trên nền Web bằng CGI, CGI truy xuất vào bộ nhớ, điều khiển GPIO
Lưu đồ giải thuật như sau:
Hình 2.1.17: Client gửi lệnh điều khiển
Code mơ tả client gửi mã lệnh:
//key event handle
function KeyDown(ev) { ev = ev || window.event;
pressed = ev.which || ev.keyCode; switch (pressed) { case 37: //<----: key left { $.get( "command.cgi", { cmd : 0 }, function(data) { $("#show").html(data)//hiển thị html } ) } break;
Code Server nhận giá trị của biến và thực thi:
data = getenv("QUERY_STRING");// cmd : 0 int getval=atoi(data+4);//là số 0 gửi về
b. Kỹ thuật lập trình PWM:
Lập trình điều khiển chuyển động Robot thực sự là lập trình PWM. Vậy PWM là gì? PWM có tên tiếng anh là Pulse Width Modulation là phương pháp điều chỉnh điện áp ra tải hay nói cách khác là phương pháp điều chế dựa trên sự thay đổi độ rộng của chuỗi xung vuông dẫn đếm sự thay đổi điện áp ra. Để tạo được ra PWM thì hiện nay có hai cách thơng dụng : Bằng phần cứng và bằng phần mền. Trong phần cứng có thể tạo bằng phương pháp so sánh hay là từ trực tiếp từ các IC dao động tạo xung vuông như : 555, LM556...Trong phần mền được tạo bằng các chip có thể lập trình được. Tạo bằng phần mền thì độ chính xác cao hơn là tạo bằng phần cứng. Nên người ta hay sử dụng phần mềm để tạo PWM
Hình 2.1.18: mơ tả PWM
Trong AVR có hỗ trợ PWM với các bộ Timer. Trong đề tài này em sử dụng Timer1 16 bit với 2 kênh A, B cho việc điều khiển động cơ. Dựa vào mạch cầu H ở trên ta việc lập trình điều khiển Robot như sau:
Các động cơ DC Robot quay thuận Các động cơ DC Robot quay ngược Xử lý các tín hiệu Input, ngắt ngồi
Điều khiển các góc quay trái phải và tiến lùi
PWM mà mạch cầu H nhận được có thể thay đổi tùy theo yêu cầu lập trình. Giả sử như muốn động cơ quay nhanh thì ta tăng xung lên và ngược lại, muốn Robot rẽ trái thì ta giảm xung cho Motor điều khiển tốc độ bánh trái và tăng xung cho Motor điều khiển tốc độ bánh phải, ngược lại cho rẽ phải. Nếu muốn
cả 2 Motor đồng thời phải đảo chiều quay động cơ với 2 mức tín hiệu điều khiển mạch cầu H ngược lại với trạng thái trước đó. Cụ thể trong đề tài này em tiến hành như sau:
Mạch cầu H sử dụng 1 xung PWM từ Timer và hai chân điều khiển quay thuận và quay nghịch động cơ
Thay đổi tốc độ động cơ bằng cách thay đổi xung PWM
Động cơ quay thuận khi hai chân điều khiển: D1=0-D2=1, quay nghịch khi D1=1-D2=0, động cơ hãm D1-D2=1, D1-D2=0. b. Kỹ thuật điều khiển Robot:
Về điều khiển chuyển động của Robot gồm có chạy thẳng, quay trái, quay phải, chạy lùi, chạy có đo quãng đường. Giải thuật như sau:
• Chạy khơng encoder: khởi tạo chương trình bằng cách thiết lập các input, output và các timer để điều khiển động cơ. Như PORTA làm dành cho tín