Tải bản đầy đủ (.docx) (9 trang)

Triển khai thuật toán PID trên AGV

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 (67.83 KB, 9 trang )

Ý TƯỞNG CƠ BẢN VỀ THUẬT TỐN PID
Thuật tốn PID là một thuật toán điều khiển dự đoán, ý tưởng cốt lõi của nó là :
1. Thuật tốn PID khơng chỉ xem xét giá trị trạng thái hiện tại của đối tượng
được điều khiển (trạng thái hiện tại), mà còn xem xét giá trị trạng thái của
đối tượng được điều khiển trong khoảng thời gian trước đây (trạng thái lịch
sử) và sự thay đổi của giá trị trạng thái trong thời gian gần đây nhất khoảng
thời gian (dự kiến), được xác định chung bởi ba khía cạnh này Tín hiệu điều
khiển đầu ra hiện tại:
2. Kết quả tính tốn của thuật toán điều khiển PID là một số. Sử dụng số này
để điều khiển đối tượng được điều khiển hoạt động ở nhiều trạng thái làm
việc khác nhau (chẳng hạn như nhiều công suất của máy sưởi, nhiều van
mở,…). Dạng đầu ra chung là PWM, đáp ứng cơ bản mục đích xuất tín hiệu
điều khiển theo yêu cầu và thay đổi đầu ra bất cứ lúc nào tùy theo tình
huống.
Ý tưởng cơ bản của thuật toán điều khiển PID đại khái như trên, nhưng nó cần
được điều chỉnh cho phù hợp với các tình huống khác nhau. Ví dụ, đối với điều
khiển hướng của AGV, chúng ta cần tập trung vào trạng thái hiện tại của AGV - giá
trị độ lệch vị trí và giá trị độ lệch góc (điều chỉnh tỷ lệ), điều chỉnh bổ trợ trạng
thái dự kiến (điều chỉnh vi phân) và lịch sử trạng thái không cần xét (điều chỉnh
tích phân). Trong điều khiển thực tế, bạn sẽ thấy rằng trong trường hợp bình
thường, miễn là điều khiển tỷ lệ phù hợp, bản thân xe chạy rất êm, việc bổ sung
điều chỉnh vi sai là để đối phó với các tình huống đột ngột khi AGV bị ngoại lực
tác động. Điều chỉnh tích phân khơng được xem xét ở đây vì điều khiển hướng
AGV là điều chỉnh động thời gian thực và sai số lịch sử khơng có nhiều ý nghĩa
trong trường hợp này.
A. Điều khiển theo tỷ lệ :
Thiết lập một hệ thống điều khiển: giá trị do người dùng đặt là Sv (nghĩa là giá trị
mong muốn của đối tượng được điều khiển thông qua thuật toán điều khiển PID).
1. Kể từ khi hệ thống được đưa vào hoạt động, thuật toán điều khiển lấy mẫu
giá trị trạng thái của đối tượng được điều khiển trong mỗi khoảng thời gian.
Do đó, chuỗi dữ liệu được hình thành bởi giá trị trạng thái của đối tượng


được kiểm soát tại mỗi thời điểm lấy mẫu kể từ khi khởi động có thể thu
được: X1, X2, X3, X4, Xk_2, Xk_1, Xk
Mô tả:
X1: Giá trị được lấy mẫu đầu tiên kể từ khi bật nguồn.
Xk : Giá trị được lấy mẫu hiện tại ( giá trị được lấy mẫu gần đây nhất ).
2. Trích xuất ba khía cạnh thông tin từ chuỗi giá trị được lấy mẫu :


Sự khác biệt giữa giá trị được lấy mẫu hiện tại Xk và giá trị do người dùng
đặt Sv : Ek
Ek = Sv – Xk
Phân tích Ek :
Ek > 0 : giá trị hiện tại chưa đạt tiêu chuẩn.
Ek = 0 : Giá trị hiện tại đáp ứng các yêu cầu.
Ek < 0 : Giá trị hiện tại đã vượt quá tiêu chuẩn.
Kết luận : Ek phản ánh mức độ sai lệch giữa giá trị hiện tại của đối tượng điều
khiển và giá trị cài đặt. Tín hiệu đầu ra (OUT) có thể được điều chỉnh theo kích
thước của Ek. Tức là thuật toán đưa ra giá trị hiện tại của tín hiệu điều khiển OUT
theo độ lớn của Ek được gọi là điều khiển tỷ lệ và có thể được biểu thị bằng 1 mơ
hình tốn học:
Pout = (Kp * Ek) + Out 0
Kp: Gọi chung là hệ số tỷ lệ, có thể hiểu nơm na là bộ khuếch đại trên phần cứng,
chọn Kp phù hợp để khuếch đại hoặc giảm giá trị lỗi dòng Ek bằng một độ lợi nào
đó để cải thiện điều khiển Tốc độ tương ứng của thuật tốn. Out0: là một hằng số,
mục đích là để đảm bảo rằng tín hiệu đầu ra khơng phải là 0 khi EK là 0, do đó tín
hiệu đầu ra của bộ điều khiển OUT là 0 khi giá trị hiện tại bằng giá trị đặt và hệ
thống ở trạng thái out của trạng thái điều khiển mà khơng có tín hiệu điều khiển.
Khi con quay hồi chuyển đang theo dõi, dữ liệu góc được thu thập dưới dạng SV
sau khi bật nguồn (khơng có độ lệch góc giữa thân xe và đường ray tại thời điểm
này) và dữ liệu góc được thu thập sau đó là tất cả Xk,

Ek = Sv-Xk
Tuy nhiên, để thực hiện điều hướng AGV, chỉ dữ liệu độ lệch góc khơng thể tạo
thành điều khiển vịng kín. Chúng ta cũng cần một camera để xác định dữ liệu độ
lệch vị trí của AGV. Khi sử dụng OPEM-MV3 để gỡ lỗi, bạn có thể trực tiếp nhận
được giá trị độ lệch góc AGV EK_A và giá trị độ lệch khoảng cách EK_D (liên
quan đến tâm theo dõi) từ mô-đun máy ảnh. Lưu ý rằng dữ liệu thu được tại thời
điểm này là giá trị độ lệch chinh no. Để đạt được điều khiển vòng kín, mơ hình
tốn học như sau:
Pout = (KP_A * Ek_A) + (KP_D * Ek_D) + Out
Điều chỉnh KP_A và KP_D để đạt được điều khiển tỷ lệ chuyển hướng thân xe.
B. Điều khiển tích phân.
Trừ đi mỗi giá trị được lấy mẫu kể từ khi nó được đưa vào hoạt động với giá trị đã
đặt và Điều khiển tích phân trừ đi mỗi giá trị được lấy mẫu kể từ khi nó được đưa


vào hoạt động với giá trị đã đặt và dữ liệu trình tự độ lệch tại mỗi thời điểm lấy
mẫu kể từ khi khởi động có thể thu được: E1, E2, E3 .. Ek-2, Ek- 1, Ek
Mô tả Ek :
E1: Độ lệch giữa điểm lấy mẫu đầu tiên khi bật nguồn và giá trị đặt.
El = Sv - X1;
E2 = Sv - X2;

Ek-2 = Sv-Xk_2;
Ek-1 = Sv- Xk_1;
Ek : Độ lệch giữa giá trị được lấy mẫu hiện tại và giá trị đặt
Ek = Sv-Xk
Phân tích chuỗi lỗi kể từ khi khởi động:
Mỗi giá trị độ lệch có thể có ba giá trị có thể có: > 0, <0, = 0, bởi vì từ đầu
đến nay điều khiển Thuật tốn liên tục xuất ra các tín hiệu điều khiển để
điều khiển đối tượng điều khiển, điều này dẫn đến đôi khi vượt quá tiêu

chuẩn trong khoảng thời gian vừa qua (Ex < 0), đơi khi nó khơng đạt tiêu
chuẩn (Ex > 0), đơi khi nó chỉ đáp ứng u cầu (Ex = 0); nếu những giá trị
sai lệch này được tích lũy để tính tổng đại số để lấy Sk, nghĩa là :
Sk = E1 + E2 + E3 +… + Ek_2 + Ek_1 + Ek
Phân tích Sk :
Sk > 0: Không đạt tiêu chuẩn hầu hết thời gian trong quá khứ
Sk = 0: Hiệu quả kiểm soát trong quá khứ là tương đối lý tưởng
Sk <0: Hầu hết thời gian đã vượt quá tiêu chuẩn trong quá khứ
Kết luận:
- Qua phân tích Sk, có thể đánh giá tồn diện hiệu quả điều khiển trong quá khứ
của thuật toán điều khiển. Nó phản ánh rằng đầu ra tín hiệu điều khiển bởi thuật
toán điều khiển theo cách ban đầu dẫn đến kết quả điều khiển hiện tại, vì vậy giá
trị này nên được sử dụng để sửa đổi tín hiệu điều khiển hiện tại OUT được xuất ra
để đảm bảo rằng đối tượng điều khiển sẽ đến tay người dùng sớm nhất càng tốt
trong một khoảng thời gian ngắn trong tương lai.
- Sk thực chất là tổng sai số tại mỗi thời điểm trong quá khứ, tương tự như các
phép tính tích phân xác định trong tốn học Do đó thuật tốn điều chỉnh tín hiệu ra
theo Sk được gọi là thuật tốn tích phân. Vì vậy, mơ hình tốn học của điều khiển
tích phân là:
I_OUT = (kp * ((1 / Ti) Exdt)) + 0ut0
Kp là một hằng số, và mục đích của nó tương tự như một bộ khuếch đại trên phần
cứng, được sử dụng để khuếch đại hoặc làm suy giảm Sk
Out0 là một hằng số, Để đảm bảo rằng hệ thống có giá trị đầu ra khi giá trị độ lệch
tích phân lịch sử là 0, để tránh mất kiểm soát;


Ti là hằng số thời gian tích phân, giá trị càng lớn thì đầu ra OUT sẽ càng nhỏ, điều
này có thể hiểu là giá trị sai số tồn tại lâu đời trong lịch sử tín hiệu đầu ra hiện tại.
Giá trị này càng nhỏ thì đầu ra OUT sẽ càng mạnh, có thể hiểu rằng tích phân chỉ
xét đến sai số của khoảng thời gian gần đây nhất. Trong thực tế, nếu hệ thống đã

chạy trong một khoảng thời gian dài, các giá trị độ lệch của các mẫu ban đầu đó có
thể bỏ qua ảnh hưởng của chúng đối với điều khiển hiện tại. Do đó, giá trị Ti hợp
lý nên được chọn tùy theo tình huống có được một kết quả tốt.
Công thức I_OUT = (Kp * ((1 / Ti) Exdt) + 0ut0 có thể được đơn giản hóa thành
ba bước sau trong sử dụng thực tế:
Ek = Sv - Pv; // Sv giá trị đặt, Pv là giá trị hiện tại.
SEk + = Ek; // SEk lỗi tích lũy
Iout = KI * SEk + Out0.
Điều chỉnh KI để hồn thành điều khiển tích phân, nhưng trong quá trình gỡ lỗi
thực tế, sau khi thêm điều khiển tích phân, hiệu quả theo dõi của AGV trở nên tồi
tệ hơn và giá trị KI vẫn được sửa đổi nhiều lần . Xét bản thân con quay Có một độ
lệch nào đó sẽ ảnh hưởng đến điều khiển tích phân nên cuối cùng điều khiển tích
phân khơng được sử dụng
C. Điều khiển vi phân
Chênh lệch giữa hai độ lệch cuối của điều khiển đạo hàm Dk:
Dk = Ek - Ek- 1
Mô tả:
Ek : độ lệch hiện tại
Ek-1: dựa trên giá trị độ lệch hiện tại của mẫu trước đó (tức là giá trị độ lệch của
lần trước):
Phân tích Dk :
Dk > 0 : Có nghĩa là sai số có xu hướng tăng từ lần lấy mẫu cuối cùng đến thời
điểm hiện tại.
Dk = 0 : Có nghĩa là sai số ổn định từ lần lấy mẫu gần nhất đến hiện tại.
Dk < 0 : Có nghĩa là lỗi có xu hướng giảm dần từ thời điểm lấy mẫu cuối cùng đến
thời điểm hiện tại.
Dk có thể giải thích xu hướng thay đổi trạng thái của đối tượng được kiểm soát
trong khoảng thời gian từ lần lấy mẫu cuối cùng đến lần lấy mẫu hiện tại.



Xu hướng thay đổi này có khả năng tiếp tục đến thời điểm lấy mẫu tiếp theo ở một
mức độ nhất định, do đó tín hiệu đầu ra OUT có thể được điều chỉnh theo xu
hướng thay đổi này (giá trị của Dk) để đạt được mục đích điều khiển trước.
Dk có hình dạng giống như một phép tốn vi phân, phản ứng ban đầu với xu
hướng thay đổi và lượng thay đổi của đối tượng điều khiển trong một khoảng thời
gian, vì vậy thuật tốn sử dụng Dk để điều chỉnh tín hiệu đầu ra của bộ điều khiển
được gọi là thuật tốn vi phân. Nó có thể được biểu thị bằng một mơ hình tốn
học như sau :
Dout = Kp * (Td (de / dt)) + Out0
Trong thực tế sử dụng, cơng thức trên có thể được đơn giản hóa thành:
DelEk = Ek-Ek_1;

// Sự khác biệt giữa hai công thức cuối cùng sai lệch.

Dout = Kd * DelEk; // Đầu ra sai lệch.
D. Phân tích ưu nhược điểm của thuật tốn PID
Hình thành 1 thuật tốn tỉ lệ, tích phân và vi phân:
POUT = (Kp * Ek) + Out0 // thuật toán tỉ lệ
IOUT = kp * ((1 /) Exdt) + Out0 //Thuật tốn tích phân
DOUT = Kp * (Td (de / dt)) + Out0 // Thuật toán vi phân
Thuật toán tỷ lệ :
Chỉ xét lỗi hiện tại của đối tượng điều khiển, lỗi hiện tại chỉ xuất tín hiệu điều
khiển, cịn lỗi hiện tại sẽ khơng xuất ra điều khiển tín hiệu, nghĩa là thuật tốn chỉ
thực hiện các biện pháp để điều chỉnh, vì vậy khơng thể cho một thuật toán tỷ lệ
duy nhất kiểm soát giá trị trạng thái của đối tượng được điều khiển ở giá trị đã đặt,
và nó ln dao động lên và xuống giá trị cài đặt; nhưng điều khiển tỷ lệ rất nhạy
cảm và lỗi được phản ánh ngay lập tức vào đầu ra.
Thuật tốn tích phân:
Xem xét tình huống lỗi lịch sử của đối tượng được điều khiển Tình huống lỗi trong
quá khứ tham gia vào quá trình điều khiển đầu ra hiện tại Tuy nhiên, trong khoảng

thời gian hệ thống chưa đạt được mục tiêu, các lỗi lịch sử này thường gây trở ngại
cho việc điều khiển hiện tại (tức là kéo ), sử dụng không đúng cách sẽ làm rối loạn
đầu ra hiện tại. Nhưng sau khi hệ thống đi vào trạng thái ổn định, đặc biệt là khi
khơng có độ lệch giữa giá trị hiện tại và giá trị đặt, thuật tốn tích phân có thể xuất
ra tín hiệu điều khiển tương đối ổn định theo giá trị độ lệch trong quá khứ để ngăn
chặn độ lệch khỏi mục tiêu và đóng vai trị phịng ngừa.


Thuật tốn vi phân:
Nó chỉ đơn giản là xem xét tốc độ thay đổi gần đây. Khi độ lệch của hệ thống tiến
đến một giá trị cố định nhất định (tốc độ thay đổi bằng 0), thuật tốn vi phân
khơng đưa ra tín hiệu để điều chỉnh độ lệch của nó. Vì vậy thuật tốn vi phân chỉ
quan tâm đến tốc độ thay đổi của độ lệch và không xem xét liệu có độ lệch hay
khơng (độ lệch khơng nhất thiết là 0 khi tốc độ thay đổi độ lệch bằng 0). Tuy
nhiên, thuật tốn vi phân có thể thu được xu hướng thay đổi gần đây của đối tượng
được điều khiển và nó có thể hỗ trợ tín hiệu đầu ra để ngăn chặn sự thay đổi của
đối tượng được điều khiển càng sớm càng tốt. Có thể hiểu rằng khi có sự thay đổi
mạnh thì tín hiệu đầu ra được điều chỉnh mạnh để triệt tiêu nó, tránh được sự thay
đổi mạnh của đối tượng bị điều khiển. Ba thuật toán trên được kết hợp để tạo ra
một đại lượng điều khiển hiện tại để điều khiển đối tượng điều khiển, và ưu nhược
điểm của chúng bổ sung cho nhau, tức là một thuật toán PID cổ điển được hình
thành.
Mơ hình tốn học của thuật tốn PID.
OUT = Pout + Iout + Dout:
OUT = ((Kp * Ek) + Out0) + (kp * ((1 / Ti) Exdt) + Out0) + (Kp * (Td (de / dt) +
Out0).
Để sắp xếp công thức này ta hợp nhất Out0 của mỗi mục thành OUT0.
OUT = kp (Ek + ((1 / Ti)Exdt )) + (Td (de / dt))) + OUTO
OUT = Kp * Ek + Ki * SEk + Kd * DelEk
Mã nguồn của chương trình PID.

#ifndef _pid_
#define _pid_
#include "stm32f10x_conf.h"
#define

MODEL_P

1

#define

MODEL_PI

2

#define

MODEL_PID

typedef struct

3


{
u8 choose_model;
float Sv;
float Pv;
float Kp;
float T;

u16 Tdata;
float Ti;
float Td;
float Ek;
float Ek_1;
float SEk;
float Iout;
float Pout;
float Dout;
float OUT0;
float OUT;
u16 pwmcycle;
} PID;
extern PID pid;
void PID_Calc(void);
void PID_Init(void);
#endif

#include "pid.h"
#include "PWM_Config.h"


#include "USART_Config.h"
PID pid;
void PID_Init()
{
pid.choose_model = MODEL_PID;
pid.T = 330;
pid.Sv = 280;
pid.Kp = 0.5;

pid.Ti = 180;
pid.Td = 1;
pid.OUT0 = 0;
pid.pwmcycle = 330;
}
void PID_Calc()
{
float DelEk;
float ti,ki;
float td;
float kd;
float out;
if(pid.Tdata < (pid.T))
{
return;
}
pid.Tdata = 0;
pid.Ek = pid.Sv-pid.Pv;
pid.Pout = pid.Kp*pid.Ek;
pid.SEk += pid.Ek;


DelEk = pid.Ek - pid.Ek_1;
ti = pid.T /pid.Ti;
ki = ti * pid.Kp;
pid.Iout = ki * pid.SEk;
td = pid.Td/pid.T;
kd = pid.Kp * td;
pid.Dout = kd * DelEk;
switch(pid.choose_model)

{
case MODEL_P:
out = pid.Pout;
break;
case MODEL_PI:
out = pid.Pout+ pid.Iout;
break;
case MODEL_PID:
out = pid.Pout+ pid.Iout+ pid.Dout;
break;
}
if(out>pid.pwmcycle)
{
pid.OUT = pid.pwmcycle;
}else if(out < pid.OUT0;
}else{
pid.OUT = out;
}
pid.Ek_1 = pid.Ek;
Turn_Angle((int)pid.OUT);
}



×