วงจร
ตกลงฉันเพิ่งสร้างบัญชีที่นี่เมื่อฉันเห็นคำถามนี้ ฉันไม่สามารถแก้ไขคำถามของคุณเพื่อที่ฉันจะได้แก้ไขข้อผิดพลาดที่คุณทำ ฉันเชื่อว่าคุณหมายถึงวงจรซีรีย์ RC ขนานแทนที่จะเป็น RE (ถ้าใช่ฉันไม่มีเงื่อนงำเดียวว่ามันหมายถึงอะไร)
ดูเหมือนว่าวงจรอะนาล็อกที่คุณต้องการจำลองโดยใช้ C มีลักษณะเช่นนี้
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.
(ฉันอดไม่ได้ที่จะวาดสิ่งนี้เพราะฉันอยากจะบอกคุณว่าวิศวกรไฟฟ้า / อิเล็กทรอนิกส์ใช้ในการสื่อสารในฟอรัมและอีเมลโดยไม่มีภาพ ... และทำไมเราถึงรักผู้จัดส่งแบบอักษรความกว้างคงที่)
ฉันต้องยอมรับว่าวงจรที่คุณใช้นั้นง่ายต่อการติดตั้ง แต่มีความซับซ้อนทางด้านคณิตศาสตร์เมื่อพูดถึงการปรับค่าคงที่ Propotional, Integral และ Derivative ของระบบให้เป็นค่าที่ต้องการแยกกันไม่ได้
ฉันขอแนะนำให้คุณใช้วงจรจากแหล่งนี้เพื่อศึกษา
แม้ว่าการตั้งค่าเล็กน้อยน่าเบื่อ แต่ในทางคณิตศาสตร์มันง่ายกว่ามากในการวิเคราะห์ในขณะที่คุณสามารถเชื่อมโยงโดยตรงกับแบบฟอร์มมาตรฐานทางคณิตศาสตร์แทนที่จะเป็นแบบอุดมคติ
ในที่สุด Vout ก็จะควบคุมมอเตอร์หรืออะไรก็ตามที่จำเป็นต้องควบคุม และ Vin คือแรงดันไฟฟ้าแบบผันแปรของกระบวนการ
ก่อนทำให้เท้าเปียกใน C (ทะเล?)
ฉันถือว่าคุณกำลังอ่านสัญญาณจากอะนาล็อกบางตัวถึงตัวแปลงสัญญาณดิจิตอล ถ้าไม่เช่นนั้นคุณจะต้องจำลองสัญญาณเป็นอินพุต
หากใช้แบบฟอร์มมาตรฐานเรามี
สมมติว่าเวลาที่ใช้ลูปมีขนาดเล็กพอ (เป็นกระบวนการที่ช้า) เราสามารถใช้ฟังก์ชันต่อไปนี้สำหรับการคำนวณเอาต์พุต
output = Kp * err + (Ki * int * dt) + (Kd * der /dt);
ที่ไหน
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.
โดยเริ่มต้น 'der' และ 'int' จะเป็นศูนย์ หากคุณใช้ฟังก์ชั่นการหน่วงเวลาในโค้ดเพื่อปรับความถี่การวนซ้ำเพื่อบอกว่า 1 KHz ดังนั้น dt ของคุณจะเป็น 0.001 วินาที
การเขียนแบบ C
ฉันพบนี้รหัสที่ยอดเยี่ยมสำหรับ PID ใน C แม้ว่ามันจะไม่ครอบคลุมทุกแง่มุมของมันหนึ่งที่ดี แต่อย่างไรก็ตาม
//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.
}
หากเราใช้กระบวนการที่ช้าแล้วเราสามารถใช้ความถี่ที่ต่ำกว่าเช่นเวลาการเรียกใช้โค้ด dt >>> สำหรับลูปเดี่ยว (ไกลยิ่งกว่า) ในกรณีเช่นนี้เราสามารถทำได้ด้วยตัวจับเวลาและใช้ฟังก์ชั่นการหน่วงเวลาแทน