Obwód
Ok, właśnie utworzyłem tutaj konto, kiedy zobaczyłem to pytanie. Nie jestem w stanie edytować Twojego pytania, bym mógł poprawić literówkę, którą zrobiłeś. Myślę, że miałeś na myśli obwód serii RC równolegle zamiast RE (jeśli tak, to nie mam pojęcia, co to znaczy)
Wygląda na to, że obwód analogowy, który chcesz symulować za pomocą C, wygląda mniej więcej tak
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.
(Nie mogłem się oprzeć mojej potrzebie narysowania tego, ponieważ chciałem powiedzieć, jak inżynierowie elektrycy / elektronicy komunikowali się na forach i wiadomościach e-mail bez zdjęć ... i dlaczego po prostu kochamy kuriera, czcionka o stałej szerokości)
Muszę wyznać, że obwód, którego używasz, jest prosty do skonfigurowania, ale jest bardzo złożony matematycznie, jeśli chodzi o dostrojenie stałych propotionalnych, całkowych i pochodnych systemu do pożądanej wartości indywidualnie, nie jest to możliwe.
Zdecydowanie sugeruję użycie obwodu z tego źródła do nauki.
Chociaż konfiguracja jest trochę uciążliwa, matematycznie jest o wiele łatwiej ją analizować, ponieważ można bezpośrednio odnieść ją do standardowej formy matematycznej zamiast idealnej.
Na koniec Vout kontroluje silnik lub cokolwiek, co wymaga kontroli. A Vin jest zmiennym napięciem procesowym.
Przed zmoczeniem stóp w C (morze?)
Zakładam, że odczytujesz sygnały z jakiegoś przetwornika analogowo-cyfrowego. Jeśli nie, musisz zasymulować sygnał jako wejście.
Jeśli korzystamy ze standardowego formularza, mamy,
Zakładając, że czas działania pętli jest wystarczająco mały (wolny proces), możemy użyć następującej funkcji do obliczenia wyniku,
output = Kp * err + (Ki * int * dt) + (Kd * der /dt);
gdzie
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.
gdzie początkowo „der” i „int” wynosi zero. Jeśli użyjesz funkcji opóźnienia w kodzie, aby dostroić częstotliwość pętli do 1 KHz, wtedy dt wyniesie 0,001 sekundy.
Rysowanie w C
Znalazłem ten doskonały kod dla PID w C, chociaż nie obejmuje on wszystkich jego aspektów, mimo to jest dobry.
//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.
}
Jeśli weźmiemy wolny proces, możemy użyć niższej częstotliwości, aby czas wykonania kodu dt >>> dla pojedynczej pętli (znacznie większy niż). W takich przypadkach możemy zrezygnować z timera i zamiast tego użyć funkcji opóźnienia.