Tải bản đầy đủ (.pdf) (27 trang)

Điều khiển động cơ bằng PID

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.3 MB, 27 trang )

BỘ GIÁO DỤC - ĐÀO TẠO
TRƯỜNG ĐẠI HỌC QUỐC TẾ HỒNG BÀNG
KHOA ĐIỆN TỬ - TỰ ĐỘNG HÓA

----------

BÁO CÁO BÀI TẬP LỚN
CƠ SỞ ĐIỀU KHIỂN TỰ ĐỘNG
Đề tài: Điều khiển tốc độ động cơ bằng PID

Giảng viên hướng dẫn : TS. Nguyễn Trọng Tài
Sinh viên thực hiện

: Phạm Thị Vân

141103007

: Trần Chánh Phát 141102044
Lớp

: DT14DH – DT1

TP.HCM 06/2016


MỤC LỤC
CHƯƠNG 1 TỔNG QUAN....................................................................................................1
1.1. Động cơ DC ..................................................................................................................1
1.1.1. Động cơ DC Servo ................................................................................................1
1.1.2. Điều khiển tốc độ động cơ ...................................................................................1
1.2. Phương pháp điều xung PWM (Pulse Width Modulation) .....................................2


1.3. Giới thiệu về Arduino ..................................................................................................2
1.3.1. Arduino là gì?........................................................................................................2
1.3.2. Board Arduino Uno ..............................................................................................3
1.4. PID..................................................................................................................................4
1.4.1 Giới thiệu PID ........................................................................................................4
1.4.2. Hàm truyền ............................................................................................................5
1.4.3. Đặc tính bộ điều khiển PID .................................................................................5
CHƯƠNG 2 THIẾT KẾ MÔ HÌNH ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ BẰNG PID.7
2.1. Sơ đồ khối hệ thống .....................................................................................................7
2.2. Lưu đồ giải thuật...........................................................................................................8
2.3. Cách đấu dây mô hình..................................................................................................8
2.3.1. Arduino Uno với L298N......................................................................................8
2.3.2. L298N với DC Servo ...........................................................................................8
2.3.3. Encoder với Arduino Uno....................................................................................9
2.4. Tìm hệ số cho bộ điều khiển PID ...............................................................................9
2.4.1. Lấy mẫu Encoder ..................................................................................................9
2.4.2 Khảo sát vòng hở để xác định mô hình động cơ bằng phương pháp thực
nghiệm............................................................................................................................ 11
2.4.3. Điều khiển vòng kín .......................................................................................... 12
i


2.4.4 Các bước tìm hệ số Kp, Ki, Kd ......................................................................... 12
2.4. Code Arduino ............................................................................................................. 16
2.4. Giao diện điều khiển ................................................................................................. 20
PHỤ LỤC ............................................................................................................................... 21
Kinh phí thực hiện............................................................................................................. 21
Code Matlab vẽ đồ thị đáp ứng vòng hở của động cơ .................................................. 21
Code Matlab tìm hàm truyền của động cơ ..................................................................... 23


ii


CHƯƠNG 1
TỔNG QUAN
1.1. Động cơ DC
1.1.1. Động cơ DC Servo
Động cơ điện là máy điện dùng để chuyển đổi năng lượng điện sang năng lượng
cơ. Nguyên tắc hoạt động: phần chính của động cơ điện gồm phần đứng yên (stator) và
phần chuyển động (rotor) được quấn nhiều vòng dây dẫn hay có nam châm vĩnh cửu.
Khi cuộn dây trên rotor và stator được nối với nguồn điện, xung quanh nó tồn tại các
từ trường, sự tương tác từ trường của rotor và stator tạo ra chuyển động quay của rotor
quanh trục hay 1 mômen.
Thông số động cơ DC Servo dùng làm đề tài:
Kiểu: DSE38BE27-001
Điện áp cấp cho động cơ: 24VDC
Tốc độ: 4400 vòng/phút
Điện áp cấp cho encoder: 5VDC
Encoder: 108 xung/vòng
Số encoder: 2 encoder đặt lệch 90 o
* Ghi chú: Để đơn giản và thuận tiện trong việc làm mô hình, trong bài này sử dụng
điện áp cấp cho DC Servo là 12V. Việc sử dụng điện áp bằng một nửa điện áp định
mức của động cơ làm giảm tốc độ quay của động cơ xuống khoảng còn một nửa (2200
vòng/phút) so với số vòng quay khi sử dụng đúng điện áp quy định (4400 vòng/phút).
1.1.2. Điều khiển tốc độ động cơ
Thông thường, tốc độ quay của một động cơ điện một chiều tỷ lệ với điện áp đặt
vào nó và ngẫu lực quay tỷ lệ với dòng điện, ngẫu lực quay lớn nhất khi động cơ khởi
động (nghĩa là khi động cơ bắt đầu quay) khi đó động cơ sẽ cần 1 dòng điện lớn để
khởi động. Điều khiển tốc độ động cơ bằng cách thay đổi giá trị điện áp và dòng vào
động cơ.


1


1.2. Phương pháp điều xung PWM (Pulse Width Modulation)
Phương pháp điều xung PWM (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 đến sự thay đổi điện áp ra. PWM được ứng dụng
nhiều trong điều khiển. Điển hình nhất mà chúng ta thường hay gặp là điều khiển động
cơ và các bộ xung áp, điều áp... Sử dụng PWM điều khiển độ nhanh chậm của động cơ
hay cao hơn nữa, nó còn được dùng để điều khiển sự ổn định tốc độ động cơ.
Đây là phương pháp được thực hiện theo nguyên tắc đóng ngắt nguồn với tải một
cách có chu kì theo luật điều chỉnh thời gian đóng ngắt. Phần tử thực hiện nhiệm vụ đó
trong bài báo cáo này là Module L298N.
Thông số kỹ thuật:
Driver: Tích hợp 2 mạch cầu H
Điện áp điều khiển động cơ: 5 ~ 12V
Dòng tối đa qua mỗi cầu H: 2A
Điện áp tín hiệu điều khiển: 5 ~ 7V
Dòng tín hiệu điều khiển: 0 ~ 36mA
Để 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ềm:
 Trong phần cứng có thể tạo bằng phương pháp so sánh hay là 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.

1.3. Giới thiệu về Arduino
1.3.1. Arduino là gì?
Arduino là một nền tảng mã nguồn mở được sử dụng để xây dựng các ứng dụng

điện tử. Arduino gồm có board mạch có thể lập trình được (thường gọi là vi điều
khiển) và các phần mềm hỗ trợ phát triển tích hợp IDE (Integrated Development
Environment) dùng để soạn thảo, biên dịch code và nạp chương trình cho board.
2


Arduino ngày nay rất phổ biến cho những người mới bắt đầu tìm hiểu về điện tử
vì nó đơn giản, hiệu quả và dễ tiếp cận. Không giống như các loại vi điều khiển khác,
Arduino không cần phải có các công cụ chuyên biệt để phụ vụ việc nạp code, ví dụ để
nạp code cho PIC cần phải có Pic Kit. Đối với Arduino rất đơn giản, ta có thể kết nối
với máy tính bằng cáp USB. Thêm vào đó việc lập trình cho Arduino rất dễ dàng, trình
biên dịch Arduino IDE sử dụng phiên bản đơn giản hóa của ngôn ngữ C++.
1.3.2. Board Arduino Uno
Một trong những board thông dụng, được sử dụng nhiều nhất là board Arduino
Uno. Dòng này đã phát triển tới thế hệ thứ 3 với tên gọi là Arduino Uno Revision 3
(Arduino Uno R3).

Hình 1.1: Board Arduino Uno R3

Vi điều khiển

ATmega328P (họ 8 bit)

Điện áp hoạt động

5V

Điện áp vào khuyên dùng

7-12V


Điện áp vào giới hạn

6-20V

Digital I/O pin

14 (trong đó 6 chân PWM)

PWM Digital I/O Pins

6

Analog Input Pins

6 (độ phân giải 10 bit)

Cường độ dòng điện trên mỗi I/O pin

20 mA

Cường độ dòng điện trên mỗi 3.3V pin 50 mA
32 KB (ATmega328P)
0.5 KB được sử dụng bởi bootloader

Flash Memory
3


SRAM


2 KB (ATmega328P)

EEPROM

1 KB (ATmega328P)

Tốc độ xung nhịp

16 MHz

Chiều dài

68.6 mm

Chiều rộng

53.4 mm

Trọng lượng

25 g
Bảng 1.1: Thông số cơ bản trên board Arduino Uno

1.4. PID
1.4.1 Giới thiệu PID
Bộ điều khiển PID (A proportional integral derivative controller) là bộ điều khiển
sử dụng kỹ thuật điều khiển theo vòng lặp dụng kỹ thuật điều khiển theo vòng lặp có
hồi tiếp được sử dụng rộng rãi trong các hệ thống điều khiển tự động.
Một bộ điều khiển PID cố gắng hiệu chỉnh sai lệch giữa tín hiệu ngõ ra và ngõ vào sau

đó đưa ra một một tín hiệu điều khiển để điều chỉnh quá trình cho phù hợp.
Bộ điều khiển kinh điển PID đã và đang được sử dụng rộng rãi để điều khiển các
đối tượng SISO bởi vì tính đơn giản của nó cả về cấu trúc lẫn nguyên lý làm việc. Bộ
điều chỉnh này làm việc rất tốt trong các hệ thống có quán tính lớn như điều khiển tốc
độ, điều khiển mức,... và trong các hệ điều khiển tuyến tính hay có mức độ phi tuyến
thấp.
PID là một trong những lý thuyết cổ điển và cũ nhất dùng cho điều khiển tuy
nhiên nó vẫn ứng dụng rộng rãi cho đến ngày nay.
Sơ đồ khối của bộ điều khiển PID:

4


1.4.2. Hàm truyền
W ( p)  K P (1 

K
1
 TD P)  K P  I  K D P
TI P
P

Bộ điều khiển gồm có 3 thành phần:
- KP : hệ số tỷ lệ
- KI : hệ số tích phân
- KD: hệ số vi phân
Xét 1 hệ thống có sơ đồ khối như sau:

Hình 2.2 Sơ đồ khối của một hệ thống
Plant: đối tượng cần điều khiển

Controller: đưa tín hiệu điều khiển đối tượng, được thiết kế để hệ thống đạt đáp
ứng mong muốn .
Biến e là thành phần sai lệch, là hiệu giữa giá trị tín hiệu vào mong muốn và tín
hiệu ra thực tế. Tín hiệu sai lệch (e) sẽ đưa tới bộ PID, và bộ điều khiển tính toán cả
thành phần tích phân lẫn vi phân của (e). Tín hiệu ra (u) của bộ điều khiển bằng:
u  K p e  K I  edt  K D

de
dt

Lúc này đối tượng điều khiển có tín hiệu vào là (u), và tín hiệu ra là (Y). (Y)
được hồi tiếp về bằng các cảm biến để tiếp tục tính sai lệch (e). Và bộ điều khiển lại
tiếp tục như trên.
1.4.3. Đặc tính bộ điều khiển PID
- Thành phần tỉ lệ (Kp) có tác dụng làm tăng tốc độ đáp ứng của hệ, và làm giảm
chứ không triệt tiêu sai số xác lập của hệ (steady-state error).
- Thành phần tích phân (Ki) có tác dụng triệt tiêu sai số xác lập nhưng có thể làm
giảm tốc độ đáp ứng của hệ.

5


- Thành phần vi phân (Kd) làm tăng độ ổn định hệ thống, giảm độ vọt lố và cải
thiện tốc độ đáp ứng của hệ.
Ảnh hưởng của các thành phần Kp, Ki, Kd đối với hệ kín được tóm tắt trong
bảng sau:
Đáp ứng
vòng kín
KP


Giảm

Tăng

Thời gian xác
lập
Thay đổi nhỏ

KI

Giảm

Tăng

Tăng

Thay đổi nhỏ

KD

Thay đổi nhỏ

Giảm

Giảm

Thay đổi nhỏ

Thời gian lên Vọt lố


Sai số xác
lập
Giảm

- Lưu ý rằng quan hệ này không phải chính xác tuyệt đối vì Kp, Ki và Kd còn
phụ thuộc vào nhau. Trên thực tế, thay đổi một thành phần có thể ảnh hưởng đến hai
thành phần còn lại. Vì vậy bảng trên chỉ có tác dụng tham khảo khi chọn Kp, Ki, Kd.

6


CHƯƠNG 2
THIẾT KẾ MÔ HÌNH ĐIỀU KHIỂN
TỐC ĐỘ ĐỘNG CƠ BẰNG PID
2.1. Sơ đồ khối hệ thống

PC: Gửi giá trị cài đặt và nhận tốc độ hiện tại của động cơ. Và điều khiển chạy
hoặc ngừng chạy của hệ thống.
Arduino Uno: Bộ điều khiển trung tâm với giải thuật PID, nhận giá trị cài đặt từ
máy tính, điều khiển động cơ bằng L298N, thông qua encoder lấy tốc độ hiện tại gửi
cho máy tính qua RS232, cổng USB của máy tính.
L298N: có nhiệm vụ nhận tín hiệu xung PWM, điều khiển mức điện áp vào động
cơ.
DC Servo, Encoder: Dựa vào mức điện áp mà L298N cấp vào động cơ, động cơ
hoạt động với tốc độ mong muốn. Encoder dùng để lấy tốc độ về cho Arduino Uno.

7


2.2. Lưu đồ giải thuật


2.3. Cách đấu dây mô hình
2.3.1. Arduino Uno với L298N
STT

Arduino Uno

L298N

1

Chân 3

Chân IN 3

2

Chân 4

Chân IN 4

3

Chân 5

Chân ENB

Arduino có 6 chân PWM tuy nhiên chân PWM 5, 6 có tần số cao nhất trong 6
chân PWM.
2.3.2. L298N với DC Servo

STT

L298N

DC Servo

1

OUT 3

Dây cấp nguồn dương (âm)

2

OUT 4

Dây cấp nguồn âm (dương)

8


2.3.3. Encoder với Arduino Uno
STT

Arduino Uno

Encoder

1


Chân 5V

Dây cấp nguồn dương

2

Chân GND

Dây cấp nguồn âm

3

Chân 2

Phase A hoặc Phase B

Trong bài báo cáo này dùng một phase để đo tốc độ nên có thể chọn phase A
hoặc B.

2.4. Tìm hệ số cho bộ điều khiển PID
2.4.1. Lấy mẫu Encoder
Sử dụng Arduino lập trình xuất xung từ 30% đến 90%, dùng encoder đọc về tốc
độ với thời gian lấy mẫu là 10ms, truyền lên máy tính thông qua RS232.
Code dùng để lấy mẫu:

#include <avr/interrupt.h>
#include <TimerOne.h>
unsigned int readValue = 0;
float vantoc = 0;
int ok = 1;

int _pwm = 77;

void encoder()
{
readValue++;
}

void tocdo()
{
vantoc = readValue/1.080;
readValue=0;
}
9


void setup()
{
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
attachInterrupt(0, encoder, RISING);
Timer1.initialize(10000);
Timer1.attachInterrupt(tocdo);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}

void loop()

{
if(ok == 1)
{
analogWrite(5, _pwm);
for(int i = 0; i <= 50 ; i++)
{
Serial.print(vantoc);
Serial.print(" ");
delay(10);
}
ok = 0;
}
else
analogWrite(5, 0);
}

10


Ta được các số liệu thực tế như sau: 0.00 0.93 0.93 0.93 1.85 1.85 2.78 2.78 4.63
4.63 4.63 4.63 5.56 5.56 5.56 5.56 6.48 6.48 6.48 7.41 6.48 7.41 6.48 7.41 7.41 8.33
7.41 8.33 7.41 8.33 8.33 8.33 8.33 8.33 8.33 8.33 8.33 8.33 9.26 8.33 9.26 8.33 9.26
8.33 9.26 9.26 9.26 8.33 9.26 9.26 9.26
2.4.2 Khảo sát vòng hở để xác định mô hình động cơ bằng phương pháp
thực nghiệm
Dùng MATLAB vẽ đồ thị từ số liệu tìm được ở trên thị để xác định : Hàm truyền
tương đương cho hệ thống: với 30% PWM thời gian lấy mẫu 10ms.

Đáp ứng (step) vòng hở của động cơ tại điện áp nguồn có PWM = 30%
Mô hình động cơ được xác định bằng hai điểm quy chiếu với hàm sau:

K
G(s) =
1 + T(s)
Xác định : K, T trong đó:
T = 1.5(t2 - t1) : Hằng số thời gian
K : Giá trị xác lập
t2, t1 được xác định bằng phương pháp hai điểm quy chiếu như biểu đồ trên t2 lấy
67%K t1 lấy 33%K. Ta được hàm truyền viết lại như sau:
9.075
G (s) =
1 + 0.1268 (s)
11


2.4.3. Điều khiển vòng kín

w(k)

+

e(k)

-

u(k)

BỘ ĐIỀU
KHIỂN PID

HÀM

TRUYỀN
HỆ THỐNG

TÍNH HIỆU
HỒI TIẾP

Sơ đồ khối bộ điều khiển PID
Sử dụng SISO Tool trong Matlap để tìm Kp, Ki cho hệ thống:
Code MATLAB:
%Bocam bien
H=tf(1,1) % hồi tiếp 1:1
% Kich hoat sisotool
sisotool(G);
2.4.4 Các bước tìm hệ số Kp, Ki, Kd
a. Chạy code Matlab

12

y(k)


b. Trên của sổ Control and Estimation Tool Manager, thêm Pole/Zero:

Thêm cực vào hàm C

Thêm Zero vào hàm C
13


Kiểm tra đáp ứng step của hàm G

Sử dụng Automatic Tuning để chỉnh tự động: Design method: PID Tuning  PI
 chọn  Update Compensator ta được dạng đồ thị như sau:

14


Chuyển Hàm C (hàm Control PI) ra Workspace: File Export, chọn như hình
vẽ:

Trên Workspace : đánh lệnh để tìm Kp, Ki của C (Control PI)
>> C
>> tf(C)
>> pid(C)
Kết quả sau khi đánh các lệnh:
>>C
C=
0.11487 (s+23.66)
----------------s
15


Continuous-time zero/pole/gain model.
>> tf(C)
ans =
0.1149 s + 2.718
---------------s
Continuous-time transfer function.
>> pid(C)
ans =
1

Kp + Ki * --s
with Kp = 0.115, Ki = 2.72
Continuous-time PI controller in parallel form.
Tương tự cho các số liệu còn lại ta cũng tìm được các K p, Ki còn lại ứng với các
mức khác.

2.4. Code Arduino
#include <avr/interrupt.h>
#include <TimerOne.h>
#include <PID_v1.h>

double Setpoint, Input, Output;
double Kp=0.0394, Ki=26.3, Kd=0.1;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
unsigned int readValue = 0;
int inChar = 0;
16


String inString = "";
int Start = 0;

float vantoc = 0;
float vset = 20;

void encoder()
{
readValue++;
}
void tocdo()

{
vantoc = readValue/1.080/2;
readValue=0;
}
void setup()
{
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
attachInterrupt(0, encoder, RISING);
Timer1.initialize(20000);
Timer1.attachInterrupt(tocdo);
17


digitalWrite(3, HIGH);
digitalWrite(4, LOW);

Input = vantoc;
Setpoint = vset;
myPID.SetMode(AUTOMATIC);
}
void loop()
{
while(Serial.available()>0)
{
inChar = Serial.read();
if (inChar != '\n')

inString += (char)inChar;
else
{
if(inString == "s" || inString == "r")
if(inString == "s")
Start = 0;
else
Start = 1;
else
{
vset = inString.toFloat();
if(vset > 20)
18


{
Kp=0.0394;
Ki=26.3;
Kd=0.1;
}
else if(vset > 10)
{
Kp=0.517;
Ki=27.1;
Kd=0.1;
}
else
{
Kp=0.546;
Ki=37.2;

Kd=0.1;
}
myPID.SetTunings(Kp, Ki, Kd);
}
inString = "";
}
}
if(Start == 1)
{
Setpoint = vset;
19


Input = vantoc;
myPID.Compute();
analogWrite(5,Output);
Serial.println(vantoc);
}
else
{
analogWrite(5,0);
}
delay(100);
}

2.4. Giao diện điều khiển

Giao diện phần mềm điều khiển tốc độ động cơ

20



PHỤ LỤC
Kinh phí thực hiện
Tên thiết bị

STT

Số
lượng

Nơi mua

Giá thành

Thành
tiền

1

Arduino Uno

1

Điện Tử Á Châu

85.000

85.000


2

L298

1

HShop

80.000

80.000

3

Nguồn 12V – 5A

1

Chợ Nhật Tảo

90.000

90.000

4

Động cơ DC Servo

1


Chợ Nhật Tảo

180.000

180.000

5

Khác (dây bus, ốc, vít, …)

Chợ Nhật Tảo, HShop

30.000
Tổng cộng:

465.000

Code Matlab vẽ đồ thị đáp ứng vòng hở của động cơ
clc
clear all
t = 10/1000

% khoang thoi gian lay mau 10ms

Tmax = 500/1000

% Tong thoi gian lay mau 500 ms

x=[0:t:Tmax]
y2 = [0.00 0.93 0.93 0.93 1.85 1.85 2.78 2.78 4.63 4.63 4.63 4.63 5.56 5.56 5.56 5.56

6.48 6.48 6.48 7.41 6.48 7.41 6.48 7.41 7.41 8.33 7.41 8.33 7.41 8.33 8.33 8.33 8.33
8.33 8.33 8.33 8.33 8.33 9.26 8.33 9.26 8.33 9.26 8.33 9.26 9.26 9.26 8.33 9.26 9.26
9.26 ]
figure(1)
hold on
plot(x,y2,'r')
%plot(x,y3,'g')
%plot(x,y4,'b')
% plot(x,y5,'r--')
% plot(x,y6,'g--')
21


% plot(x,y7,'b--')
% plot(x,y8,'r-x')
% plot(x,y9,'g-x')
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%
clc
clear all;
ts = 10/1000
Tmax = 500/1000

% khoang thoi gian lay mau 10 ms
% Tong thoi gian lay mau 500 ms

x=[0:ts:Tmax];
y2 = [0.00 0.93 0.93 0.93 1.85 1.85 2.78 2.78 4.63 4.63 4.63 4.63 5.56 5.56 5.56 5.56
6.48 6.48 6.48 7.41 6.48 7.41 6.48 7.41 7.41 8.33 7.41 8.33 7.41 8.33 8.33 8.33 8.33
8.33 8.33 8.33 8.33 8.33 9.26 8.33 9.26 8.33 9.26 8.33 9.26 9.26 9.26 8.33 9.26 9.26

9.26 ]
figure(2);
hold on;
plot(x,y2,'b');
grid on;

%%%%%%%%%%%%%%%%%%%%%%%
% Xac dinh so phan tu cua dau vao
N = size(x,2);
for i = 1:N
y2(i)=y2(i)-9.26;
end
plot(x,y2,'b');
22


×