Devre
Tamam, bu soruyu gördüğümde burada bir hesap oluşturdum. Yaptığınız yazım hatasını düzeltebilmeniz için sorunuzu düzenleyemiyorum. RE yerine paralel olarak RC serisi devre demek istediğinize inanıyorum (eğer öyleyse, ne anlama geldiğini bilmiyorum)
C kullanarak benzetim yapmak istediğiniz analog devre gibi görünüyor
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.
(Elektrik / elektronik mühendislerinin resimler olmadan forumlarda ve e-postalarda nasıl iletişim kurduğunu ve neden sadece kurye, sabit genişlikli yazı tipini sevdiğimizi söylemek istediğim için bunu çizme isteğime dayanamadım)
İtiraf etmeliyim ki, kullandığınız devrenin kurulumu basittir, ancak sistemin Eğik, İntegral ve Türev sabitlerini bireysel olarak istenen bir değere ayarlamak mümkün olmadığında matematiksel olarak çok karmaşıktır.
Bu kaynaktan gelen devreyi çalışmak için kullanmanızı şiddetle tavsiye ediyorum .
Kurmak biraz sıkıcı olsa da, matematiksel olarak analiz etmek çok daha basittir, çünkü onu ideal bir form yerine standart matematiksel formla doğrudan ilişkilendirebilirsiniz.
Son olarak Vout bir motoru veya kontrol edilmesi gereken her şeyi kontrol etmeye gider. Ve Vin, Proses değişken voltajıdır.
C (deniz?)
Bir çeşit analogdan dijital dönüştürücüye sinyalleri okuduğunuzu varsayıyorum. Değilse, sinyali bir giriş olarak simüle etmeniz gerekir.
Standart formumuz varsa,
Döngü çalışma süresinin yeterince küçük olduğunu varsayarak (yavaş bir işlem), çıktıyı hesaplamak için aşağıdaki işlevi kullanabiliriz,
output = Kp * err + (Ki * int * dt) + (Kd * der /dt);
nerede
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.
başlangıçta 'der' ve 'int' sıfır olur. Döngü frekansını 1 KHz olarak ayarlamak için kodda bir gecikme fonksiyonu kullanırsanız, dt'niz 0.001 saniye olacaktır.
C ile çizilmiş
Her yönünü kapsamıyor olsa da, C PID için bu mükemmel kodu buldum , yine de iyi bir tane.
//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.
}
Yavaş bir süreç alırsak, tek döngü için dt >>> kod yürütme süresi (çok daha büyük) olacak şekilde daha düşük frekans kullanabiliriz. Bu gibi durumlarda zamanlayıcıyı ortadan kaldırabilir ve bunun yerine bir gecikme fonksiyonu kullanabiliriz.