C에서 PID 루프 프로그래밍


11

저는 디지털 세상에 푹 빠져 나 가면서 배우는 전기 기술자입니다. 이 다이어그램에 표시된 것처럼 PID (proportional-integral-derivative) 루프 를 수행하도록 TI 프로세서를 프로그래밍하고 있습니다 .

Wikipedia의 PID 루프 이미지

나는 또한 그것을 설명 할 것이다 :

비 반전 단자가 접지 된 네거티브 피드백 연산 증폭기. 음극 단자를 통해 입력합니다. 피드백 루프는 저항과 병렬로 연결된 RE 시리즈 회로이며 모두 캡과 병렬로 연결됩니다.

이 회로를 C 코드로 변환하는 방법을 아는 사람이 있습니까? 나는 이것에 대해 내 요소가 약간 없어서 도움을 사용할 수 있습니다.


당신은 할 수 링크 사진과 사람이 유용하게 당신을 위해 실제 그림으로 링크를 변환합니다.
Joachim Sauer

2
직접 게시 한 링크는 관련 의사 코드를 제공합니다. C #을 신경 쓰지 않으면 C # 의 pid 루프 예가 있습니다.
Neil

1
닐이 맞아 TI의 C에서 거의 정확하게 루프를 구현했습니다. 한 가지 힌트 : 상수 시간 루프를 사용하고 루프에서 dt추가 나누기 및 곱하기를 수행하는 대신 상수에 고정 을 고려하십시오 .
AShelly February

1
@Neil 은 PID 루프가 무엇인지 몰랐고 다른 많은 사람들도 그렇지 않은 것으로 의심했기 때문에 개정 2 에서 추가 한 링크 였습니다.

@MichaelT, 아 내 사과드립니다.
Neil

답변:


18

회로

좋아,이 질문을 보았을 때 여기에 계정을 만들었습니다. 내가 입력 한 오타를 수정할 수 있도록 질문을 편집 할 수 없습니다. 나는 당신이 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 >>> 코드 실행 시간 (보다 훨씬 큼)과 같이 더 낮은 주파수를 사용할 수 있습니다. 이러한 경우 타이머를 없애고 지연 기능을 대신 사용할 수 있습니다.


6
Ascii Diagram은 제 생각을 불었습니다. +1
l46kok

1
링크 "이 출처"가 작동하지 않습니다
Ccr

오, 유감스럽게도, 좋은 리소스를 잃어 버렸습니다. (. 글쎄, 개념은 내가 공유 한 while 루프 예제 코드에 설명되어 있습니다. 적절한 메시지. (죽은 연결)
D34dman

2
누락 된 "이 소스"는 여기에서 볼 수 있습니다 : educypedia.karadimov.info/library/piddocs.pdf
David Suarez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.