lập trình các vòng lặp PID trong C


11

Tôi là một kỹ sư điện đã bị đẩy vào thế giới kỹ thuật số và học hỏi khi tôi đi. Tôi đang lập trình một bộ xử lý TI để thực hiện một vòng lặp PID (tỷ lệ tích phân-tích phân) , được minh họa bằng sơ đồ này:

Hình ảnh vòng lặp PID từ Wikipedia

Tôi cũng sẽ mô tả nó:

Phản hồi tiêu cực op-amp, với thiết bị đầu cuối không đảo ngược được nối đất. Đầu vào thông qua thiết bị đầu cuối âm. Vòng phản hồi là một mạch sê-ri RE song song với điện trở và tất cả các mạch song song với nắp.

Bất cứ ai có bất kỳ ý tưởng làm thế nào để chuyển đổi mạch này sang mã C? Tôi hơi lạc lõng với yếu tố này và có thể sử dụng trợ giúp.


Bạn có thể liên kết đến một hình ảnh và ai đó sẽ giúp chuyển đổi liên kết đó thành một hình ảnh thực tế cho bạn.
Joachim Sauer

2
Liên kết mà bạn tự đăng cung cấp một mã giả cơ bản để đi về nó. Nếu bạn không nhớ C #, đây là một ví dụ về vòng lặp pid trong C # .
Neil

1
Neil nói đúng. Tôi đã thực hiện gần như chính xác vòng lặp đó trong C trên TI. Một gợi ý: sử dụng vòng lặp thời gian không đổi và tính hệ số cố định dtvào các hằng số, thay vì thực hiện các phép chia và nhân bổ sung trong vòng lặp.
AShelly

1
@Neil đó là một liên kết mà tôi đã thêm vào trong phiên bản 2 vì tôi không biết vòng lặp PID là gì và tôi nghi ngờ nhiều người khác cũng không biết.

@MichaelT, ah tôi xin lỗi rồi.
Neil

Câu trả lời:


18

Mạch

Ok tôi vừa tạo một tài khoản ở đây khi tôi thấy câu hỏi này. Tôi không thể chỉnh sửa câu hỏi của bạn để tôi có thể sửa lỗi chính tả bạn đã làm. Tôi tin rằng bạn có nghĩa là mạch RC song song thay vì RE (nếu có, tôi không có một manh mối nào về ý nghĩa của nó)

Có vẻ như mạch tương tự bạn muốn mô phỏng bằng C trông giống như thế này

                         Ci
                  |------| |--------------|
                  |           Rp          |
                  |----/\/\/\/\-----------|
                  |          Rd    Cd     |
           Rf     |----/\/\/\---| |-------|
Vin o----/\/\/\---|                       |
                  |    |\                 |
                  |    | \                |
                  |----|- \               | 
                       |   \              |
                       |    \-------------|---------o  Vout
                       |    /
                       |   /
                       |+ /
                   ----| /
                  |    |/
                  |
                  |
               ___|___ GND
                _____
                 ___
                  _

LEGEND:
  Vin is the input signal.
  Vout is the Output.
  Rp controls the propotional term ( P in PID) 
  Ci controls the Integral term ( I id PID)
  Rd and Cd controls the differential term ( D in PID)
  Rf is the gain control, which is common to all of the above controllers.

.

Tôi phải thú nhận rằng mạch bạn đang sử dụng rất đơn giản để thiết lập nhưng rất phức tạp về mặt toán học, khi nói đến việc điều chỉnh các hằng số Propotional, Integral và Derivative của hệ thống thành một giá trị mong muốn riêng lẻ.

Tôi thực sự khuyên bạn nên sử dụng mạch từ nguồn này để nghiên cứu.

Mặc dù có một chút tẻ nhạt để thiết lập, nhưng về mặt toán học, việc phân tích đơn giản hơn nhiều vì bạn có thể liên hệ trực tiếp với dạng toán học tiêu chuẩn thay vì dạng lý tưởng.

Cuối cùng, Vout sẽ điều khiển một động cơ hoặc bất cứ thứ gì cần điều khiển. Và Vin là điện áp biến quá trình.

Trước khi bị ướt chân ở C (biển?)

Tôi giả sử bạn đang đọc các tín hiệu từ một số loại tương tự sang bộ chuyển đổi kỹ thuật số. Nếu không thì bạn sẽ phải mô phỏng tín hiệu làm đầu vào.

Nếu sử dụng mẫu Tiêu chuẩn, chúng tôi có

Giả sử thời gian chạy vòng lặp đủ nhỏ (một quá trình chậm), chúng ta có thể sử dụng hàm sau để tính toán đầu ra,

output = Kp * err + (Ki * int * dt) + (Kd * der /dt);

Ở đâu

Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int  = int from previous loop + err; ( i.e. integral error )
der  = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.

trong đó ban đầu 'der' và 'int' sẽ bằng không. Nếu bạn sử dụng hàm trì hoãn trong mã để điều chỉnh tần số vòng lặp để nói 1 KHz thì dt của bạn sẽ là 0,001 giây.

Vẽ trong C

Tôi đã tìm thấy mã tuyệt vời này cho PID trong C, mặc dù nó không bao gồm mọi khía cạnh của nó, dù sao nó cũng là một mã tốt.

//get value of setpoint from user
while(1){
  // reset Timer
  // write code to escape loop on receiving a keyboard interrupt.
  // read the value of Vin from ADC ( Analogue to digital converter).
  // Calculate the output using the formula discussed previously.
  // Apply the calculated outpout to DAC ( digital to analogue converter).
  // wait till the Timer reach 'dt' seconds.
}

Nếu chúng ta thực hiện một quy trình chậm, thì chúng ta có thể sử dụng tần số thấp hơn sao cho thời gian thực thi mã dt >>> cho vòng lặp đơn (lớn hơn nhiều so với). Trong những trường hợp như vậy, chúng ta có thể loại bỏ bộ đếm thời gian và sử dụng chức năng trì hoãn thay thế.


6
Sơ đồ Ascii đã thổi vào tâm trí của tôi. +1
l46kok

1
liên kết "nguồn này" không hoạt động
Ccr

Tôi rất tiếc khi biết rằng, một tài nguyên tốt đã bị mất :(. Khái niệm này đã được giải thích trong mã ví dụ vòng lặp while mà tôi đã chia sẻ. Tôi không có kinh nghiệm về cách xử lý tình huống này, có thể một số biên tập viên có thể khắc phục thông điệp thích hợp. (liên kết chết)
D34dman

2
"Nguồn này" bị thiếu có thể có sẵn ở đây: learnypedia.karadimov.info/l Library / piddocs.pdf
David Suarez
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.