회로
좋아,이 질문을 보았을 때 여기에 계정을 만들었습니다. 내가 입력 한 오타를 수정할 수 있도록 질문을 편집 할 수 없습니다. 나는 당신이 RE 대신 병렬로 RC 시리즈 회로를 의미한다고 생각합니다 (만약 그것이 있다면, 그것이 의미하는 단서가 없습니다)
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.
(전기 / 전자 엔지니어가 이미지없이 포럼 및 이메일에서 통신하는 데 사용한 방법과 왜 우리가 택배, 고정 폭 글꼴을 좋아하는지 설명하고 싶었 기 때문에 이것을 그려야 겠다는 충동에 저항 할 수 없었습니다.)
시스템의 비례, 적분 및 미분 상수를 원하는 값으로 개별적으로 조정할 수없는 경우 사용하는 회로가 설정하기 쉽지만 수학적으로 매우 복잡하다고 고백해야합니다.
이 소스 의 회로를 사용하여 공부 하는 것이 좋습니다 .
약간 지루한 설정이긴하지만, 이상적인 형태 대신 표준 수학 형태와 직접 연관시킬 수 있으므로 수학적으로 분석하기가 훨씬 간단합니다.
마지막으로 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'는 0이됩니다. 코드에서 지연 기능을 사용하여 루프 주파수를 1KHz로 조정하면 dt는 0.001 초입니다.
C로 그린다
C에서 PID에 대한 이 우수한 코드를 찾았 지만 모든 측면을 다루지는 않지만 그럼에도 불구하고 좋은 코드입니다.
//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 >>> 코드 실행 시간 (보다 훨씬 큼)과 같이 더 낮은 주파수를 사용할 수 있습니다. 이러한 경우 타이머를 없애고 지연 기능을 대신 사용할 수 있습니다.