ĐẠI HỌC QUUỐC GIA THÀNH PHỐ HỒ CHÍ MINHTRƯƯỜNG ĐẠI HỌC BÁCH KHOA BÁO CÁO ĐỀ TÀI Giao tiếp Simulink Matlab và Arduiino thông qua Serial port và ứng dụng vào bài toán điều khiển tốc độ độn
Trang 1ĐẠI HỌC QUUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯƯỜNG ĐẠI HỌC BÁCH KHOA
BÁO CÁO ĐỀ TÀI Giao tiếp Simulink Matlab và Arduiino thông qua Serial port và ứng dụng vào bài toán điều khiển tốc độ động cơ DC bằng PID
GVHD: Thầy Nguyễn Lê Dũng
Thực hiiện: Vũ Đức Hùng MSSV: 18124766
Tp Hồ Chí Minh, tháng 7 2021.
Trang 2Tóm tắt
Arduino là một nền tảng mở và dễ dàng cho người bắt đầu học lập trình nhờ sự
hỗ trợ đông đảo từ các nguồn và các nền tảng khác Arduino hỗ trợ nhiều cách giao tiếp thông dụng với các I/O devices, chẳng hạn như TCP/IP, giao tiếp qua cổng nối tiếp (Serial port) Trong bài này, giao tiếp nối tiếp sẽ được sử dụng để thực hiện việc truyền và nhận dữ liệu giữa Matlab simulink và Arduino Bằng việc gửi và nhận dữ liệu giữa Arduino và Matlab simulink, ta sẽ theo dõi được tốc độ của động cơ và tận dụng được bộ điều khiển PID được cung cấp bởi Simulink để điều khiển tốc độ động cơ DC có gắn encoder
Trong phần này, ta sẽ không sử dụng các khối trong thư viện Simulink Support Package for Arduino Hardware Bởi vì chúng ta sẽ sử dụng Arduino như một thiết bị điều khiển trong một vòng kín Bên cạnh đó, ta cũng sẽ điều khiển tốc độ động cơ bằng bộ điều khiển On-Off để thấy rõ sự khác biệt giữa hai bộ điều khiển
Trang 3I Giới thiệu
Động cơ DC là một thiết bị phổ biến, được sử dụng trong cáác linh vực khác nhau Trong công nghiệp, động cơ DC được ứng dụng trong việc chế tạo các băng tải, bàn xoay, hay trong lĩnh vực Robot, động cơ DC được sử dụng để làm các bánh xe, giúp hệ thống di chuyển Do đó việc điều khiển động cơ hoạt động theo mong muốn đã trở thhành nhu cầu tất yếu
Để ứng dụng hệ thống điều khiển kín vào động cơ, ta cần tín hiệu hồi tiếp về bộ điều khiển để hiệu chỉnh liên tục tín hiệu điều khiển đầu vào để giữ cho động cơ hoạt động theo giá trị moong muốn Encoder là thiết bị hỗ trợ cho vấn đề này Bằng cách đọc tín hiệu từ Encoder được gắn với động cơ DC, ta có thể đo đạc được tốc độ của động cơ DC Từ đó hồi tiếp về để tính sai số giữa giá trị tham chiếu và giá trị đo được để điều chỉnh tín hiệu điều khiển
Trong đề tài này, ta sẽ sử dụng phần mềm Proteus để mô phỏng động cơ DC, Arduino và mạch điều khhiển Arduino được sử dụng là Arduinoo Uno Vì không làm thiết bị thật nên ta sẽ sử dụng phần mềm com0com để tạo cổng COM
ảo, phục vụ giao tiếp nối tiếp giữa Matlab Simulink và Arduino
II Cơ sở lí thuyết
1 Điều khiển tốc độ động cơ DC
Động cơ DC có cấu tạo gồm nam châm vĩnh cữu có từ thông không đổi Ta sẽ điều chỉnh điện áp đặt vàào phần ứng để thay đổi tốc độ động cơ Phương pháp
để điều chỉnh điện áp là điều chế độ rộng xung PWM
Trang 4Xung là các trạng thái caao/thấp được lặp đi lặp lại Tỉ lệ phần trăm giữa thời gian mức cao và chu kỳ của xung là chu kỳ nhiệm vụ (duty cycle)
Có nhiều phương pháp để tạo xung khác nhau, trong bài này ta sẽ sử dụng phương pháp tạo xung bằng phần mềm Cụ thể, ta sẽ sử dụng hàm "analogWrite"
của Arduinno để tạo xung PWM Tương ứng với giá trị từ 0-255 của Hàm
analogWrite là chu kỳ nhiệm vụ (Duty cycle) từ 0-100%
2 Bộ điều khiển PID
PID là một bộ điều khiển vòng kín Đây là bộ điều khiển kết hợp của 3 khâu: Tỉ
lệ (Proportional), tích phâân (Intergral), và vi phân (Derivative)
Sơ đồ điều khiển PID:
Luật điều khiển PID:
( ) )
u(t) = Kp( e(t) + ( ) +Td
Ảnh hưởng của các khâu điều khiển lên hệ thống:
+Khâu tỉ lệ (Kp): Làm giảm thời gian lên và sai số xác lập Tuy nhiên Kp quá lớn sẽ làm tăng độ vọt lố, hệ thống càng dao động và khó xáác lập.
+Khâu tích phân (KKi): Loại bỏ sai số xác lập Ki càng lớn thì đột vọt lố
càng cao, thời gian xác lập tăng
Trang 5+Khâu vi phân (Kd): Hệ thống đáp ứng nhanh, độ vọt lố nhỏ Tuy nhiên không thể sử dụng riêng lẻ mà phải kết hợp với hai khâu trên
Cách xác định các thông số của bộ điều khiển: Dùng Phương pháp
Ziegler-Nichols:
+Đầu tiên ta sẽ cho Ki=Kd=0 Sau đó tăng dần Kp cho đến khi hệ thống dao động tuần hoàn Đặt Kp này là Kc
+Đo chu kỳ dao động Pc của hệ, thực hiện tính toán theo bảng sau:
Bộ điều khiển PID số (rời rạc):
Bộ điều khiển được số hóa để tận dụng được sức mạnh của vi xử lí Do trong đề tài này, ta sử dụng khối nhận thông tin từ Arduino với thời gian lấy mẫu nên ta sẽ
sử dụng bộ PID số để không xuất hiện lỗi khi thực hiện điều khiển
Sơ đồ bộ điều khiển:
Việc lựa chọn tham số cho bộ điều khiển PID số cũng tương tự như trên
3 Encoder
Trang 6Encoder hay còn gọi là bộ mã hóa, là một thiết bị có khả năng làm biến đổi chuyển động thành tín hiệu số hoặc xung1
Encoder gồm hai loại chính:
+Encoder tuyệt đối
+Encoder tương đối (incremental encoder)
Encoder mà ta sử dụng trong phần này là Encoder tương đối vì nó đơn giản, giá thành rẻ
Nguyên lí hoạt động của Encoder:
Encoder có một đĩa với những lỗ có độ dài bằng nhau và cách đều nhau Tất cả đều được kết nối với chân Z chung và hai chân riêng biệt A và B
Khi cái đĩa quay, chân A và chân B sẽ liên lạc với chân chung Z và hai tín hiệu sóng vuông được tạo ra lần lượt bởi hai chân, được biểu hiện như trong hình bên dưới:
Hai tín hiệu tạo ra từ chân A và B ngược pha nhau một góc 90 độ Nếu encoder quay cùng chiều kim đồng hồ, tín hiệu từ chân A sẽ sớm pha hơn chân B Ngược lại, nếu encoder quay ngược chiều kim đồng hồ thì tín hiệu từ chân B sẽ sớm pha hơn chân A
Động cơ quay theo chiều kim đồng hồ:
1 https://prosensor.vn/encoder-la-gi-nhung-dieu-can-biet-ve-encoder/
Trang 7Động cơ quay ngược chiều kim đồng hồ:
Cách tính tốc độ động cơ DC:
Số xung một vòng quay (Pulses per revolution - PPR) là một thông số của encoder Nó là số lượng xung đo được khi encoder hoàn tất một vòng quay 360
độ Đây cũng là số đo của độ phân giải của encoder
Phương pháp xác định tốc độ (RPM): Đo tần số Ta sẽ đo tần số xung (số xung trong một giây) từ một chân A hoặc B của encoder nhờ vào chức năng digital input của vi xử lí Sau đó áp dụng công thức sau để tính tốc độ (RPM):
trong đó: tần số xung được tính bằng số xung/s; 60 là do 1 phút = 60s, tốc độ
đang tính là RPM
III Thiết kế hardware và các linh kiện cần thiết
Sơ đồ thiết kế mô phỏng trên Proteus:
Trang 8•Arduino Uno: là một board mạch vi điều khiển được phát triển bởi
Arduino.cc, một nền tảng điện tử mã nguồn mở chủ yếu dựa trên vi điều khiển AVR Atmega328P Với Arduino chúng ta có thể xây dựng các ứng dụng điện tử tương tác với nhau thông qua phần mềm và phần cứng hỗ trợ
Các chân input-output của Arduino uno
Trang 9Chức năng trong đề tài này:
Send/Receive data với Software Matlab bằng kết nối Serial port
•Mạch cầu L293N: là trình điều khiển động cơ H-Bridge kép cho phép điều
khiển tốc độ và hướng của hai động cơ DC cùng một lúc Mô-đun có thể điều khiển động cơ DC có điện áp trong khoảng từ 5 đến 35V, với dòng điện cực đại lên đến 2A
Mô-đun này có hai nhóm chân cho động cơ A và B, và một chân ở giữa cho chân Ground, VCC cho động cơ và chân 5V có thể là đầu vào hoặc đầu ra
Chân IN1, IN2 điều khiển hướng quay và tốc độ động cơ bằng PWM IN1 bằng 0 và đầu vào 2 khác 0 thì động cơ sẽ quay theo chiều kim đồng hồ Vf ngược lại
Chân ENA để cho phép động cơ hoạt động
Trang 10•Động cơ tích hợp encoder :Encoder có chức năng quay theo động cơ và dc
sử dụng để xác định tốc độ động cơ, hướng quay của động cơ bằng hai xung
A, B gửi về cho Arduino xử lí
•Compim: mô phỏng giao tiếp nối tiếp với cổng COM trong máy tính.
IV Sơ đồ nguyên lí
Điểm đặt + ∑ Bộ điều khiển DC Motor Encoder
_
V Các module sử dụng, lưu đồ giải thuật (flowchart)
1 Các module sử dụng
Để truyền và gửi dữ liệu từ Matlab qua cổng nối tiếp, ta sử dụng các khối trong thư viện Instrument Control Toolbox của Matlab simulink
Khối Serial Configuration được dùng để cấu hình các thông số của cổng nối tiếp cho Simulink
Khối Serial Receive được dùng để nhận dữ liệu dưới dạng nhị phân qua cổng nối tiếp
Khối Serial Send được dùng để gửi dữ liệu dưới dạng nhị phân qua cổng nối tiếp
Khối Data Type Conversion dùng để chuyển đổi kiểu dữ liệu từ ngõ vào và scale ngõ ra
Trang 112 Lưu đồ giải thuật
Bắt đầu
Simulink nhận giá trị ngõ ra từ Arduino
Tính toán sai số giữa giá trị đặt và giá trị ngõ ra
Tính toán tín hiệu điều khiển
Gửi tín hiệu điều khiển xuống arduino
Chờ tới lần lấy mẫu tiếp theo
VI Các hàm giao thức trong Arduino
-readFromMatlab(): Nhận dữ liệu gửi từ Maltlab qua Serial Port.
float readFromMatlab()
{
int reln = Serial.readBytesUntil("\r\n", buf, buffer_size); for (int i=0; i<buffer_size; i++) {
u.b[i]=buf[i];
} float output = u.fval;
return output;
}
Trang 12-writeToMatlab (): Gửi dữ liệu từ Arduino lên Matlab
void writeToMatlab (float number) {
byte *b = (byte *)& number;
Serial.write(b,4);
Serial.write(13);
Serial.write(10);
}
-encoder(): Tính tốc độ động cơ DC và điều khiển chiều quay
Bằng việc sử dụng chức năng ngắt, ta sẽ ghi lại thời gian phát hiện xung cạnh lên theo đơn vị mirco giây Hiệu số giữa hai lần liên tiếp được sử dụng để tính tần số xung, tuy nhiên đây là đơn vị micro giây nên ta sẽ đổi ra giây bằng cách chia 106 PPR của encoder trong trường hợp này là 24 Áp dụng công thức trong phần II.3,
ta được công thức hoàn chỉnh như sau:
RPM= ∗ ∗∆ , trong đó ∆t (us) là hiệu thời gian giữa hai lần khi ngắt xảy ra.
void encoder() {
now=micros();
rpm = 60*1000000/(24*(now - previousMicros));
previousMicros =now;
if (digitalRead(encoderPinB)==LOW)
{ Aled=true;//dong co dang xoay ve ben
phai Bled=false;
}
else { Bled=true;//dong co dang xoay ve ben trai
Aled=false;}
}
Trang 13-Lệnh "analogWrite" chỉ cho ra giá trị từ 0-255 nên ta sẽ giới hạn giá trị
đọc được từ Simulink trong khoảng này
VI Thực hiện quá trình điều khiển
1 Điều khiển động cơ bằng bộ điều khiển On-Off
Ta xây dựng một model Simulink như sau:
Trong hình trên, ta sẽ cấu hình một số khối như sau:
Trang 14Để xây dựng bộ điều khiển On-Off ta sẽ sử dụng khối Matlab Function Đoạn chương trình điều khiển như sau:
function u = fcn(e)
if e>=0
u=255;
else u=0;
end
2 Điều khiển động cơ bằng bộ điều khiển PID số (rời rạc)
Ta xây dựng các khối chức năng và thiết lập các thông số giống như bộ điều khiển On-Off, chỉ thay thế bộ điều khiển On-Off bằng bộ điều khiển PID
V Kết quả
Trên Proteus
Tốc độ đặt của động cơ là 120, tốc độ Baund 115200
Trang 15LED-RED hiển thị động cơ đang quay cùng chiều kim đồng hồ.
LED-BLUE hiển thị động cơ đang chạy ngược chiều kim đồng hồ, để quay ngược chiều đóng switch nối đến PIN4 của Arduino, tốc độ đặt 120rpm
Trên simulink
Trang 161 Bộ điều khiển On-Off
Tốc độ đăt 120 RPM
Đáp ứng hệ thống:
Tín hiệu điều khiển u
Nhận xét:
Trang 17Bộ điều khiển On-Off là bộ điều khiển hồi tiếp đơn giản nhất Nó chỉ đơn giản thay đổi tín hiệu điều khiển từ đóng hoàn toàn sang mở hoàn toàn phụ thuộc vào sai số giữa giá trị đặt và giá trị đo được
Tuy nhiên, đối với bộ điều khiển này, sai số xác lập lớn, hệ thống kém ổn định Việc đóng mở liên tục sẽ dẫn tới hiện tượng chattering Để tránh việc này xảy ra,
bộ điều khiển On-off thường có vùng chết (deadband) ở điểm đặt
2 Bộ điều khiển PID
Setpoint 120 RPM, Kp=10, Ki=0, Kd=0
Tín hiệu điều khiển u
Đáp ứng hệ thống
Trang 18Setpoint 120 RPM, Kp=6.8, Ki=27, Kd=0 Tín hiệu điều khiển u
Đáp ứng hệ thống
Trang 19Nhận xét: Với bộ điều khiển PID, đáp ứng hệ thống đã được cải thiện Tuy
nhiên, đối với mỗi hệ số điều khiển khác nhau sẽ ảnh hưởng đến chất lượng của
hệ thống Vì vậy cần lựa chọn hệ số của bộ điều khiển phù hợp để có chất lượng
hệ thống tốt nhất
VI Kết luận
Thông qua đề tài, ta đã biết cách giao tiếp Matlab Simulink với Arduino thông qua cổng Serial Bằng việc này, ta có truyền và nhận dữ liệu giữa Matlab Simulink và Arduino với nhau Từ đó, tận dụng được các tính năng trên Matlab
để điều khiển các đối tượng dễ dàng hơn
Bên cạnh đó, ta đã nắm được nguyên lí hoạt động của encoder để ứng dụng vào quá trình đo tốc độ động cơ DC, cách điều chế độ rộng xung (PWM) để điều khiển động cơ quay theo tốc độ mong muốn, và thực hiện điều khiển động cơ quay theo hai bộ điều khiển là On-Off và PID
Mặc dù đề tài không được thực hiện với các thiết bị thật, nhưng thông qua việc
mô phỏng, ta cũng sẽ hiểu được cách thực hiện đề tài trong thực tế, giảm thiểu sai sót trong quá trình thực hiện
Trang 20Tài liệu tham khảo:
1 https://prosensor.vn/encoder-la-gi-nhung-dieu-can-biet-ve-encoder/
2 https://www2.hcmuaf.edu.vn/data/phucnt/file/bo-dieu-khien_pid.pdf
3.http://documents.opto22.com/1784_RPM_Measurement_Techniques_Technic al_Note.pdf
4 https://github.com/leomariga/Simulink-Arduino-Serial
6. https://www.youtube.com/watch?v=DVwNZQu5jTk&t=352s