Điều khiển động cơ 1 chiều DC sử dụng vi xử lí arduino
Trang 1MỤC LỤC
LỜI MỞ ĐẦU……… 3
Chương 1: TỔNG QUAN……… 4
1 Giới thiệu chung về Arduino……… 4
1.1 Tổng quan về Arduino Uno……… 4
1.2 Sơ đồ chân Arduino……… 5
2 Giới thiệu về phần mền Proteus……… 7
3.Các phần mềm sử dụng……….9
4 Chi phí thực hiện đề tài………9
Chương 2: Nhận dạng động cơ DC………11
1 Xác định thông số động cơ ……… 11
1.1 Xác định dạng hàm truyền ……… 11
1.2 Xác định hàm truyền và thông số PID ……… 11
1.3 Kiểm nghiệm thông số PID………21
2 Nhận dạng động cơ thực………24
Chương 3: Thiết kế và mô phỏng mạch điều khiển động cơ DC- Encoder……… 30
1 Thiết kế mạch điều khiển động cơ DC-Encoder………30
1.1 Cách băm xung trong Arduino………30
1.2 Đọc Encoder bằng phương pháp ngắt ngoài ……… 31
1.2.1 Giới thiệu về Encoder……… 31
1.2.2 Ngắt ngoài trong Arduino………33
1.3 Ngắt Timer……… 35
1.4 Nguyên tắc điều khiển động cơ ……… 36
Trang 21.5 Thiết kế mạch trên Proteus….………39
2 Thiết kế giao diện điều khiển bằng Megunolink……… 41
2.1 Giới thiệu về Megunolink……… 41
2.2 Các bước thiết kế giao diện Megunolink………42
2.3 Kết quả bài toán……… 49
Chương 4: Mô phỏng tay máy 1DOF………52
1 Thiết lập hệ phương trình vi phân……… 52
2 Mô phỏng bằng Simulink……… 54
3 Mô phỏng bằng Matlab……… 59
Chương 5: Ý tưởng phát triển………66
Kết luận……… 72
Tài liệu tham khảo……….73
Phụ lục……… 74
Trang 3LỜI MỞ ĐẦU
Hiện nay khoa học kỹ thuật đang phát triển rất nhanh, mang lại những lợi ích cho con người về tất cả những lĩnh vực trong cuộc sống Để nâng cao đời sống nhân dân và hòa nhập với sự phát triển chung của thế giới, Đảng và nhà nước ta đã đề ra những mục tiêu đưa đất nước đi lên thành một nước công nghiệp hóa hiện đại hóa Để thực hiện điều đó thì một trong những ngành cần quan tâm phát triển nhất đó là ngành cơ khí nói chung và
cơ điện tử nói riêng vì nó đóng vai trò quan trọng trong việc sản xuất ra các thiết bị công
cụ ( máy móc, robot…) của mọi ngành kinh tế
Sự xuất hiện của Arduino đã tạo ra làn sóng trên thế giới trong việc lập trình và thiết
kế các mạch vi điều khiển mà không đòi hỏi quá nhiều kiến thức về lập trình Hiện nay việc sử dụng Arduino ở Việt Nam đã trở nên phổ biến và được sử dụng rộng rãi trong các trường đại học công nghệ của Việt Nam, cũng như những người đam mê về lập trình vi điều khiển
Việc sử dụng Arduino để điều khiển động cơ cho thấy khả năng của Arduino, góp phần điều khiển các cơ cấu, Robot trở nên linh hoạt và dễ dàng hơn Vì vậy việc điều khiển động cơ bằng Arduino đang được sử dụng rộng rãi trong công nghiệp phòng thí nghiệm hiện nay
Bài viết không tránh khỏi những sai sót, rất mong được sự giúp đỡ và chỉ bảo của thầy cô để chúng em làm tốt hơn trong những lần tiếp theo
Cuối cùng em xin trân thành cảm ơn sự chỉ bảo tận tình của thầy cô trong bộ môn Cơ Ứng Dụng và đặc biệt là sự hướng dẫn của thầy Đỗ Đăng Khoa đã giúp chúng em học được rất nhiều điều và hoàn thành môn thực tập kỹ thuật này
Trân trọng cảm ơn
Hà Nội, ngày tháng năm 2015
Trang 4Chương 1: Tổng quan
1 Giới thiệu về Arudino
Arduino ra đời tại thị trấn Ivrea thuộc nước Italia Được đặt tên theo vị vua vào thế kỉ thứ 9 là King Arduin Arduino chính thức được giới thiệu vào năm 2005 như là 1 công cụ khiêm tốn dành cho các sinh viên và giáo sư Massimo Banzi là 1 trong những người phát triển Arduino tại trường IDII Mặc dù hầu như không được tiếp thị gì cả, tin tức về Arduino vẫn lan truyền với tốc độ chóng mặt nhờ những lời truyền miệng tốt đẹp của những người dùng đầu tiên Hiện nay Arduino nổi tiếng tới nỗi có người đến thị trấn Ivrea để thăm quan nơi sinh ra của Arduino
Arduino thực ra là một bo mạch vi xử lý, được dùng để lập trình tương tác với các thiết bị phần cứng như cảm biến, động cơ, đèn, hoặc các thiết bị khác Đặc điểm nổi bật của Arduino là môi trường phát triển ứng dụng cực kì dễ sử dụng, với một ngôn ngữ lập trình có thể học một cách nhanh chóng ngay cả với những người ít am hiểu về điện tử và lập trình Và điều làm nen hiện tượng Arduino chính là mức giá rất thấp và tính chất nguồn mở từ phần cứng tới phần mền Chỉ với hơn 200.000 VND , ta có thể sở hữu một board Arduino có 14 ngõ I/O thoa các điều khiển thiết bị
1.1 Tổng quan về Arduino Uno
Arduino Uno là 1 bo mạch thiết kế với bộ xử lý trung tâm là vi điều khiển AVR Atmega328
Nó có 14 chân digital I/O, 6 chân đầu vào (input) analog, thạch anh dao động 16Mhz Một số thông số kỹ thuật như sau :
Trang 5Bảng 1.1: Bảng thông số về Arduino Uno
Điện áp cấp nguồn 5V Điện áp đầu vào 7-12V Điện áp đầu vào giới hạn 6-20V
Số chân Digital I/O 14(có 6 chân điều chế độ rộng xung PWM)
DC Current per I/O Pin 40mA
DC Current for 3.3V Pin 50mA Flash Memory 32KB (ATMega328) với 0,5KB sử dụng bootloader
Trang 6a) USB (1)
Arduino sử dụng cáp USB để giao tiếp với máy tính Thông qua cáp USB chúng ta
có thể Upload chương trình cho Arduino hoạt động, ngoài ra USB còn là nguồn cho Arduino
b) Nguồn ( 2 và 3 )
Khi không sử dụng USB làm nguồn thì chúng ta có thể sử dụng nguồn ngoài thông qua jack cắm 2.1mm ( cực dương ở giửa ) hoặc có thể sử dụng 2 chân Vin và GND để cấp nguồn cho Arduino
Bo mạch hoạt động với nguồn ngoài ở điện áp từ 5 – 20 volt Chúng ta có thể cấp một áp lớn hơn tuy nhiên chân 5V sẽ có mực điện áp lớn hơn 5 volt Và nếu sử dụng nguồn lớn hơn 12 volt thì sẽ có hiện tượng nóng và làm hỏng bo mạch Khuyết cáo các bạn nên dùng nguồn ổn định là 5 đến dưới 12 volt
Chân 5V và chân 3.3V (Output voltage) : các chân này dùng để lấy nguồn ra từ nguồn mà
chúng ta đã cung cấp cho Arduino Lưu ý : không được cấp nguồn vào các chân này vì sẽ làm hỏng Arduino
Dòng điện trong mạch Arduino chỉ vào khoảng 50mA GND: chân mass
Trang 7Serial : chân 0 (Rx ), chân 1 ( Tx) Hai chân này dùng để truyền (Tx) và nhận (Rx) dữ liêu nối tiếp TTL Chúng ta có thể sử dụng nó để giao tiếp với cổng COM của một số thiết bị hoặc các linh kiện có chuẩn giao tiếp nối tiếp
PWM (pulse width modulation): các chân 3, 5, 6, 9, 10, 11 trên bo mạch có dấu “~” là các chân PWM chúng ta có thể sử dụng nó để điều khiển tốc độ động cơ, độ sáng của đèn…
SPI : 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK), các chân này hỗ trợ giao tiếp theo chuẩn SPI
I2C: Arduino hỗ trợ giao tiếp theo chuẩn I2C Các chân A4 (SDA) và A5 (SCL) cho phép chúng tao giao tiếp giửa Arduino với các linh kiện có chuẩn giao tiếp là I2C
e) Reset (7): dùng để reset Arduino
2 Giới thiệu về phần mền Proteus
Phần mền Proteus là phần mền cho phép mô pohngr hoạt động của mạch điện tử bảo gồm phần thiết kế mạch và viết chương trình điều khiển cho các họ vi điều khiển như MCS-51, PIC, AVR, Proteus là phần mền mô phỏng mạch điện tử của Lanccenter Electronics, mô phỏng cho hầu hết các linh kiện điện tử thông dụng, đặc biệt hỗ trợ cho các MCU như PIC, 8051, AVR
Trang 8Hình 1.2: Giao diện khởi động Proteus 8.0 Phần mền bao gồm 2 chương trình ISIS cho phép mô phngr mạch và ARES dùng đễ
vẽ mạch in Proteus là công cụ mô phỏng cho các lại vi điều khiển khá tốt, nó hỗ trợ các dòng vi điều khiển như PIC, 8051, AVR, .vv các giao tiếp I2C, SPI, CAN, USB, Ethenet ngoài ra còn mô phỏng các mạch số, mạch tương tự một cách hiệu quả
Để mô phỏng được Arduino trên proteus thì chúng ta cần phải download thư viện arduino cho proteus Để có được thư viên này các bạn cần truy cập vào trang web:
http://blogembarcado.blogspot.com/search/label/Proteus
Hình 1.3: Thư viện mô phỏng Arduino
Trang 9Sau khi download về các bạn chép 2 file ARDUINO.IDX và ARDUINO.LIB vào thư mục:
Hình 1.4: Mô phỏng Arduino bằng Proteus
Lưu ý chúng ta cần phải cấp nguồn vào 2 chân 5V và Gnd trên mạch như hình trên
3.Các phần mềm sử dụng:
Trang 10-Matlab-simulink:mô phỏng hoạt động, tìm hàm truyền -Arduino IDE: biên dịch code C sang file HEX
-Meguno link: Thiết kế giao diện
-Proteus: Mô phỏng mạch Arduino
4 Chi phí thực hiện đề tài
Sau đây là bảng chi tiết các linh kiện được sử dụng trong bài thực tập như sau:
Bảng 1.2: Báo giá linh kiện được sử dụng
Trang 11Chương 2: Nhận dạng động cơ
1 Xác định thông số động cơ 1.1 Xác định dạng hàm truyền
Hàm truyền động cơ 1 chiều đầu vào điện áp; đầu ra vận tốc góc:
Hình 2.1 : Sơ đồ điện cơ -Động cơ DC: Điện trở Ra; cuộn cảm L; hằng số phản sức điện động Ke; hằng số momen
1.2 Xác định hàm truyền và thông số PID
Đơn vi dùng để tính PID: góc[xung]; vận tốc góc [xung/s]; điện áp u (V); tín hiệu điều khiển U cấp cho chân 9 (PWM): 0-255 tương ứng với u nguồn cấp 9V do U tuyến tính với u nên ta quy ước đơn vị của nó là V
Trang 12Tìm hàm truyền:
*Cấp U=255V đo [xung/s]
Code test động cơ DC
#include <Timer.h>
Timer t0;
#define motorPin1 8 // L293D Input 1
#define motorPin2 7 // L293D Input 2
#define speedPin 9 // L293D enable chân 1 int menu=0,dau=0,dem=0,dem2=0;
float v=0,time=0.025,inv=40,U = 0,t=0;
long int a=0,b=0,c=0,qold=0,qnew=0,eold=0,enew=0;
void setup() { Serial.begin(9600);
if(dem2==40) U=0;
Trang 13dem=0;}
} void dao() // 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 {
Trang 14Dùng lệnh Serial.println(v); trong để in vận tốc đo được ra màn hình Serial monitor
Hình 2.2 : Mở màn hình Serial Monitor
Trang 15Hình 2.3: Vận tốc góc đo được Sau đó copy số liệu trên serial monitor vào file excel
Trang 16Import file excel của vận tốc góc đo được theo thời gian trong matlab:
Hình 2.5: Giá trị vận tốc theo thời gian Sau khi có vector v (138x1); ta nhập u (138x1):
Trang 17Hình 2.6: u và v trong workspace
Mở toolbox Matlab Identification : Trong mục import data chọn time domain nhập biến v vừa import Trong mục Estimate chọn Transfer Fcn : Điền vào ô 1 điểm cực và 0 điểm không
Ấn Estimate để chạy
Trang 18Hình 2.7: Môi trường Transfer Fcn +Kết quả hàm truyền tìm được:
Trang 19Hình 2.8: Hàm truyền tìm được
(s) 52,17 (s)
Y s G s h s Y s G s U s
U t U t U s U h s Y s U Y s y t U y t
Trang 202 1
b xung/s là giá trị trung bình khi xác lập tra theo kết quả đo
Hình 2.9: Giá trị trung bình của bG(s) có đáp ứng quá độ như hình:
Hình 2.10: Đáp ứng quá độ hàm truyền G(s)
=> Thới điểm T tương ứng với y t1( )0.63k
=> Tại t=T y t2( )U y t ( )1 0, 63 .U k 0, 63.b0, 63.132778400Đối chiếu bảng kết quả đo ta thấy T 0.05s
Trang 21-Hàm truyền tính được với đầu vào: U(0-255 thang 9V) đầu ra (xung / s):
-Phương pháp tối ưu đối xứng:
1 1
i K
Trang 22Hình 2.13: Sai lệch giữa lượng đặt và thực tế
Trang 23Hình 2.15: Sai lệch giữa lượng đặt và thực tế
Trang 24Hình 2.17: Sai lệch giữa lượng đặt và thực tế
2 Nhận dạng động cơ thực
Trong mô hình của ta sử dụng động cơ một chiều các thông số R (điện trở phần ứng), Ke
(hệ số phản sức điện động), Km (hệ số momen) của động cơ không có sẵn, do đó trong mục nhận dạng hệ thật sẽ nói về việc nhận dạng động cơ DC
Ta có các phương trình cơ điện của động cơ có dạng như sau:
Trang 25Nếu đáp ứng phần điện nhanh so với đáp ứng phần cơ (hằng số thời gian cơ rất lớn so với hằng số thời gian phần điện) thì ta có thể đơn giản hóa bằng cách cho La = 0 Khi đó ta
viết lại Error! Reference source not found như sau:
( ) ( )
R i t e t U t (2.5) Thay (2.2) vào phương trình (2.5) ta thu được:
0 ( )
R i t K t U t (2.6)
Từ phương trình Error! Reference source not found ta có thể xác định được các tham
số Ra và Ke bằng cách tiến hành đó điện áp, dòng điện và vận tốc của động cơ với 2 mức điện áp khác nhau
Dụng cụ đo gồm có :
Hình 2.18 Đồng hồ đo điện vạn năng Hình 2.19 Điện trở 0.47 ohm
Encoder nối sẵn với động cơ có độ phân dải 448 xung/vòng
Trang 26Bước 2: Đo điện áp 2 đầu đậu cơ ta được U(t), đo điện áp hai đầu điện trở 0.47 ohm (do điện trở của động cơ không lớn khoảng nên việc đo nối tiếp bằng đồ hồ đo không được chính xác bằng phương pháp đo điện áp hai đầu điện trở rồi tính ra dòng trong mạch) rồi tính ra dòng trong mạch theo định luật ohm
Bước 3: Ghi lại số xung đo được trên LCD trong một giây, ta lấy giá trị hiện thị khi động
cơ chạy ổn định lấy giá trị trung bình cộng rồi chia cho độ phân giải là 100 xung ta được
số vòng quay trong một giây
Bước 4: Lặp lại với mức điện áp còn lại các bước 1,2,3
Kết quả đo:
Bảng 2.2: Kết quả đo Nguồn Điện áp 2 đầu DC(V) Dòng điện trong mạch(A) Tốc độ(rad/s)
Thế phương trình Error! Reference source not found vào phương trình
Error! Reference source not found ta được:
Trang 27Dựa vào phương trình Error! Reference source not found ta có thể tiến hành xác định
thông số Km bằng cách tiến hành dùng mẫu thử gắp trực tiếp với trục động cơ đặt một điện áp phù hợp vào 2 đầu động cơ sao cho động cơ quay một góc giới hạn 90o và dữ cân bằng tại vị trí đó Do động cơ không quay nên
Trang 28Phương pháp đo Lắp mạch với nguồn DC 5V Tiến hành đo dòng điện của mạch như trên kết hợp hiện thị góc quay động cơ so với phương thẳng đứng
i tb
Momen tĩnh tác dụng lên trục động cơ là
Trang 29i t
Vậy ta đã xác định xong các tham số động cơ với kết quả là :
Bảng 2.21: Tham số của động cơ
Trang 30Chương 3: Thiết kế và mô phỏng mạch điều khiển
-Pin: là vị trí chân, đối với Arduino Uno thì chỉ có các chân 3, 5, 6, 9, 10 & 11 mới
có chức năng tạo PWM Vậy chúng ta có thể trả lời được câu hỏi bên trên, các chân digital
còn lại của có thể đọc hoặc xuất 2 giá trị là 0 và 1 mà thôi
-Value: Giá trị nằm trong khoảng 0 đến 255
Trang 31Hình 3.2: PWM 25%
Value = 229 (hay 90%) thì dạng xung sẽ là :
Hình 3.3: PWM 90%
Từ ví dụ trên ta thấy sự thay đổi độ rộng của chuổi xung dẫn đến sự thay đổi điện áp ra
Ta cũng thấy rằng điện áp trên motor cũng thay đổi tuyến tính theo sự thay đổi điện áp ngõ ra trên chân 9 Tức là nếu điện áp trung bình trên chân 9 là 2,5 volt (50% ) thì điện áp trên hai đầu motor là 4.5 volt ( nguồn motor là 9 volt)
1.2 Đọc Encoder bằng phương pháp ngắt ngoài 1.2.1 Giới thiệu về Encoder
Hệ thống optical encoder bao gồm một nguồn phát quang (thường là hồng ngoại – infrared), một cảm biến quang và một đĩa có chia rãnh Optical encoder lại được chia thành 2 loại:
Encoder tuyệt đối (absolute optical encoder) và encoder tương đối (incremental
Trang 32mô hình động cơ servo trong bài này cũng không ngoại lệ Từ bây giờ khi nói encoder tức
là incremental encoder
Hình 3.4 Optical Encoder Encoder thường có 3 kênh (3 ngõ ra) bao gồm kênh A, kênh B và kênh I (Index) Trong hình lỗ nhỏ bên phía trong của đĩa quay và một cặp phat-thu dành riêng cho lỗ nhỏ này Đó là kênh I của encoder Cữ mỗi lần motor quay được một vòng, lỗ nhỏ xuất hiện tại vị trí của cặp phát-thu, hồng ngoại từ nguồn phát sẽ xuyên qua lỗ nhỏ đến cảm biến quang, một tín hiệu xuất hiện trên cảm biến Như thế kênh I xuất hiện một “xung” mỗi vòng quay của motor Bên ngoài đĩa quay được chia thành các rãnh nhỏ và một cặp thu-phát khác dành cho các rãnh này Đây là kênh A của encoder, hoạt động của kênh A cũng tương tự kênh I, điểm khác nhau là trong 1 vòng quay của motor, có N “xung” xuất hiện trên kênh A N là số rãnh trên đĩa và được gọi là độ phân giải (resolution) của encoder Mỗi loại encoder có độ phân giải khác nhau, có khi trên mỗi đĩa chĩ có vài rãnh nhưng cũng có trường hợp đến hàng nghìn rãnh được chia Để điều khiển động cơ, phải biết độ phân giải của encoder đang dùng Độ phân giải ảnh hưởng đến độ chính xác điều khiển
và cả phương pháp điều khiển Không được vẽ trong hình , tuy nhiên trên các encoder còn có một cặp thu phát khác được đặt trên cùng đường tròn với kênh A nhưng lệch một
Trang 33chút (lệch M+0,5 rãnh), đây là kênh B của encoder Tín hiệu xung từ kênh B có cùng tần
số với kênh A nhưng lệch pha 90o Bằng cách phối hợp kênh A và B người đọc sẽ biết chiều quay của động cơ Hãy quan sát hình 3
Hình 3.5 Hai kênh A và B lệch pha trong encoder (trích từ [1]) Hình trên cùng trong hình 3 thể hiện sự bộ trí của 2 cảm biến kênh A và B lệch pha nhau Khi cảm biến A bắt đầu bị che thì cảm biến B hoàn toàn nhận được hồng ngoại xuyên qua, và ngược lại Hình thấp là dạng xung ngõ ra trên 2 kênh Xét trường hợp motor quay cùng chiều kim đồng hồ, tín hiệu “đi” từ trái sang phải Quan sát lúc tín hiệu
A chuyển từ mức cao xuống thấp (cạnh xuống) thì kênh B đang ở mức thấp Ngược lại, nếu động cơ quay ngược chiều kim đồng hồ, tín hiệu “đi” từ phải qua trái Lúc này, tại cạnh xuống của kênh A thì kênh B đang ở mức cao Như vậy, bằng cách phối hợp 2 kênh
A và B chúng ta không những xác định được góc quay (thông qua số xung) mà còn biết được chiều quay của động cơ (thông qua mức của kênh B ở cạnh xuống của kênh A)
Có 3 cách đọc Encoder :
- Dùng input capture
Trang 34- Dùng chức năng Counter
- Cuối cùng là ngắt ngoài
1.2.2 Ngắt ngoài trong Arduino
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
Ngắt giúp chương trình gọn nhẹ và xử lý nhanh hơn Chẳng hạn, khi kiểm tra 1 nút nhấn có được nhấn hay không, thông thường bạn cần kiểm tra trạng thái nút nhấn bằng hàm digitalRead() trong đoạn chương trình loop() Với việc sử dụng ngắt, bạn chỉ cần nối nút nhấn đến đúng chân có hỗ trợ ngắt, sau đó cài đặt ngắt sẽ sinh ra khi trạng thái nút chuyển từ HIGH->LOW Thêm 1 tên hàm sẽ gọi khi ngắt sinh ra Vậy là xong, biến trong đoạn chương trình ngắt sẽ cho ta biết trạng thái nút nhấn
Số lượng các ngắt phụ thuộc vào từng dòng vi điều khiển Với Arduino Uno bạn chỉ
có 2 ngắt, Mega 2560 có 6 ngắt và Leonardo có 5 ngắt
Cú pháp:
attachInterrupt(interrupt, ISR, mode);
Thông số 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, bao gồm LOW: kích hoạt liên tục khi trạng thái chân digital có mức thấp HIGH: kích hoạt liên tục khi trạng thái chân digital có mức cao
RISING: kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp thấp sang mức điện áp cao
Trang 35FALLING: kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp cao sang mức điện áp thấp
Lưu ý: với mode LOW và HIGH, chương trình ngắt sẽ được gọi liên tục khi chân digital còn giữ mức điện áp tương ứng
void setup() {
attachInterrupt(0, dao, FALLING);
} void dao() // 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
{ c=digitalRead(2); //chan ngat -kenh A b=digitalRead(13); //kenh B
if (c==b) a=a-1; // tru bot xung A (nghich) else a=a+1; // cong them xung cua A (thuan) }
1.3 Ngắt Timer (để tính PID)
Trong Arduino có thư viện Timer.h phục vụ cho ngắt timer Mục đích của ngắt timer
là định sẵn một khoảng thời gian và đếm ngược đến hết thời gian đó timer sẽ thực hiện lệnh hoặc gọi chương trình con
#include <Timer.h>
Timer t0;
Trang 36int time=0.025;
void setup() {
t0.update() // cập nhật thời gian
t0.every sẽ gọi hàm pid sau mỗi 25ms
1.4 Nguyên tắc điều khiển động cơ
Trang 37h[s] thời gian lấy mẫu;
Tùy thuộc hàm truyền mà ta chọn dùng PID, PI, I
Từ đó ra sẽ có sơ đồ nguyên tắc thiết kế điều khiển động cơ
Hình 3.8: Sơ đồ điều khiển Ngắt ngoài khi chân 2 có tín hiệu xuống 1->0 liên tục gửi tín hiệu khi động cơ quay
So sánh kênh A và B để biết chiều thuận nghịch tương ứng q - hay +
(1)Hàm tính U điều khiển (0-255) xuất ra chân 9; Hàm chỉ được gọi sau mỗi 25ms qua ngắt timer
T=0.025 s : thời gian lấy mẫu Thời gian lấy mẫu càng nhỏ (tấn số cao) thì việc hiệu chỉnh càng tiến gần đến sự “liên tục” và chất lượng điều khiển sẽ tốt hơn Trong các bộ
Trang 38điều khiển số, thời gian lấy mẫu là một yếu tố rất quan trọng Cần tính toán để thời gian này không quá lớn nhưng cũng đừng quá nhỏ, vì như thế sẽ hao phí thời gian thực thi
Code tính PID:
void pid() {
qnew=a; // dat goc moi = a if(menu==0){
t=t+time; // tang thoi gian dem enew=x*sin(y*t+1.57)-a; //e(k)
ipart+=0.05*(enew-eold)*time; //I(k) U=0.21*enew+ipart; }
if(menu==1) { enew=z-abs(qold-qnew); //enew sai so van toc z xung dat tuong ung voi van to dat U+=0.21*enew; //ki=021; U chinh la I(k)
v=(qnew-qold); } // van toc dang xung in ra man hinh qold=qnew; // dat vi tri cu = vi tri moi cho vong lap moi eold=enew; // dat sai so cu = sai so moi cho vong lap moi dem++;
Trang 391.5 Thiết kế mạch trên Proteus
Sau khi thực hiện được lập trình cho mạch trên Arduino IDE ta có thể chạy thử xem mạch hoạt động như thế nào trên phần mền Proteus
Phần mền hoạt động khá đơn giản, ta chỉ việc kích vào biểu tượng P và đánh ra tên linh kiện trong khung Keywords và kích đúp vào để đưa linh kiện ra bên ngoài
Hình 3.9: Lấy linh kiện
Trang 40Hình 3.10: Cách lấy linh kiện
Từ đó chúng ta thiết kế mạch như trong hình vẽ dưới đây:
Các chân được đánh số từ 1 đến 9 như trong hình vẽ
Hình 3.11: Sơ đồ nối mạch trên Proteus