Cách thực hiện Bộ điều khiển giống như bộ điều chỉnh PID


15

Tôi đang cố gắng viết chương trình vi điều khiển để kiểm soát nhiệt độ trong một hệ thống với các đặc điểm sau:

  • đầu ra chỉ có thể là Bật hoặc Tắt, với tần số chu kỳ cố định (~ 2-10 mỗi giờ)
  • Nhà máy phản ứng chậm (thay đổi nhiệt độ có thể đo được mất nhiều thời gian> 10 phút).
  • Cây mất nhiệt độ dựa trên điều kiện môi trường.
  • điểm đặt có thể thay đổi theo các bước lớn dựa trên nhu cầu của người dùng.

Tôi đang viết một bộ điều khiển nhằm giảm thiểu lỗi, cũng như tuân thủ tỷ lệ chu kỳ được cung cấp làm đầu vào.

Điều này có thể dễ dàng được thực hiện với bộ điều khiển PI và đầu ra của nó được chuyển đổi thành chu kỳ nhiệm vụ. Vấn đề là chương trình cần tự động điều chỉnh và chọn các hằng số Kp, Ki chính xác và thích ứng với các điều kiện môi trường khác nhau và thay đổi công suất sưởi ấm. Do đó, điều chỉnh bộ điều khiển PI trước không quá hữu ích.

Sử dụng PI hoặc PID thực tế không phải là một yêu cầu. Tôi sẵn sàng sử dụng Fuzzy-Logic nếu nó cũng có thuật toán học máy trên chip mô hình hóa phản ứng và mất nhiệt của hệ thống (khoảng tuyến tính) gợi ý thông tin về phản ứng bước đo . Chỉ không biết phải làm gì với thông tin đó.

Một vài bài viết gợi ý tôi có thể sử dụng dữ liệu mô hình hóa để điều chỉnh PI trực tuyến, cũng như hướng dẫn sử dụng trong phòng thí nghiệm gợi ý rằng tôi có thể sử dụng Fuzzy-Logic để điều chỉnh PI.

Câu hỏi của tôi là, cách tiếp cận tốt nhất cho loại kịch bản này là gì (ví dụ: PID, fuzzy-pid, tích chập, v.v.) và làm thế nào để tôi thực sự triển khai nó trong phần mềm / thực hành.

Tôi không phải là EE nên bất kỳ đầu vào nào cũng sẽ được đánh giá cao.


1
Tôi đã viết một câu trả lời về việc sử dụng thuật toán đơn giản để tự động điều chỉnh các bộ điều khiển PID trên Robotics SE có thể được quan tâm.
embed.kyle

@ embed.kyle tuyệt vời, tôi hiểu đơn giản / vĩ đại nhất. Bạn có thể nói những gì anh ấy đã sử dụng cho x1, x2? Tôi gặp rắc rối liên quan đến chúng với các hằng số PID.
MandoMando

1
Đã được một thời gian nhưng tôi tin rằng chúng tôi đã sử dụng một cái gì đó như x1 = P, x2 = I, x3 = D. x0, trọng tâm, là bất cứ điều gì đo lường sự ổn định là quan trọng nhất đối với bạn. Trong ứng dụng của tôi, điều khiển động cơ, chúng tôi có hai vòng. X0 của một là vận tốc và x0 cho một là hiện tại. Xem ở đây để biết thêm.
embed.kyle

@ embed.kyle bạn có phiền khi bình luận của bạn thành một câu trả lời không? thêm bất kỳ thông tin bổ sung nếu bạn muốn. -thx
MandoMando

Một tiền thưởng? Oh Boy! Ngay và luôn.
embed.kyle

Câu trả lời:


7

Tôi sẽ không đi quá xa để gọi là lỗi thời. Nhưng chắc chắn có chỗ để cải thiện. Một cách mà tôi có các vòng điều khiển PID tự động điều chỉnh là sử dụng phương pháp Nelder-Mead , một dạng thuật toán leo đồi đơn giản . Nó có lợi ích là có thể hội tụ và tập hợp lại một tham số đích di chuyển theo thời gian.

Leo đồi phương pháp Nelder-Mead

Từ bài viết này :

Ví dụ: trong trường hợp điều chỉnh tham số PID của chúng tôi {K P , K I , K D }, một đơn giản là tứ diện. NelderTHER Mead tạo ra một vị trí thử nghiệm mới của Simplex bằng cách ngoại suy hành vi của hàm mục tiêu được đo tại mỗi điểm kiểm tra được sắp xếp là đơn giản. Thuật toán sau đó chọn thay thế một trong những điểm kiểm tra này bằng điểm kiểm tra mới và do đó kỹ thuật tiến triển.

Ứng dụng cụ thể của tôi là để điều khiển động cơ. Chúng tôi có hai vòng lặp, vòng điều khiển dòng điện PID và vòng điều khiển vận tốc PI. Chúng tôi đặt các đỉnh của chúng lần lượt là P, I và D và chạy các số liệu thống kê về đầu ra của vòng lặp. Sau đó, chúng tôi đã chạy phản xạ, mở rộng, co lại và giảm đi lặp lại cho đến khi các mục tiêu kiểm soát vận tốc hoặc hiện tại được tạo ra nằm trong một vài độ lệch chuẩn.

Với sản phẩm của chúng tôi, VP rất quan tâm đến việc động cơ "phát ra âm thanh" như thế nào. Và khi nó bật ra, nó "nghe" tốt hơn khi mục tiêu hiện tại nảy hơn một chút so với tối ưu về mặt toán học. Vì vậy, việc điều chỉnh của chúng tôi đã được thực hiện "trực tiếp" ở chỗ chúng tôi cho phép thuật toán tìm kiếm trong khi động cơ đang chạy để nhận thức của người dùng về âm thanh động cơ cũng được tính đến. Sau khi chúng tôi tìm thấy các tham số mà chúng tôi thích, chúng được mã hóa cứng và không thay đổi.

Điều này có thể không lý tưởng cho bạn vì bạn nêu rõ, "đưa hệ thống vào dao động ngay cả khi một phần của điều chỉnh tự động không được người dùng chấp nhận". Hệ thống của chúng tôi chắc chắn sẽ dao động và làm những điều khủng khiếp khác trong khi nó tự động điều chỉnh.

Tuy nhiên, bạn có thể chạy hai bản sao của bộ điều khiển PID. Một trong đó là "sống" và thực sự kiểm soát quá trình. Và một giây liên tục được điều chỉnh tự động trong khi được cung cấp cùng một đầu vào như bộ điều khiển "trực tiếp". Khi đầu ra của bộ điều khiển tự động điều chỉnh trở nên "tốt hơn" hoặc ổn định hơn, bạn có thể trao đổi các hệ số thành bộ điều khiển "trực tiếp". Bộ điều khiển sau đó sẽ thực hiện chỉnh sửa cho quá trình cho đến khi đạt được hiệu suất mong muốn. Điều này sẽ ngăn chặn các dao động mà người dùng có thể cảm nhận được trong quá trình điều chỉnh tự động. Nhưng nếu các đầu vào thay đổi mạnh mẽ và bộ điều khiển PID không còn tối ưu nữa, thì tự động điều chỉnh có thể trao đổi theo các hệ số mới khi chúng có sẵn.


Phương thức NM không yêu cầu chạy các điểm hoang dã của nó trên hàm mục tiêu (tức là thế giới thực của người dùng). Tuy nhiên, tôi tin rằng một mô hình thô (trạng thái không gian?) Có thể được xây dựng trên chính bộ điều khiển vi mô dựa trên các phép đo cảm biến. Sau đó, nó sẽ chạy bộ điều khiển PI 'bóng' được đề xuất của bạn khi nó tối ưu hóa. Tôi không chắc chắn về việc giết quá mức này vì có thể điều chỉnh PI thành một cài đặt đã biết và sau đó chia tỷ lệ Kp và Ki dựa trên kết quả đọc cảm biến và phản ứng của hệ thống. Dù bằng cách nào, cũng được thực hiện thưa ông.
MandoMando

@MandoMando Cảm ơn bạn rất nhiều! Và tôi thực sự thích thuật ngữ PI 'bóng tối'.
embed.kyle

3

Bộ điều khiển PID rất hữu ích trong các tình huống trong đó hành vi của hệ thống được điều khiển có thể được tính gần đúng một cách hợp lý là tổng của kích thích điều khiển, tích phân của kích thích điều khiển và tích phân của tích phân đầu tiên đó. Một số hệ thống kiểm soát nhiệt độ có thể đáp ứng tiêu chí như vậy, nếu có một vật thể được đốt nóng đồng đều bởi kích thích và nếu vật thể đó truyền nhiệt đều cho một số vật thể khác với tỷ lệ chênh lệch nhiệt độ giữa chúng. Ví dụ, vật thể thứ nhất có thể là một bộ phận làm nóng và vật thể thứ hai có thể là không khí lưu thông trong phòng, nếu có đủ lưu thông không khí để không khí được coi là có nhiệt độ đồng nhất. Đối với các mô hình nhiệt phức tạp hơn thế (ví dụ: các mô hình có thể liên quan đến độ dốc nhiệt trong môi trường rắn),

Tôi sẽ đề xuất rằng một cách tiếp cận tốt có thể là có bộ điều khiển, khi bật máy sưởi, liên tục ước tính mức độ nóng của thiết bị sẽ được điều chỉnh nếu đầu ra bị tắt ngay lập tức và nhiệt độ sẽ tắt đi nếu Máy sưởi đã được bật ngay sau khi được phép. Đồng thời ước tính những giá trị đó sẽ là gì nếu lò sưởi còn lại trong một giây, hai giây, ba giây, v.v. Tắt lò sưởi khi những giá trị đó tốt như chúng sẽ nhận được. Sau đó, khi máy sưởi tắt, bắt đầu thực hiện các tính toán tương tự, nhưng hoán đổi vai trò của bật / tắt, nóng / lạnh, v.v., để quyết định khi nào bật lại. Tùy thuộc vào hành vi nhiệt của hệ thống, có thể cần phải sử dụng chiến lược nhìn về phía trước 'tối thiểu / tối đa' để nhìn về phía trước một hoặc hai bước.


1

Có thể thay đổi trạng thái của điều khiển (bật hoặc tắt) 2-10 lần mỗi giờ không cho phép điều khiển chu kỳ nhiệm vụ. Đầu ra của vòng lặp PI sẽ là tín hiệu điều khiển có độ lớn thay đổi theo chức năng của lỗi và nhà máy của bạn chỉ có thể chấp nhận đầu vào nhị phân (tắt hoặc bật), vì 'tần số' của điều khiển chu kỳ nhiệm vụ có thể được chấp nhận là một phần của hertz.

Bạn có thể muốn đơn giản hóa mọi thứ và đi với kiểm soát kích động:

  • hệ thống bật khi nhiệt độ vượt qua giới hạn thấp hơn
  • hệ thống tắt khi nhiệt độ vượt quá giới hạn trên
  • có đủ khoảng cách giữa giới hạn trên và dưới để ngăn chặn đầu ra điều khiển

ý tưởng là lấy đầu ra PI cho biết: 60% và chuyển đổi thành đúng giờ = 60% chu kỳ -> 0,6 x 30 phút -> 18 phút và tắt 12 phút trong chu kỳ 30 phút. bộ điều khiển bang-bang mà bạn đề xuất không đảm bảo duy trì tốc độ chu kỳ cần thiết (giả sử bật, không quá n lần mỗi giờ) và giữ lỗi thấp cùng một lúc. hệ thống có thể tạm thời bị quá tải trong một khoảng thời gian để cân bằng tổn thất trong thời gian nghỉ.
MandoMando

1

Một cách điển hình (mặc dù thừa nhận đơn giản để làm điều này) được gọi là lập kế hoạch đạt được. Đó là một cách tiếp cận cổ điển để kiểm soát phi tuyến tính khi bạn có một biến (hoặc biến) có thể quan sát được mà hệ thống của bạn thay đổi theo (tham số lập lịch). Trong hệ thống của bạn, biến đó rất có thể là nhiệt độ. Ý tưởng là bạn tạo một danh sách các mức tăng của bộ điều khiển ở các giá trị khác nhau của tham số lập lịch (nhiệt độ) và khi tham số lập lịch thay đổi, bạn sử dụng các mức tăng đó trong bộ điều khiển của mình (có thể là PI, PID, phản hồi trạng thái hoặc bất cứ điều gì). Nếu điều này nghe có vẻ đơn giản, thì đó là vì nó là. Tuy nhiên, nó hoạt động và được sử dụng trong một số hệ thống rất phức tạp.

Nếu bạn muốn có được sự ưa thích, bạn có thể thực hiện một thuật toán học máy để tạo ma trận khuếch đại của bạn. Điều này sẽ dẫn đến bộ điều khiển phát triển và học tập mà bạn dường như đang mô tả. Tuy nhiên, nó có thể là quá mức nếu hệ thống có thể được mô tả đầy đủ.

Chỉnh sửa: Xin lỗi, tôi đọc sai một chút. Bạn đang cố gắng kiểm soát nhiệt độ để "điều kiện môi trường" bạn nói đến sẽ là thông số lập lịch của bạn.


0

Bạn có thể sử dụng bộ điều khiển Recursive Least Squares đầy đủ, cf Astrom và Wittenmark , Điều khiển thích ứng, nhưng tôi không biết liệu vi điều khiển có đủ sức để làm điều này không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.