2017-03-30

PID 제어

출처: http://blog.naver.com/sppe12/110085291875



1. PID 제어란?

자동제어 방식 가운데서 가장 흔히 이용되는 제어방식으로 PID 제어라는 방식이 있다.
이 PID란,

P: Proportinal(비례)
I: Integral(적분)
D: Differential(미분)
의 3가지 조합으로 제어하는 것으로 유연한 제어가 가능해진다.

2. 단순 On/Off 제어

단순한 On/Off 제어의 경우에는 제어 조작량은 0%와 100% 사이를 왕래하므로 조작량의 변화가 너무 크고, 실제 목표값에 대해 지나치게 반복하기 때문에, 목표값의 부근에서 凸凹를 반복하는 제어로 되고 만다. 이 모양을 그림으로 나타내면 아래 그림과 같이 된다.







3. 비례 제어(P제어)

이에 대해 조작량을 목표값과 현재 위치와의 차에 비례한 크기가 되도록 하며, 서서히 조절하는 제어 방법이 비례 제어라고 하는 방식이다. 이렇게 하면 목표값에 접근하면 미묘한 제어를 가할 수 있기 때문에 미세하게 목표값에 가까이 할 수 있다. 이 모양은 아래 그림과 같이 나타낼 수 있다.






-PID제어기에서 반드시 사용하는 가장 기본적인 제어이며 구현하기가 쉽다. 이 제어만으로는 적분기가 플랜트에 없을 경우에 정상상태 오차가 발생할 수 있다.

-비례제어란 기준신호와 되먹임 신호 사이의 차인 오차신호에 적당한 비례상수 이득을 곱해서 제어신호를 만들어내는 제어기법을 말하며, 오차신호에 비례하는(Proportional) 제어신호를 만든다는 뜻에서 이 기법에 의한 제어기를 비례제어기(Proportional Controller), 또는 영문약자를 써서 P제어기라고 부른다

?장점 - 구성이 간단하여 구현하기가 쉽다.

?단점 - 이득의 조정만으로는 시스템의 성능을 여러 가지 면에서 함께 개선시키기는 어렵다. 상승시간과 초과 사이의 상충문제를 절충하지 못함.


4. 적분 제어(I제어)

정상상태 오차를 없애는데 사용. 계수조정이 잘못되면 시스템이 불안해지고 반응이 느려진다.


5. 비례미분 제어(PD제어)

-오차신호를 미분하여 제어신호를 만들어내는 미분제어를 비례제어에 병렬로 연결하여 사용하는 제어기법. 비례제어 부분과 미분제어를 함께 쓴다는 뜻에서 이 기법에 의한 제어기를 비례미분 제어기(proportional-derivative controller), 또는 PD제어기 라고 한다. D요소를 부가한 것으로 인해 PD제어기는 단순한 P 제어기보다 응답이 빠르다.

-오차신호의 미분값에 비례하는 제어신호를 되먹임시켜 오차 신호의 변화를 억제하는 역할을 하기 때문에 감쇠비를 증가시키고 초과를 억제하는 데에 효과적이다. 이러한 미분제어의 효과를 고려하여 PD제어기를 적절히 설계하면 시스템의 과도응답 특성을 개선시킬 수 있다. PD제어기를 사용하는 경우에 시스템 형식이 증가하지 않기 때문에 정상상태 응답특성은 개선되지 않으므로 주의 하여야 한다.

Kp: 상승시간(rise time) 감소, 정상상태 오차 제거에

Ki : 정상상태 오차 제거, 과도응답 특성 나빠짐.

Kd: 시스템의 안정성 증가, 오버슈트, 과도응답 특성을 향상시킴


6. PI 제어

비례 제어로 잘 제어할 수 있을 것으로 생각하겠지만, 실제로는 제어량이 목표값에 접근하면 문제가 발생한다. 그것은 조작량이 너무 작아지고, 그 이상 미세하게 제어할 수 없는 상태가 발생한다. 결과는 목표값에 아주 가까운 제어량의 상태에서 안정한 상태로 되고 만다. 이렇게 되면 목표값에 가까워지지만, 아무리 시간이 지나도 제어량과 완전히 일치하지 않는 상태로 되고 만다. 이 미소한 오차를 "잔류편차"라고 한다. 이 잔류편차를 없애기 위해 사용되는 것이 적분 제어이다. 즉, 미소한 잔류편차를 시간적으로 누적하여, 어떤 크기로 된 곳에서 조작량을 증가하여 편차를 없애는 식으로 동작시킨다. 이와 같이, 비례 동작에 적분 동작을 추가한 제어를 "PI 제어"라 부른다. 이것을 그림으로 나타내면 아래 그림과 같이 된다.






-비례적분 제어란 오차신호를 적분하여 제어신호를 만들어내는 적분제어를 병렬로 연결하여 사용하는 제어기법을 가리킨다. 비례제어 부분과 더불어 오차신호를 적분(integral)하여 제어신호를 만드는 적분제어를 함께 쓴다는 뜻에서 이 기법에 의한 제어기를 비례적분 제어기(proportional-integral controller), 또는 영문약자를 써서 PI제어기라고 부른다. 정상상태 오차를 없애면서 시스템의 반응을 빠르게 하려면 비례적분 제어기를 사용하면 된다.

?장점 - P제어기와 I 제어기의 단점을 서로 보완해 줌으로써 전달함수에 시스템의 유형을 높여주고 정상상태 오차를 줄여주면서 과도응답으로 발생한 시스템의 느린 반응을 빠르게 할 수 있다. 감쇠비를 증가시키고 동시에 정상상태 오차도 개선.

?단점 - Gain계수조정이 잘못되면 시스템이 불안해지고 반응이 느려진다. Overshoot가 증가하고 Ts가 증가한다. 이러한 단점을 보완하기 위해서는 D제어기를 사용함으로써 해결된다. 상승시간이 느려지는 등 과도응답에는 불리하다.


7. 미분 제어와 PID 제어

PI 제어로 실제 목표값에 가깝게 하는 제어는 완벽하게 할 수 있다. 그러나 또 하나 개선의 여지가 있다. 그것은 제어 응답의 속도이다. PI 제어에서는 확실히 목표값으로 제어할 수 있지만, 일정한 시간(시정수)이 필요하다. 이때 정수가 크면 외란이 있을 때의 응답 성능이 나빠진다.
즉, 외란에 대하여 신속하게 반응할 수 없고, 즉시 원래의 목표값으로는 돌아갈 수 없다는 것이다. 그래서, 필요하게 된 것이 미분 동작이다. 이것은 급격히 일어나는 외란에 대해 편차를 보고, 전회 편차와의 차가 큰 경우에는 조작량을 많이 하여 기민하게 반응하도록 한다. 이 전회와의 편차에 대한 변화차를 보는 것이 "미분"에 상당한다. 이 미분동작을 추가한 PID 제어의 경우, 제어 특성은 아래 그림과 같이 된다. 이것으로 알 수 있듯이 처음에는 상당히 over drive하는 듯이 제어하여, 신속히 목표값이 되도록 적극적으로 제어해 간다.
-PD제어기는 시스템의 제동비를 증가시켜서 과도응답특성을 개선시키지만 정상상태 응답을 개선하는 데에는 효과가 없으며, PI제어기는 정상상태 오차를 개선시키지만 상승시간이 느려지는 등 과도응답에는 불리하다는 것을 알았다. 따라서, 정상상태 응답과 과도상태 응답을 모두 개선하려면 PI 와 PD제어기의 장점들을 조합하는 방법을 자연스럽게 생각할 수 있는데, 이러한 목적으로 제안된 제어기가 바로 PID 제어기이다.






8. 컴퓨터에 의한 PID 제어 알고리즘

원래 PID 제어는 연속한 아날로그량을 제어하는 것이 기본으로 되어 있다. 그러나, 컴퓨터의 프로그램으로 PID 제어를 실현하려고 하는 경우에는 연속적인 양을 취급할 수 없다. 왜냐하면, 컴퓨터 데이터의 입출력은 일정시간 간격으로밖에 할 수 없기 때문이다. 게다가 미적분 연산을 착실히 하고 있는 것에서는 연산에 요하는 능력으로 인해 고성능의 컴퓨터가 필요하게 되고 만다. 그래서 생각된 것이 샘플링 방식(이산값)에 적합한 PID 연산 방식이다.

우선, 샘플링 방식의 PID 제어의 기본식은 다음과 같이 표현된다.

조작량 = Kp×편차 + Ki×편차의 누적값 + Kd×전회 편차와의 차
             (비례항)         (적분항)                    (미분항)

기호로 나타내면,

MVn = MVn-1 + ΔMVn
ΔMVn = Kp(en-en-1) + Ki en + Kd((en-en-1)-(en-1-en-2))


MVn, MVn-1: 금회, 전회 조작량
ΔMVn: 금회 조작량 미분
en, en-1, en-2: 금회, 전회, 전전회의 편차

이것을 프로그램으로 실현하기 위해서는 이번과 전회의 편차값만 측정할 수 있으면 조작량을 구할 수 있다.


9. 파라미터를 구하는 방법

PID 제어 방식에 있어서의 과제는 각 항에 붙는 정수, Kp, Ki, Kd를 정하는 방법이다.
이것의 최적값을 구하는 방법은 몇 가지 있지만, 어느 것이나 난해하며, 소형의 마이크로컴퓨터로 실현하기 위해서는 번거로운 것이다(tuning이라 부른다). 그래서, 이 파라미터는 cut and try로 실제 제어한 결과에서 최적한 값을 구하고, 그 값을 설정하도록 한다.
참고로 튜닝의 수법을 소개하면 스텝 응답법과 한계 감도법이 유명한 수법이다.

또, 프로세스 제어 분야에서는 이 튜닝을 자동적으로 실행하는 Auto tuning 기능을 갖는 자동제어 유닛도 있다. 이것에는 제어 결과를 학습하고, 그 결과로부터 항상 최적한 파라미터값을 구하여 다음 제어 사이클에 반영하는 기능도 실장되어 있다.

여기서 스텝 응답법에 있어서 파라미터를 구하는 방법을 소개한다. 우선, 제어계의 입력에 스텝 신호를 가하고, 그 출력 결과가 아래 그림이라고 하자(파라미터는 적당히 설정해 둔다).






위 그림과 같이 상승의 곡선에 접선을 긋고, 그것과 축과의 교점, 정상값의 63%에 해당하는 값으로 된 곳의 2점에서,
L: 낭비시간 T: 시정수 K: 정상값의 3가지 값을 구한다.
이 값으로부터, 각 파라미터는 아래 표와 같이 구할 수 있다.

제어 동작 종별
Kp의 값
Ki의 값
Kd의 값
비례 제어
0.3~0.7T/KL
0
0
PI 제어
0.35~0.6T/KL
0.3~0.6/KL
0
PID 제어
0.6~0.95T/KL
0.6~0.7/KL
0.3~0.45T/K
[출처] PID제어란!!|작성자 화이팅

이 파라미터에 범위가 있지만, 이 크기에 의한 차이는 특성의 차이로 나타나며, 아래 그림과 같이, 파라미터가 많은 경우에는 미분, 적분 효과가 빨리 효력이 나타나므로 아래 그림의 적색선의 특성과 같이 overshoot이 크게 눈에 띈다. 파라미터가 작은 쪽의 경우는 하측 황색선의 특성과 같이 된다.







10. PID 게인 조정 및 제어 특성

PID 제어의 최적의 계수는 상태와 시스템에 따라서 달라진다. 이는 사용자의 시스템에 맞는 개별 제어 특성을 고려하여 게인 파라미터를 설정하는 것이 필요하다는 것을 의미한다. 다음은 PID 제어에 요구되는 특성들이다.

· 안정된 성능
· 빠른 응답
· 아주 작은 정상상태 편차



안정된 성능 영역 내에서 Kp, Ki, Kd의 각 파라미터를 조정해야 한다. 일반적으로 각각의 게인(Kp, Ki, Kp) 파라미터를 증가시키면(적분시정수 Ti 는 감소), 빠른 응답을 얻을 수 있다. 그러나 너무 많이 증가시키면 제어가 불안정하게 된다. 왜냐하면 피드백 값이 연속적으로 증가하거나 감소하기 때문에 제어의 진동을 야기시키게 된다. 최악의 경우 시스템은 발산모드가 된다. 다음은 각각의 파라미터를 조정하기 위한 방법이다.

(1) 목표값을 변화한 후, 응답이 너무 느리다.
  → P-게인(Kp)을 올린다. 응답은 빠르나 불안정하다.
  → P-게인(Kp)을 내린다.

(2) 목표값과 피드백값이 같아지지 않는다.
  → 적분 시간 Ti를 감소시킨다. 불안정하게 진동하며 일치한다.
  → 적분 시간 Ti를 증가시킨다.

(3) Kp를 올린 후, 응답이 여전히 느리다.
  → D-게인(Kd)을 올린다. 여전히 불안정하다.
  → D-게인(Kd)을 내린다.


* 각 게인 조정의 예(Kp & Ti)
· 목표값에 스텝변화가 주었을 때 피드백 신호의 응답이나 인버터의 출력주파수를 확인하면 된다
· 오실로스코프나 기타의 측정장비를 사용하여 피드백값이나 인버터의 출력주파수의 파형을 관찰한다(주파수 모니터).
· 디지털 입력신호에 의해서 변하는 목표값을 먼저 비교하여, 스텝응답으로 목표값을 변화시킬 수 있다.
· 프로세싱 전에는 제어시스템이 안정화되어야만 한다.



* 비례게인의 조정(Kp)
I-제어와 D-제어 없이 P-제어에 의해서만 구동을 시작한다(나머지는 0으로 설정).
먼저 P-게인을 최소값으로 설정하고 어떻게 동작하는 가를 본다. 결과값을 보고서 P-게인을 점차적으로 증가시킨다. 아주 만족할 만한 성능을 발휘할 때까지 이러한 절차를 반복한다(또 다른 방법은 최대 P-게인을 설정하고 성능을 관측한다. 만약 시스템이 불안정하면 중간값을 설정하고 어떻게 동작하는가를 관측한다. 이러한 절차를 계속해서 반복하면 된다). 만약 시스템이 불안정하다면 P-게인을 줄인다. 만약 허용범위에서 정상상태 편차가 존재한다면 P-게인의 조정은 완전히 완료된 것이다.
- 적분시간의 조정(Ti) & Kp의 값의 재조정 최소 적분시간을 설정함으로써 조정을 시작한다. 만약 조정이 어렵다면 P-게인을 줄인다. 편차가 수렴하지 않는 경우에는 적분시간을 줄인다. 만약 이 시간 동안 제어가 불안정하다면 P-게인을 줄인다. 안정된 파라미터를 찾을 때까지 계속해서 이러한 절차를 반복한다.




(1) 비례동작(Proportional action) - P 동작

제어기는 기준 입력과 현재값과의 편차를 줄이는 방향으로 제어한다. 그때, 제어장치에 동작신호 Z(t)가 주어졌을 때, 조작량 y(t)가 얻어지는 경우, 즉 조작량 y(t)가 동작신호 Z(t)에 비례하여 변할 때의 그 관계식은

y(t) = K Z(t)

가 된다. 이것을 비례동작이라 한다. 여기서 K는 비례정수로 비례동작을 강하게 할 것인가, 약하게 할 것인가를 결정한다. 비례정수의 크기가 크면 기준입력에 현재치가 빠르게 접근하나 출력이 진동하여 제어의 안정성에 악영향을 미칠 수 있고, 비례정수의 크기가 작으면 기준입력에 천천히 현재치가 접근하며 잔류편차가 생길 우려가 있다.


(2) 적분동작(Integral control action) - I 동작

제어대상에 주어지는 조작량의 변화속도가 동작신호에 비례 하는 동작, 적분동작은 적분 시간을 조정하여 적분동작을 크게 또는 작게 한다. 즉 적분시간을 길게 하면 조작량이 적어지고 따라서 기준치에 접근하는 시간이 길어진다. 적분시간이 짧으면 조작량이 많아지게 되어 기준치에 접근하는 시간이 짧아진다. 적분동작의 관계식은

y(t) = K Z(t) dt

가 된다. 적분동작은 단독으로 사용되지 않으며 P동작이나 D동작과 결합하여 PI, PID동작에 사용한다. 적분동작은 P동작에서 발생할 수 있는 잔류편차를 없앨 수 있다. 적분시간이 너무 짧으면 제어 불능 상태에 빠질 수 있다.


(3) 미분동작(Derivative action)

조작량 y(t)가 동작신호 Z(t)에 미분동작을 한다. 미분동작은 편차의 변화율에 상응하는 조작량을 연산하여 편차의 변화를 억제한다. 미분동작의 관계식은

y(t) = K dZ(t)/dt

가 된다. 미분동작은 단독으로 사용되지 않으며 P동작이나 D동작과 결합하여 PI, PID동작에 사용한다. 일반적으로 미분동작을 사용한 제어기는 기준 입력에 접근하는 속도가 빨라지고 현재치의 급변이나 외란을 억제하는 효과가 있다.


(4) PID 제어 유니트

비례 적분 미분 동작은 위에서 설명한 3가지 동작을 조합한 동작으로 관계식은

y(t) = K ( Z 1/Ti Z(t) dt Td dZ(t)/dt )가 된다.



[출처] PID제어란!!|작성자 화이팅

2016-07-05

const static data members 초기화

출처: http://xlos.tistory.com/869

//static data member들은모든block의밖에서define 되어야한다
//모든block의밖에서define되는static data memeber들은따로초기화값을주지않으면
//자동으로0으로초기화된다.


class Widget
{
    static int n; //declaration
};

int Widget::n = 0; //definition


//const data member들은constructor's initialization section에서초기화가되어야한다.
//member initialization list


class Widget
{
public:
    Widget() : n( 0 ) { }

private:
    const int n; //const data member
};


//const static data member들은integral type일경우, in-class initialization이허용되고,
//non-integral type일경우, class 밖에서초기화되어야한다.


#include <string>

class Widget
{
public:
//..

private:
    static const int MAX = 512;  //definition
    static const char flag = 'a';   //also a defintion
    static const std::string msg;  //non-integral type; must be defined outside the class body
};

const std::string Widget::msg = "hello";


* 참고
Integral type : bool, char, wchar_t, signed char, short int, int, long int, unsigned char, unsigned short int, unsigned int, unsigned long int

Floating-point type : float, double, long double

2016-01-14

윈도 64BIT gtkmm3 개발 라이브러리

https://github.com/codekiddy2/Visual-Studio-gtkmm/releases

2015-04-18

pmac 속도

#(n)v 명령으로 velocity 를 가져올 수 있다.

단위는 cts/servo cycle

cts/sec 로 단위 변환.

초당 servo cycle count
= 1000 * 8388608 / 3915022(I10)
= 2142.6719952020703842788112046369

servo cycle time(sec)
= 1 / 2142.6719952020703842788112046369
= 0.0004667069911956787109375000000002

x cts/servo cycle
= x / 0.0004667069911956787109375000000002 cts/sec