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ế.