Giới thiệu PID cơ bản

Hiểu các thành phần P, I, D và ứng dụng PID trong điều khiển robot. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết và ứng dụng thực tế trong robot.
Giới thiệu PID — Bộ điều khiển Proportional-Integral-Derivative
PID là gì?
PID là thuật toán điều khiển vòng kín phổ biến nhất trong công nghiệp và robot. Nó tự động điều chỉnh đầu ra để đưa hệ thống về trạng thái mong muốn.
Setpoint → [+] → [PID] → [Hệ thống] → Output
[-] ↑
Error Feedback (cảm biến đo)Ba thành phần PID
P — Proportional (Tỉ lệ)
P_out = Kp × errorTỉ lệ với sai số. Kp lớn → phản ứng mạnh nhưng có thể dao động.
I — Integral (Tích phân)
I_out = Ki × ∫error dt (tổng tích lũy của error)Loại bỏ sai số ổn định (steady-state error). Ki lớn → loại sai số nhanh nhưng có thể overshoot.
D — Derivative (Đạo hàm)
D_out = Kd × d(error)/dt (tốc độ thay đổi error)Dự đoán tương lai, "hãm" trước khi về setpoint. Kd lớn → ít dao động nhưng nhạy với nhiễu.
Implement PID trong Arduino
float Kp = 1.0f, Ki = 0.01f, Kd = 0.5f;
float integral = 0.0f;
float prevError = 0.0f;
unsigned long prevTime = 0;
float pid(float setpoint, float measured) {
unsigned long now = millis();
float dt = (now - prevTime) / 1000.0f; // giây
if (dt <= 0) dt = 0.001f;
prevTime = now;
float error = setpoint - measured;
integral += error * dt;
integral = constrain(integral, -100.0f, 100.0f); // anti-windup
float derivative = (error - prevError) / dt;
prevError = error;
return Kp * error + Ki * integral + Kd * derivative;
}Ứng dụng: PID điều khiển nhiệt độ
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(4);
DallasTemperature sensors(&oneWire);
const int HEATER_PIN = 9;
float setpoint = 60.0f; // 60°C
void setup() {
Serial.begin(9600);
sensors.begin();
pinMode(HEATER_PIN, OUTPUT);
}
void loop() {
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
float output = pid(setpoint, temp);
output = constrain(output, 0, 255);
analogWrite(HEATER_PIN, (int)output);
Serial.printf("Setpoint: %.1f | Temp: %.1f | Output: %.0f\n",
setpoint, temp, output);
delay(1000);
}Quy trình tuning PID (Ziegler-Nichols đơn giản hóa)
- Ki=0, Kd=0 — tăng Kp cho đến khi hệ thống dao động liên tục
- Ghi lại Kp_critical và T_oscillation (chu kỳ dao động, giây)
- Cài: Kp = 0.6 × Kp_critical, Ki = 2×Kp/T_osc, Kd = Kp×T_osc/8
- Fine-tune thủ công
Nguyên tắc nhớ:
- Hệ thống phản ứng quá chậm → tăng Kp
- Hệ thống dao động → giảm Kp hoặc tăng Kd
- Sai số ổn định không về 0 → tăng Ki
Gợi ý dùng bài viết trong lớp học
Câu hỏi khởi động
- Linh kiện/kỹ thuật trong bài giải quyết vấn đề gì trong robot thật?
- Nếu nối sai nguồn hoặc đọc sai tín hiệu, robot sẽ biểu hiện như thế nào?
- Có cách nào đo hoặc quan sát hiện tượng thay vì đoán lỗi không?
Hoạt động thực hành nhanh
- Giáo viên cho học viên xem linh kiện hoặc sơ đồ liên quan đến chủ đề Giới thiệu PID cơ bản.
- Học viên dự đoán chân nguồn, chân tín hiệu và dữ liệu đầu ra.
- Chạy code mẫu ở cấu hình an toàn, sau đó thay đổi một tham số.
- Mỗi nhóm ghi nhận lỗi gặp phải và cách kiểm tra theo thứ tự nguồn, GND, tín hiệu, code.
Checklist kỹ thuật
- Luôn kiểm tra điện áp hoạt động trước khi nối với board điều khiển.
- In dữ liệu ra Serial Monitor khi làm việc với cảm biến hoặc thuật toán.
- Với motor/servo, cấp nguồn tải riêng và nối chung GND với board.
- Ghi lại thông số đã calibration để lần sau không phải chỉnh lại từ đầu.
Câu hỏi ôn tập
- Thông số nào quan trọng nhất khi chọn linh kiện này cho robot?
- Lỗi nào dễ xảy ra nhất trong lớp học và cách phát hiện nhanh nhất là gì?
- Có thể mở rộng kiến thức này thành dự án robot nào?
Tài nguyên tải về
Tải bản PDF của bài viết để in giáo án hoặc gửi trước cho học viên.