ไมโครคอนโทรลเลอร์ใช้การควบคุม PID อย่างไร?

Jul 23, 2026 ฝากข้อความ

ปัจจุบันอัลกอริธึมควบคุม PID เป็นหนึ่งในอัลกอริธึมควบคุมที่ใช้กันอย่างแพร่หลายที่สุด การควบคุม PID มีข้อดีต่างๆ เช่น พารามิเตอร์ที่ปรับได้ การใช้งานที่หลากหลาย และความแม่นยำในการควบคุมสูง ในทางวิศวกรรมเชิงปฏิบัติ อัลกอริธึม PID สามารถนำไปใช้กับสาขาต่างๆ ได้ รวมถึงการควบคุมระบบเครื่องกลไฟฟ้า ระบบอัตโนมัติทางอุตสาหกรรม หุ่นยนต์ และการควบคุมไมโครโปรเซสเซอร์


พารามิเตอร์ทั้งสามของอัลกอริทึม PID ได้แก่ Kp อัตราขยายตามสัดส่วน ค่าคงที่เวลาอินทิกรัล Ti และค่าคงที่เวลาอนุพันธ์ Td ระบบที่ต่างกันต้องการพารามิเตอร์ PID ที่แตกต่างกัน และโดยทั่วไปแล้วพารามิเตอร์ที่เหมาะสมที่สุดจะได้มาจากการทดลองและการดีบัก ค่าคงที่ตามสัดส่วน Kp จะปรับอัตราขยายตามสัดส่วน โดยควบคุมอัตราส่วนของเอาท์พุตของระบบต่อข้อผิดพลาดป้อนกลับระหว่างการทำงาน ค่าคงที่เวลาอินทิกรัล Ti จะปรับเกนอินทิกรัลควบคุมการสะสมของข้อผิดพลาดระหว่างการทำงานของระบบ และค่าคงที่เวลาของอนุพันธ์ Td จะปรับค่าเกนของอนุพันธ์เพื่อควบคุมอัตราการเปลี่ยนแปลงข้อผิดพลาดในระบบควบคุม


แนวทางการนำอัลกอริธึม PID ไปใช้บนไมโครคอนโทรลเลอร์คืออะไร?


หากต้องการใช้อัลกอริธึมควบคุม PID บนไมโครคอนโทรลเลอร์ วิธีการทั่วไปมีดังนี้:

1. **กำหนดพารามิเตอร์ PID**:

- เลือกอัตราขยายตามสัดส่วนที่เหมาะสม (Kp) เวลาอินทิกรัล (Ti) และเวลาอนุพันธ์ (Td) ตามคุณลักษณะและข้อกำหนดของวัตถุควบคุมจริง


2. **การได้มาซึ่งข้อมูลเซ็นเซอร์**:

- ใช้เซ็นเซอร์ที่เหมาะสม (เช่น เซ็นเซอร์อุณหภูมิ เซ็นเซอร์ตำแหน่ง ฯลฯ) เพื่อรับ-ข้อมูลป้อนกลับตามเวลาจริงจากวัตถุที่ถูกควบคุม


3. **การเปรียบเทียบค่าเซ็ตพอยต์และค่าป้อนกลับ**:

- เปรียบเทียบเซ็ตพอยต์ (ค่าที่ต้องการ) กับค่าป้อนกลับเพื่อคำนวณข้อผิดพลาด (ข้อผิดพลาด)


4. **การคำนวณ PID**:

- คำนวณตัวแปรควบคุม (เอาต์พุต) โดยใช้สูตรอัลกอริทึม PID: PID=Kp * Error + Ki * ∫ Error dt + Kd * d(Error)/dt.

- Kp, Ki และ Kd เป็นพารามิเตอร์ PID ข้อผิดพลาดคือค่าความผิดพลาด ∫ ข้อผิดพลาด dt แสดงถึงพจน์อินทิกรัล และ d(Error)/dt แทนคำอนุพันธ์


5. **ข้อจำกัด** (ไม่บังคับ):

- สำหรับบางแอปพลิเคชัน อาจจำเป็นต้องจำกัดช่วงของค่าเอาท์พุตเพื่อป้องกันไม่ให้เกินช่วงที่ยอมรับได้ของออบเจ็กต์ควบคุม


6. **สัญญาณควบคุมเอาต์พุต**:

- ตัวแปรควบคุมที่คำนวณได้ถูกใช้เป็นสัญญาณควบคุมและส่งไปยังแอคชูเอเตอร์ (เช่น มอเตอร์หรือวาล์ว) เพื่อควบคุมและควบคุมวัตถุที่ถูกควบคุม


7. **ตั้งค่าความถี่ควบคุม**:

- กำหนดความถี่การควบคุมที่เหมาะสม-รอบการทำงานของอัลกอริทึมการควบคุม-โดยอิงตามข้อกำหนดเฉพาะของแอปพลิเคชัน


8. **ทำซ้ำอัลกอริทึม PID**:

- ในลูปเวลาจริง- ให้ดำเนินการตามขั้นตอนข้างต้นซ้ำๆ เพื่อตรวจสอบค่าป้อนกลับอย่างต่อเนื่อง คำนวณตัวแปรควบคุม และส่งสัญญาณควบคุมออกเพื่อให้ได้การควบคุมระบบที่เสถียร


ในการเขียนโปรแกรมไมโครคอนโทรลเลอร์จริง คุณสามารถเลือกเครื่องมือการพัฒนาและภาษาการเขียนโปรแกรมที่เหมาะสม (เช่น ภาษา C หรือภาษาแอสเซมบลี) ตามโมเดลไมโครคอนโทรลเลอร์และแพลตฟอร์มการพัฒนาเฉพาะ ควรสังเกตว่าในการใช้งานจริง มีเทคนิคมากมายในการเพิ่มประสิทธิภาพและปรับปรุงอัลกอริทึม PID เช่น การแยกแบบอินทิกรัลและ PID แบบปรับตัว ซึ่งสามารถวิจัยและนำไปใช้เพิ่มเติมได้ตามความต้องการเฉพาะ

 

หลักการและการทำงานของตัวควบคุม PID


ตัวควบคุม PID ประกอบด้วยองค์ประกอบ 3 ส่วน ได้แก่ สัดส่วน (P) อินทิกรัล (I) และอนุพันธ์ (D) สร้างเอาต์พุตควบคุมโดยการประมวลผลข้อผิดพลาด ความเบี่ยงเบน และอัตราการเปลี่ยนแปลงของระบบ การดำเนินการเกี่ยวข้องกับขั้นตอนต่อไปนี้:


- รับค่าเซ็ตพอยต์และค่าป้อนกลับ

- คำนวณข้อผิดพลาด

- คำนวณเอาต์พุตควบคุมโดยพิจารณาจากอัตราขยายตามสัดส่วน เทอมอินทิกรัล และเทอมอนุพันธ์

- อัปเดตพารามิเตอร์คอนโทรลเลอร์

- เอาท์พุตสัญญาณควบคุม


การใช้โค้ด STM32

 

ต่อไปนี้คือโค้ดตัวอย่างสำหรับการออกแบบและการใช้งานคอนโทรลเลอร์ PID โดยใช้ไมโครคอนโทรลเลอร์ STM32:

```c

#รวม"stm32f4xx.h"

// กำหนดพารามิเตอร์คอนโทรลเลอร์ PID

ลอย Kp=0.5; // กำไรตามสัดส่วน

ลอยกี่=0.2; // กำไรที่เป็นอินทิกรัล

ลอย Kd=0.1; // กำไรจากอนุพันธ์

// กำหนดตัวแปรหน่วยเก็บข้อมูล

จุดกำหนดลอย=50.0; //เซ็ตพอยต์

ข้อเสนอแนะแบบลอยตัว=0.0; // ค่าตอบรับ

ข้อผิดพลาดลอยตัว=0.0; // ข้อผิดพลาด

ลอยlast_error=0.0; // ข้อผิดพลาดก่อนหน้า

อินทิกรัลลอย=0.0; // เทอมอินทิกรัล

// ฟังก์ชั่นการคำนวณเอาต์พุตคอนโทรลเลอร์ PID

float pidController (ลอย dt)

{

// คำนวณข้อผิดพลาด

ข้อผิดพลาด=จุดกำหนด - ข้อเสนอแนะ;

// คำนวณเทอมอินทิกรัล

อินทิกรัล += ข้อผิดพลาด * dt;

// คำนวณเทอมอนุพันธ์

อนุพันธ์ลอยตัว=(ข้อผิดพลาด - Last_error) / dt;

// คำนวณเอาต์พุตควบคุม

เอาต์พุตลอยตัว=Kp * ข้อผิดพลาด + Ki * อินทิกรัล + Kd * อนุพันธ์;

// อัปเดตข้อผิดพลาดก่อนหน้า

Last_error=ข้อผิดพลาด;

เอาท์พุทกลับ;

}

int main (เป็นโมฆะ)

{

ในขณะที่ (1)

{

// รับค่าผลตอบรับ

// กำหนดช่วงเวลา

// คำนวณเอาต์พุต PID

ลอย dt=0.01; // ในตัวอย่างนี้ ช่วงเวลาคือ 0.01 วินาที

float control_output=pidController (dt);

// ส่งสัญญาณควบคุม

// หน่วงเวลาเป็นระยะเวลาหนึ่ง

สำหรับ (int i=0; i < 10000; i++);

}

กลับ 0;

}

ส่งคำถาม

whatsapp

โทรศัพท์

อีเมล

สอบถาม