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 độ đ
Trang 1ĐẠI HỌC QU
TRƯ
BÁO CÁO
Giao tiếp Simulink Matlab và Arduino thông qua Serial port và
khiển t
GVHD:
Tp H
Thực hi
C QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA
BÁO CÁO ĐỀ TÀI
Simulink Matlab và Arduino thông qua Serial port và ứng dụng vào bài toán đi
n tốc độ động cơ DC bằng PID
GVHD: Thầy Nguyễn Lê Dũng
Tp Hồ Chí Minh, tháng 7 2021
CHÍ MINH
Simulink Matlab và Arduino thông
ng vào bài toán điều
ng PID
1812476
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ế
nhau Trong công nghiệp, đ
băng tải, bàn xoay, hay trong l
các bánh xe, giúp hệ thống di ch
theo mong muốn đã trở thành nhu c
Để ứng dụng hệ thống điề
điều khiển để hiệu chỉnh liên t
hoạt động theo giá trị mong mu
Bằng cách đọc tín hiệu từ
được tốc độ của động cơ DC T
chiếu và giá trị đo được đ
Trong đề tài này, ta sẽ sử
Arduino và mạch điều khi
làm thiết bị thật nên ta sẽ
phục vụ giao tiếp nối tiếp gi
II Cơ sở lí thuyết
1 Điều khiển tốc đ
Động cơ DC có cấu tạo g
điều chỉnh điện áp đặt vào ph
để điều chỉnh điện áp là đi
ết bị phổ biến, được sử dụng trong các linh v
p, động cơ DC được ứng dụng trong vi
i, bàn xoay, hay trong lĩnh vực Robot, động cơ DC được s
ng di chuyển Do đó việc điều khiển độ thành nhu cầu tất yếu
ều khiển kín vào động cơ, ta cần tín hiệ
nh liên tục tín hiệu điều khiển đầu vào để mong muốn Encoder là thiết bị hỗ trợ
ừ Encoder được gắn với động cơ DC, ta có th
ng cơ DC Từ đó hồi tiếp về để tính sai số gi
c để điều chỉnh tín hiệu điều khiển
ử dụng phần mềm Proteus để mô phỏ
u khiển Arduino được sử dụng là Arduino Uno Vì không
ẽ sử dụng phần mềm com0com để tạo c
p giữa Matlab Simulink và Arduino
c độ động cơ DC
o gồm nam châm vĩnh cữu có từ thông không đ
t vào phần ứng để thay đổi tốc độ động cơ
n áp là điều chế độ rộng xung PWM
ng trong các linh vực khác
ng trong việc chế tạo các
c sử dụng để làm ộng cơ hoạt động
ệu hồi tiếp về bộ giữ cho động cơ cho vấn đề này
ng cơ DC, ta có thể đo đạc
giữa giá trị tham
ỏng động cơ DC,
ng là Arduino Uno Vì không
o cổng COM ảo,
thông không đổi Ta sẽ
ng cơ Phương pháp
Trang 4Xung là các trạng thái cao/th
gian mức cao và chu kỳ củ
Có nhiều phương pháp đ
phương pháp tạo xung b
"analogWrite" của Arduino
của Hàm analogWrite là chu k
2 Bộ điều khiển PID
PID là một bộ điều khiển vòng kín
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) +
Ảnh hưởng của các khâu đi
+Khâu tỉ lệ (Kp): Làm gi
quá lớn sẽ làm tăng độ vọ
+Khâu tích phân (Ki): Lo
càng cao, thời gian xác lập tăng
ng thái cao/thấp được lặp đi lặp lại Tỉ lệ phần trăm gi
ủa xung là chu kỳ nhiệm vụ (duty cycle)
u phương pháp để tạo xung khác nhau, trong bài này ta s
o xung bằng phần mềm Cụ thể, ta sẽ
a Arduino để tạo xung PWM Tương ứng với giá tr
a Hàm analogWrite là chu kỳ nhiệm vụ (Duty cycle) từ 0-100%
n PID
n vòng kín Đây là bộ điều khiển kết hợ (Proportional), tích phân (Intergral), và vi phân (Derivative)
( ) +Td ( ) )
a các khâu điều khiển lên hệ thống:
(Kp): Làm giảm thời gian lên và sai số xác lậ
ọt lố, hệ thống càng dao động và khó xác l +Khâu tích phân (Ki): Loại bỏ sai số xác lập Ki càng lớ
p tăng
n trăm giữa thời (duty cycle)
này ta sẽ sử dụng
sử dụng hàm
i giá trị từ 0-255 100%
ợp của 3 khâu: Tỉ
ập Tuy nhiên Kp
ng và khó xác lập
ớn thì đột vọt lố
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:
Read and Write xử lý tín hiện digital, analog
Đọc tín hiệu encoder gửi về để tính tốc độ động cơ
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í
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
+ _ Điểm đặt ∑ Bộ điều khiển DC Motor Encoder
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
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;
}
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
Trang 12-writeToMatlab (): Gửi dữ liệu từ Arduino lên Matlab
-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:
∗∆ , trong đó ∆t (us) là hiệu thời gian giữa hai lần khi ngắt xảy ra
void writeToMatlab (float number) {
byte *b = (byte *)& number;
Serial.write(b,4);
Serial.write(13);
Serial.write(10);
}
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:
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
if e>=0
u=255;
else u=0;
end
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
5 https://www.youtube.com/watch?v=wj-EGwmY6Fo
6 https://www.youtube.com/watch?v=DVwNZQu5jTk&t=352s