Arrow Electronic Components Online

PID 컨트롤러 기본 사항 및 튜토리얼: Arduino에서 PID 구현

Arduino01 11월 2023
더 똑똑하고 안전한 자동차 연결 솔루션
AuthorJeremy S Cook
모든 기사 보기

산업 제어 분야에서 일하는 사람들에게는 비례, 적분, 미분(PID) 이론이 아마도 익숙한 개념일 것입니다. 대부분의 사람들에게 이 용어는 완전히 낯설지만, 생각보다 더 익숙할지 모릅니다. 자동차에서 가속 페달을 밟을 때 이상적인 속도에서 얼마나 떨어져 있는지를 고려하는 것뿐만 아니라—PID의 비례 부분—특정 차량의 가속 방식과 언덕과 같은 조건도 고려합니다.
 
산업 제어 분야에서 일하는 사람들에게는 비례, 적분, 미분(PID) 이론이 아마도 익숙한 개념일 것입니다. 대부분의 사람들에게 이 용어는 완전히 낯설지만, 생각보다 더 익숙할지 모릅니다. 자동차에서 가속 페달을 밟을 때 이상적인 속도에서 얼마나 떨어져 있는지를 고려하는 것뿐만 아니라—PID의 비례 부분—특정 차량의 가속 방식과 언덕과 같은 조건도 고려합니다.
 
이 subtler한 효과들이 수학적으로 I와 D 용어가 고려하는 것입니다. 이 예에서는 자동차 속도가 상한과 하한 사이에서 튕기지 않도록 하고, 동일한 개념을 다양한 제어 상황에 적용할 수 있습니다. 제한 기반 제어는 대강의 목표를 달성할 수 있게 해 주지만, 시스템이 다소 불규칙하게 작동하는 경향이 있습니다.

PID 방정식

PID 제어는 다음 방정식을 통해 수학적으로 표현할 수 있습니다. P, I, D는 여기에서 더해지는 세 항으로 나타냅니다. Kp, Ki, Kd는 각 요소에 대한 시스템 반응을 조정하는 상수입니다:

PID Equation

Ki와 Kd를 각각 1/Ti와 Td로 바꿀 수도 있습니다. 이 변경은 방정식이 물리적 의미와 더 잘 연결되도록 하고, 단위를 단위 없는 숫자로 적절하게 맞출 수 있습니다:

PID Equation Replacement

우리는 또한 Kp 값을 추출하여 전체 방정식에 적용하는 것으로 알려진 표준 형태로 방정식을 변형할 수 있습니다. 이 형태의 한 가지 장점은 전체 방정식을 한 번에 조정할 수 있다는 것입니다:

PID Transpose

이 모든 것이 다소 겁을 줄 수도 있으며, 아마도 공학 학위를 가지고 있는 사람에게도 그렇게 느껴질 수 있습니다. 다행히도 여기에서 무슨 일이 일어나고 있는지 이해하기 위해 모델링 및 동적 시스템 분석 교과서를 꺼낼 필요는 없습니다. 그리고 계산을 잘할 필요도 없습니다.
 
첫 번째 방정식을 분석하면, u(t)—방정식 왼쪽의 단위 없는 제어기 출력을 생성하기 위해 오른쪽의 등호에 세 가지 수학적 요소인 P, I, 그리고 D를 더합니다. 각 요소 앞에는 K 값이 있어 (Kp, Ki, Kd), 이는 특정 시간의 제어 출력인 u(t)를 형성할 때 각각의 요소의 가중치를 나타냅니다. 각 K 값을 개별적으로 조정하여 시스템 성능을 향상시킬 수 있으며, 아래에서 더 자세히 설명하겠습니다:
 
비례 (P—Kp)
 
이 방정식에서 첫 번째이자 가장 중요한 항은 e(t)입니다. 따라서 Kp 값은 일반적으로 방정식 내 다른 K 값들보다 큽니다. 여기에서 e(t)는 특정 시점의 순간 오류—제어 장치의 실제 값에서 원하는 값을 뺀 값입니다. 이를 Kp로 곱하면 전체 제어기 출력에 대한 기여도를 얻을 수 있습니다.
 
적분 (I—KI)
 
이 방정식의 두 번째 항은 시간에 따른 결합된 오류와 관련이 있습니다. 이는 장치에서 발생한 모든 오류의 합입니다:
매번 제어기가 u(t)를 계산할 때, 순간 오류를 누적 기록에 더합니다.
 
이 값은 Ki로 곱해져 u(t)에 추가됩니다.
 
모터를 제자리에 고정하고 정상적인 조건에서 설정 지점으로 돌아가는 것을 허락하지 않는 힘이 있는 상황을 생각해 보십시오. 사양에서 벗어난 시간이 길어질수록 I 항은 계속 증가하게 되고, 결국 이 힘을 이기거나 모터의 한계에 도달할 것입니다.
 
미분 (D—Kd)
 
이 방정식의 세 번째 항은 오류가 얼마나 빠르게 변화하는지에 관련이 있습니다:
 
이론적으로 이 방정식에 D 항만 있다면 과정이 지속적으로 잘못된 값을 유지할 때 이 항은 0이 되어 적절한 출력에 기여하지 않을 것입니다. 반면, 나머지 두 항 중 하나가 장치의 출력을 너무 빠르게 되돌리려 할 때, 미분 항이 그 효과를 완화할 수 있습니다.
 
이 개념의 미적분 기반 표현이 유용할 수는 있지만 PID 제어의 현실은 처음에 보이는 것만큼 마법적이지 않습니다. 실질적으로 우리는 오류와 판독 사이의 시간을 고려하여 더하기, 빼기, 곱하기만으로 출력을 계산합니다. 사실, 우리는 초기 형태의 PID 제어를 구현하기 위해 기계적 수단을 사용하여 각 "항"을 입력하는 공압 시스템을 사용했습니다.

  1. 제어기는 순간 오류를 측정합니다.
  2. 이전의 순간 읽기값을 빼줍니다.
  3. 그 결과값을 Kd로 곱하여 u(t)에 대한 기여도를 계산합니다.

Arduino PID 제어기 튜토리얼

많은 상황에서 프로세스에 전용 PID 컨트롤러를 연결하는 것이 편리하지만, Arduino나 다른 유사한 개발 보드로 직접 만들 수도 있습니다. 직접 PID 루틴을 작성할 수도 있습니다. 코드에서 각 항을 다음과 같이 표현하십시오:

  • P: 순간오차 = 설정값 – 입력값;
  • I: 누적오차 = += 오차 * 경과시간;
  • D: 오차율 = (오차 – 이전오차계산)/경과시간

필요한 출력을 얻기 위해 각 항을 해당 K 값으로 곱한 다음 모두 더하십시오. 한편, 바퀴를 다시 만들지 않으려면 Brett Beuregard의 PID 라이브러리를 사용할 수 있습니다. 이 라이브러리는 세부 사항을 처리해주며 필요한 대로 P, I, D 상수 값을 조정하는 데 집중할 수 있게 합니다.

Arduino Nano

PID 이론을 실행에 옮기기 위해 도구상자에서 Arduino Nano Every를 꺼내 다음과 함께 사용했습니다:

  • 모터 드라이버 보드
  • 적외선 센서
  • Hubsan H107C 드론에서 가져온 모터

나는 모터를 위한 브레드보드 마운트와 함께, 회전하면서 펄스를 놓치는 것을 방지하기 위해 50%의 시간을 빛을 차단하는 "팬"을 출력했습니다. 모터 드라이버는 (다른 제어가 되지 않는) 모터의 입력이며, 피드백은 펄스 간의 시간에 기반을 둡니다.
 
마침내 코드를 작성하고 3D 프린트 부품을 얻었을 때, 나는 일정한 PWM(펄스 폭 변조) 출력으로 전원 버튼을 조작하는 것보다 더 정교한 방법으로 모터를 제어할 수 있었습니다.

PID Routine Code

주목할 만한 코드의 부분은 차단 장치가 회전할 때마다 펄스를 등록하기 위해 인터럽트 루틴을 사용하고, millis()를 사용하여 펄스 간의 시간을 계산하는 것입니다. 저는 함수 밖의 코드 첫 부분에서 PID를 설정했습니다:
 
PID myPID (&difference, &driverOut, &setPoint, Kp, Ki, Kd, DIRECT)
 
Kp, Ki, 그리고 Kd는 코드에서 이 줄 전에 정의되어 있으며, &difference&driverOut을 제어하고, &setPoint는 시리얼 모니터에 의해 수정됩니다. 우리는 이 수학을 조작하여 이 시간 차이를 RPM으로 변환할 수 있지만, PID 설정은 이 특정 드라이버가 입력이 낮을 때 켜지기 때문에 DIRECT 출력으로 작동합니다. 아날로그 출력이 높아지면(모터가 꺼지면) 펄스 간의 지연도 증가합니다.

PID Routine OLD

이전 버전의 PID 루틴입니다. CH1은 입력 펄스를 읽고, CH2는 PID 루틴을 사용하여 계산된 출력입니다—낮은 펄스는 모터로의 입력입니다.
 
이 간단한 PID 컨트롤러 예제는 (새로운 Arduino Nano Every를 포함하여) 보유한 부품과 내가 대략적으로 알고 있는 모터에 의해 구동되었습니다. 하지만 모든 정보를 갖지 않고도 다양한 상황에서 PID 제어를 적용하는 방법을 보여줄 수 있었습니다. 모터 제어든, 오븐의 온도 제어든, 로봇 균형 잡기든 약간의 PID 설정과 튜닝으로 무한한 실험 옵션을 제공합니다.

기사 태그

기사
글로벌
Arduino S.r.l.

관련 뉴스 기사