ON/OFF 제어는 조작량을 -100%와 +100%으로 하기 때문에
조작량의 변화가 너무 크고 목표값에 대해 지나치게 반복하여
목표값의 부근에서 큰 진동 모양으로 반복하는 제어 방식입니
다.

 

제어량이 목표값보다 크면 조작량을 -100%로

그 반대의 경우라면 조작량을 +100% 로 하면 됩니다.

 

   

 

 

 

 

수식

  

 

 

E: 편차(목표값- 제어량)

plus_minus(val1): val1 의 값이 양수이면 +1, 음수이면 -1

 

 

예를 들어 목표값이 200, 제어량이 220이라면 100% 로 냉각을 하게 됩니다.

조작량 = plus_minus(-20) *100 => -100

 

예를 들어 목표값이 200, 제어량이 199이라면 100% 로 가열을 하게 됩니다.

조작량 = plus_minus(1) *100 => +100

 

 

 

 

실험 동영상

 

 

'전자/일반' 카테고리의 다른 글

빵판에서 사용 가능한 푸쉬,리셋 스위치  (0) 2016.04.20
USB2.0 MINI 5p cable 미니5핀 케이블  (0) 2016.03.31
다양한 저항 종류 – 용량  (0) 2016.03.31
PID 제어  (4) 2012.11.28
서보 모터 제어 방법  (1) 2012.11.15
Posted by WhiteAT
,

PID 제어

전자/일반 2012. 11. 28. 12:16

 

자동제어 방식 중에 PID 제어가 있습니다. 

 

 

PID 제어란?


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

 

 

 

ON/OFF 제어, P제어, PI 제어, PID 제어를 비교해 보겠습니다.

 

 

 

 

ON/OFF 제어



단순 ON/OFF 제어는 조작량을 -100%와 +100%으로 하기 때문에
조작량의 변화가 너무 크고 목표값에 대해 지나치게 반복하여
목표값의 부근에서 큰 진동 모양으로 반복하는 제어 방식입니다.

 

 

주변 온도가 15도이며 20도로 설정된 상태입니다.

처음 20도로 온도가 상승한 후 20도를 기준으로 진동을 하게 되는데 주변 온도가 15도라서 평균적으로 약 19도 정도를 유지하게 됩니다.

만약 주변온도가 10도라면 평균온도는 그 이하가 될 것입니다.

 

이 방식은 주변온도에 따라 평균 온도가 달라지며 순간순간의 조작량이 많아 효율이 좋지 않습니다.

 

 

 

 

P 제어



조작량을 목표값과 현재 값과의 차에 비례하게 하여 서서히 조절하는 제어 방법을 비례 제어라고 합니다.


이렇게 하면 목표값에 접근하면 좀더 세밀하게 제어를 가할 수 있기 때문에
ON/OFF 제어보다 세밀하게 목표값에 접근할 수 있습니다.

 

 

얼핏보면 ON/OFF 제어와 비슷해 보이지만 조작량의 최대값을 조절하여 진동폭을 줄일 수 있습니다. 진동폭이 작아져도 여전히 진동하는 문제가 있습니다.

 

 

 

 

PI 제어

 

P 제어 식에 에러의 누적 값을 더해 주면 좀더 안정적인 제어를 할 수 있습니다.

 

 

PI 제어는 빠르게 목표값에 도달한 듯 보이지만 마지막에 약간의 진동이 있습니다.

 

 

PID 제어

 


비례 제어만으로 제어가 잘 될 것이라 생각되겠지만 실제로는 제어량이 목표값에 접근하면 문제가 발생합니다. 조작량이 너무 작아지고, 그 이상 미세하게 제어할 수 없는 상태가 그러합니다.

결과는 목표값에 아주 가까운 제어량의 상태에서 안정한 상태로 될 수 있는데 비례제어만 사용하게 되면 목표값에 가까워지더라도 제어량과 완전히 일치하지 않는 상태로 되고 맙니다.


이 미소한 오차를 "잔류편차"라고 하는데 이 잔류편차를 없애기 위해 사용되는 것이 적분 제어입니다.
즉, 미소한 잔류편차를 시간적으로 누적하여, 그 누적값을 조작량에 증가하여 편차를 없애는 식으로 동작시킬수 있습니다.

이와 같이, 비례 동작에 적분 동작을 추가한 제어를 "PID 제어"라 합니다.

 

 

 

 

PID 제어로 빠르고 작은 진동으로 목표 값에 도달합니다.






Kd 을 0.01 로 했을 때







Kd 을 0.005 로 했을 때






PID 실험 키트


 

PID,CHERRY,실험,ON/OFF/P,PI,PID,제어,자동제어








출처: http://whiteat.com/1798


 

 

Posted by WhiteAT
,

 

ZEO 모듈을 처음 사용하시는 분은 http://whiteat.com/57501 를 참조하여 드라이버를 설치하시고, 프로그래밍 가이드를 따라 해 보시기 바랍니다.

 

 

 

 

하드웨어 연결

 

 

 

데이터시트의 핀명을 참조하여 아래 사진처럼 PWMA-1,2,3, PWMB-1,2,3,4, PWMC-1,2,3,4 에 각각 적색 LED와 1K옴 저항을 연결합니다.

(VCC – 1K옴저항 – 포트로 연결 합니다.)

 

 

 

 

Visual Studio 2008 의 C#으로 PWM11App 라는 응용프로그램을 만들어 보겠습니다.

 

먼저 Windows Forms Application Template 으로 PWM11App 라는 프로젝트를 생성합니다.

C#을 처음 접하시는 분은 http://whiteat.com/31559 를 먼저 해보시기 바랍니다.

 

 

 

 

 

라이브러리 추가 & 기본 코드 추가

http://whiteat.com/product/ZEO/ZEO-Programming_Guide.pdf 의 프로그래밍 가이드를 참조하여 라이브러리를 추가합니다.

 

 

라이브러리를 추가하면 아래와 같이 솔루션 창에 ZeoDotNetLib 와 LibUsbDotNet 이 생성됩니다.

 

 

 

 

 

Form_Load 이벤트와 Form_Closing 이벤트에 각각 ZEO 모듈의 초기화코드와 종료 코드를 추가합니다.

 

 

using ZeoDotNetLib;

 

namespace PWM11App

{

public partial class Form1 : Form

{

ZeoLib ZEO = new ZeoLib();

 

public Form1()

{

InitializeComponent();

}

 

private void Form1_Load(object sender, EventArgs e)

{

this.ZEO.Open();

this.ZEO.InitZeo(0);

this.label1.Text = "ZEO-" + this.ZEO.GetZeroType().ToString();

 

// PWM 초기화 모든 LED 를 최대값으로 ON 한다.

this.ZEO.InitPWMA(PWM_Frequency._2Khz, 0, 0, 0);

this.ZEO.InitPWMB(PWM_Frequency._2Khz, 0, 0, 0,0);

this.ZEO.InitPWMC(PWM_Frequency._2Khz, 0, 0, 0,0);

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

this.ZEO.Close();

}

}

}

 

 

 

 

컨트롤 추가

11개의 PWM 을 제어하기 위해 11개의 Trackbar ( 슬라이드바)를 추가하고 좌측에 라벨을 붙여 줍니다.

 

 

 

 

 

TrackBar 의 Scroll 이벤트를 걸어 스크롤을 변경할 때마다 LED 밝기를 조절할 수 있습니다.

 

 

private void trbPWMA1_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.A,1,Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMA2_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.A, 2, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMA3_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.A, 3, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMB1_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.B, 1, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMB2_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.B, 2, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMB3_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.B, 3, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMB4_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.B, 4, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMC1_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.C, 1, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMC2_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.C, 2, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMC3_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.C, 3, Convert.ToUInt16((sender as TrackBar).Value));

}

 

private void trbPWMC4_Scroll(object sender, EventArgs e)

{

this.ZEO.SetPWM(ZeoLib.PWM.C, 4, Convert.ToUInt16((sender as TrackBar).Value));

}

 

 

 

 

 

위와 같은 설정이 되면 아래의 결과를 얻을 수 있습니다.

 

 

 

 

PWMA-1부터 PWMC-4 의 PWM 을 차례대로 제어하는 동영상입니다.

 




Posted by WhiteAT
,

 

ZEO 모듈을 사용하시는 분은 http://whiteat.com/57501 를 참조하여 드라이버를 설치하시고, 프로그래밍 가이드를 따라해 보시기 바랍니다.

 

 

 

C#으로 HumanDetectApp 라는 응용프로그램을 만들어 보겠습니다.

여기서는 Visual Studio 2008 의 C#을 사용하게 됩니다.

 

먼저 Windows Forms Application Template 으로 HumanDetectApp 라는 프로젝트를 생성합니다.

C#을 처음 접하시는 분은 http://whiteat.com/31559 를 한번만 해보셔도 금방 따라 하실 수 있습니다.

 

 

 

 

기본 폼이 완성 되면 LABEL 2개를 추가합니다.

각각의 이름을 lblModel, lblAlarm로 하겠습니다.

lblModel에는 현재 사용중인 ZEO 의 모델명과 버전을 표시할 것이고,

lblAlarm 에는 "침입자 발견" 메시지를 보여줄 것입니다.

 

 

그리고 일정시간마다 센서 값을 읽어 올 수 있게 Timer 를 추가하고 타이머의 이름을 tmrMain 이라고 하겠습니다.

 

 

 

이제 각 기능을 구현하면 됩니다.

 

 

 

센서가 감지되었을 경우 경고 표시

 

 

 

 

평상시 화면

 

 

 

 

 

 

아래는 인체감지 센서를 읽어 알람을 화면에 표시하는 전체 코드입니다.

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using ZeoDotNetLib;

 

 

namespace HumanDetectApp

{

public partial class Form1 : Form

{

ZeoLib ZEO = new ZeoLib();

 

public Form1()

{

InitializeComponent();

}

 

private void Form1_Load(object sender, EventArgs e)

{

// ZEO 모듈 열기

this.ZEO.Open();

 

// ZEO 모듈 초기화

this.ZEO.InitZeo(0);

 

// 모델명 버전 표시

this.lblModel.Text = "MODEL: ZEO-" + this.ZEO.GetZeroType().ToString();

this.lblModel.Text += " VERSION: " + this.ZEO.GetBoardVersion();

 

// PA16을 입력으로 설정 (센서 값 읽기)

this.ZEO.PORT_DirInput(PIN_NAME.PA16);

 

}

 

private void tmrMain_Tick(object sender, EventArgs e)

{

// 만약 ZEO와 연결되지 않았다면 아무것도 안하겠다.

if (!this.ZEO.IsOpened) return;

 

// 모든 포트의 값을 읽어

UInt32[] uiData = this.ZEO.ReadPortAll();

 

// PA16의 값이 HIGH 이면

if ((uiData[0] & 0x10000) == 0x10000)

{

// 알람 표시

lblAlarm.Visible = true;

}

else

{

lblAlarm.Visible = false;

}

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

// 프로그램 종료시에는 반드시 Close 를 해줘야 한다.

this.ZEO.Close();

}

}

}

 

 

 

 

Posted by WhiteAT
,

 

ZEO 모듈과 인체감지 센서 모듈로 침입자를 감시하는 예제를 만들어 보겠습니다.

 

침입자 감시 시스템

 

 

 

 

회로 꾸미기

 

아래처럼 ZEO-S 모듈과 인체감지모듈을 브레드보드에 연결합니다.

 

 

 

 

센서에는 VCC, GND, OUT 핀 명이 표기되어 있으며

VCC 에는 3.3V(양극)

GND 에는 그라운드(음극)

OUT 에는 ZEO-S 의 PA16번에 연결합니다.

 

GND 옆의 신호가 OUT 이라서 별도의 점퍼선 없이 기판에 바로 연결할 수 있습니다.

센서의 VCC는 ZEO-S의 우측 1번 핀에 연결해 줘야겠죠?

 

 

 

 

 

이제 USB 케이블을 PC에 연결하면

하드웨어 준비는 끝입니다.^^

 

Posted by WhiteAT
,