전기기기 및 제어설계-PMSM을 이용한 모터설계-Inverter circuitRelay switchrelay switch는 히스테리시스 현상이 나타나서 히스테리시스 스위치라고 부른다. 히스테리시스란 옆의 그림과 같은 현상을 말하는 것이다. 즉, 입력전압이 정해진 UPT라는 일정한 값 이상이 되면 출력전압을 High 임피던스로 출력하고 LPT라는 일정한 값 이하가 되면 출력전압을 Low 임피던스를 출력하는 현상이다. 이렇게 되면 구형파를 생성할 수가 있어 Mosfet의 gate에 입력값을 DC로 일정하게 줄 수가 있게 된다. 위의 회로에서 LPT는 -0.005[V]를 UPT는 0.005[V]를 주었다.Inverter(인버터)인버터의 주된 목적은 히스테리시스 스위치에 의하여 교류 전원에서 정류되어 직류 전원으로 변환 변환된 직류 전원을 다시 필요한 교류 전원으로 바꾸는 것이 주된 목적으로 사용되는 변형기로, 변형기의 종류에는 반대 기능인 교류 전원을 직류로 바꾸기 위해 쓰이는 AC to Dc converter, 직류를 다른 직류로 바꾸는 Dc to Dc converter도 있는데 우리는 그중 인버터를 사용한다. 인버터의 원리는 히스테리시스 스위치를 이용하여 교류전원을 직류전원으로 변환시킨 후 Transistor, MOSFET, IGBT 등의 소자를 이용하여 교류로 변환하여 전동기의 속도를 제어하게 된다. 우리는 그중에 MOSFET를 사용한다. MOSFET는 위와 같은 다이오드를 포함하고 있는 소자로서, 다이오드의 필요성은 만약에 모터로의 전류 입력을 끊는 상황이 발생하였을 때, 모터에서 나오는 역기전력에 의하여 전류가 모터에 연결된 두 개의 FET에 전류를 통하게 하여 short가 나는 경우가 있는데, 이때 회로는 손상을 입을수도 있기 때문에 이를 보호하기 위하여 필요하다. 그래서 인버터의 MOSFET의 gate에도 값을 줄 때 같은 연결이 되어있는 두 개의 MOSFET를 같은 값을 주면 안되기 때문에 한쪽 gate에 not gate를 사용한다.다음으로 인버터는 입력전원의 형식에 따라서 전류제어와 전압제어 두 가지가 있는데 전류제어 인버터는 직류 전류를 전동기에 흐르게 하여 전동기를 제어하는 방식으로 위의 회로를 보면 회로 마지막에 전류를 scope를 이용하여 측정하고, 전류를 이용하여 sine wave와 계산을 통하여 다시 값을 조절하는 형태를 통하여 우리도 전류제어 인버터를 쓴다는 것을 알 수 있다. 다음으로 전압제어 인버터는 전압을 교류로 변환하여 전압을 통하여 전동기를 구동하는 방법으로 이 방법으로 구동시에는 주파수와 출력전압을 조절하여 원하는 펄스폭의 구형파를 만들어 제어하는 PWM( Pluse Width Modulation: 펄스 폭 변형 ) 방식과 출력 전압을 제어하여 원하는 구형파의 전압을 제어하는 PAM( Pluse Amplitude Modulation: 펄스 진폭 조절) 방식이 있다. 그리고 추가적으로 PWM의 방식에 따라서 사인파 PWM 인버터와 히스테리시스 인버터로 나눌 수 있다.1) 단상다음의 회로는 실제로 필요한 삼상 인버터를 위하여 단상 인버터를 간단하게 구현한 회로이다. 간단한 회로의 구성을 위하여 reference입력은 sinewave 발생기기를 사용하였다. 그리고 추가적으로 realy라는 소자로 적혀있는 교류를 직류로 바꾸는 기능을 하는 히스테리시스 스위치와 MOSFET로 구성되어있다. 위에서 인버터를 설명하면서 shrot를 방지하기 위한 not gate도 위에 회로에 보인다. 오른쪽의 그림은 단상 전류 파형의 scope출력의 측정값이다.2) 3상 Inverter위의 회로는 삼상 인버터를 세 개의 sine wave의 입력을 reference로서 이용하여 구현한 것으로 각 회로에는 각각의 히스테리시스 스위치, MOSFET가 있고 거기서 나온 전압이 전부 PMSM (Permanent Magnet Synchronous machine)으로 들어가서 모터를 구동하게 되는데 모터의 설정에서 모터의 구동 전압을 300V로 설정하였기 때문에 MOSFET에 DC입력 전압기를 300V로 선택하였다. 그리고 PMSM 다음에 있는 소자는 모터의 값을 측정하는 소자로 여러 가지 값을 측정할 수 있지만, 이 모터는 전류제어 모터 이기 때문에 각 상의 전류값 ia, ib, ic 와 속도 제어를 위한 속도값 rad/sec가 출력되는데, 그 중에 다음 회로에서는 전류값이 scope에서 측정이 되게된다. 그리고 Demux를 통하여 각각의 전류값이 다시 각각의 sine wave의 reference 값과 계산을 하는 곳에 들어가게 되어 계산된 값을 출력하게 구성되어있다. 이 회로에서는 파형 발생기의 phase를 0, (2/3)*π , (4/3)*π 을 주어서 값이 모두 2π동안에 1/3씩 위상을 이동하여 나오게 출력하였다. 옆의 그림은 파형을 scope로 측정한 화면이다.Total circuit위의 회로는 앞에서 설명한 인버터회로에 추가적으로 inverse_dq 회로와 PID제어기를 추가하여 구성된 전체적인 PMSM구동 회로이다. 우리조는 17조라서 motor의 model은 1번 preset model( 0.8Nm,300Vdc,3000rpm - 0.8Nm )을 사용하여 3000rmp의 절반인 1500rmp이 0.5초 내에 5%의 오버슈트로 나오는 것을 목표로 회로를 구성하게 되었다. 회로에 관한 설명으로는 다음 회로에서 제일 앞에 있는 step 생성기가 목표 속도를 위한 referencer 값을 나오게 하는 부분이다. 우리는 여기에 목표 속도값을 입력해야 하는데, 목표 속도값이 1500rpm으로 단위가 rpm이지만 PMSM에서 나오는 motor속도 wm은 단위가 [rad/sec]로 rmp을 rad/sec로 단위변환을 해야한다. 다음은 단위변환을 위한 변환식이다.즉, 우리 조의 목표는 157rad/sec가 wm의 값을 출력하는 scope에서 나와야 하는 것으로, step생성기에 157을 입력하였다.그리고 아래에 두 개의 gain값이 있는데 그중에 오른쪽에 gain값이 pole의 수에 따른 gain을 주기위한 소자이다. 그리고 왼쪽의 gain값은 전류제어방식을 벡터제어 방식으로 바꾸기 위하여 사용하는 gain값이지만, 지금은 바로 벡터제어를 하기 때문에 전류제어에서 변환하는 gain값이 필요가 없다. 우리가 사용하는 motor의 model은 2 ploe이므로 gain값을 2로 주었다. 옆의 설정하면의 아래에서 두 번째 칸을 보면 2 pole을 확인할 수 있을 것이다.그리고 다음으로 PID제어기를 이용해 비례제어(P: proportional control)를 사용하여 속도의 overshoot를 조절하고, 목표속도까지 올라가는 시간을 조절한다. 그리고 적분제어(I : integral control)를 통하여 비례제어의 단점인 정상상태(목표속도)에 근접치까지 올라가고 완전한 정상상태(목표속도)에는 도달하지 못하는 상태로 있는 문제를 해결하기 위한 적분제어를 사용한다. 적분제어는 목표속도와 현재 속도사이의 적분을 통하여 조금씩 목표속도로 도달을 가능하게 만든다. 그러나 적분제어시 반응속도가 느려지는 단점이있다. 그리고 마지막으로 미분제어(D: differential control )가 있는데 이것은 안정성과 응답속도를 빠르게하는 목적으로 쓰인다. 우리조는 비례제어, 미분제어 두 개의 제어기를 이용하여 overshoot와 목표속도 도달을 시간을 control하였다.PID제어기를 통과한 다음으로 inverse dq0 transform 회로를 지나게되는데, 여기서 dq0 transform이란 3상회로를 간단하게 수학적으로 분석하여 변환하는 회로이다. 즉, 3개의 sine wave(AC)를 두 개의 DC값으로 변환하는 것이다. 다음장의 첫 번째 식은 dq0변환식이고 두 번째 식은 inverse dq0 변환식과 변환의 대략적인 그림이다.
#include int main(){int crap;int check = 0;char buf[20];printf("input>");fgets (buf, 45, stdin);if (check == 0x73737363)printf("Good job! 보고서작성하여제출하세요n");elseprintf("Fail! 다시시도하세요n");}위에 소스를 이용하여 버퍼오버플로우를 통하여 check에 8비트로 73737363값을 입력하여라.000000000000000000000000000csss를 넣는 이유 우선 csss는 63 73 73 73 73의 아스키코드 변환값이다. 두 개씩으로 나눈 이유는 2개의 숫자가 2byte + 2byte = 4byte이기 때문이다. 다음으로 숫자를 73737363에서 63737373으로 뒤집은 이유는 버퍼오버플로우를 위하여 리틀엔디안이기 때문에 그리고 스택은 위에서 아래로 자라고 값의 넣는 순서는 차례대로 들어가기 때문에 거꾸로 값을 넣어야했다.앞의 0은 27개 인데 이유는 우선 buf[20]의 4byte를 쓰기 위하여 20개를 사용하였고, 다음의 8byte는 무언가 들어있고 그 다음에 check의 주소이기 때문에 csss를 입력하였다.
4bit 가산기를 이용한 BCD adder소스 분석우선 4bit가산기를 이용하여 두 개의 입력값(a,b)을 더하게 됩니다. process문을 이용하여더한값이 9를 넘어가게 되면 즉, “110X” or “110X” or “111X”의 값이 되게 된다면, BCD 값의 다음자리 4bit의 값을 “0001”로 만들게 됩니다. 그리고, 첫 번째 자리의 BCD값은 4bit 가산기를 이용하여 6을 더한 값을 넣게 됩니다. 9가 넘는숫자라면 6을 더하게 되면 4bit가산기에서는 최대 표현가능 숫자가 15까지 이기 때문에 carry가 발생하게 됩니다. 발생하는 carry는 버리고, 남은자리만 표현하게 구현하였습니다.4bit가산기를 이용하지 않는 BCD 가산기소스 분석4bit가산기를 이용하지 않고 BCD adder를 설계할 때 결과적으로 더하기를 위한 부분의 소스가 필요합니다. 그래서 실질적으로 소스를 복잡하게 만드는 것보다는 ieee. std_logic_arith.all 파일과 unsigned를 이용하여 덧셈연산을 하도록 구현하도록 목적을 세웠습니다. 그래서 우선 입력값 a,b를 더한 값을 signal temp에 저장한 후 process문을 이용하여 if문에서 9보다 클 경우 BCD 다음 저장변수에는 1을 입력하고, BCD 첫 번째 저장변수에는 6을 더하여 입력하도록 구현하였습니다. 이렇게 되면 6을 더한 첫 번째 BCD 변수 공간은 overflow가 생겨서 위에 4bit adder로 구현한 부분과 같은 결과를 얻을수 있게 됩니다.
FIR filter와 IIR filter의 특성FIR filterFIR필터는 디지털 필터의 한 종류로 입력신호의 일정한(유한한, finite) 값들만을 가지고 필터링을 수행합니다. 따라서 필터의 특성함수인 임펄스 응답을 구해보면 유한한 길이를 가집니다. 필터의 식의 형태에서 보면 회귀(feedback)성분을 갖지 않습니다. 그러므로 동일한 특성을 구현할 때 차수가 IIR필터에 비하여 높아져서 구현비용(부품가격, 실행시간 등)이 많이 들지만 위상변이(즉, 입력과 출력간의 파형의 형태유지)가 중요한 경우에는 반드시 FIR필터를 사용해야 합니다. 설계법으로는 윈도우에 의한 방법, 주파수 표본화 방법, 컴퓨터에 의한 최적 설계법 등이 있습니다. 그리고 이 프로젝트에서는 kaiser window라는 윈도우에 의한 방법을 사용하였습니다. 아래 식은 FIR filter의 일반식입니다.IIR filterIIR필터는 디지털 필터의 한 종류로 입력신호의 값과 출력신호의 값이 재귀적으로(recursive, feedback) 적용되어 필터링이 수행됩니다. 따라서 구현식의 형태로 반복식이 되며 특성함수인 임펄스 응답은 무한한 길이를 갖습니다. 동일한 특성을 갖는 FIR필터에 비해 차수가 적어져서 경제성이 있으나 위상특성의 측면에서는 비선형성을 가지므로 입력 파형과 출력 파형이 유사한 파형을 갖지 않습니다. filter의 종류에는 chebyshev filter, butterworth filter, 타원형 filter, bessel filter가 있습니다. 그리고 이 프로젝트에서는 chebyshev filter를 사용하였습니다. 아래의 식은 IIR filter의 일반식입니다. 그리고 아래 그림은 여러 필터들의 특성을 나타내는 그래프입니다.FIR filter와 IIR filter의 차이점다음은 통합한 FIR과 IIR filter의 차이점에 관한 표입니다. 즉, 두 개의 FIR과 IIR filter가운데서 민감하여 안정성이 불안하지만 가격면에서 설계적으로 낮은 필터를 원하면 IIR filter를 사용하고 그 반대의 상황에서는 FIR filter를 사용하는 것이 알맞은 선택인 것을 알 수 있습니다.실제 구현한 기본 소스 코드%% Project%wave file readfs=2000; % 표본화 주파수 2000Hz[y,fs]=wavread('whitenoise2.wav'); % whitenoise wave파일을 읽어옴L = length(y);t=(0: L-1)/fs;figure(1) % whitenoise plotsubplot(2,1,1)plot(t,y);title('시간영역의 whitenoise의 음성신호');grid on%file fftNFFT = 2^nextpow2(L);fftValue = fft(y, NFFT) / L;f = fs/2* linspace(0, 1, NFFT/2+1);subplot(2,1,2)plot(f,2* abs(fftValue(1:NFFT/2+1))); % whitenoise fft plottitle('whitenoise의 FFT');grid on%filter design(Chebyshev_IIR filter)[b,a]= cheby1(6, 0.1, 100*2/fs, 'low'); % 통과대역 주파수 및 기본사항 설정[H,w] = freqz(b,a,1000,'whole');H = (H(1:1:501))';w = (w(1:1:501))';figure(2);subplot(2,1,1)plot(w*fs/(2*pi),abs(H)) % chevyshev filter의 fft plotaxis([0,500,0,1.5]);title('Chebyshev filter의 fft');gridmag = abs(H);db = 20*log10((mag+eps)/max(mag));pha = angle(H);figure(2)subplot(2,1,2)plot(w/pi,db);xlabel('frequency in pi units'); ylabel('db')title('Chebyshev filter의 db출력'); % chevyshev filter의 db plotgrid on%filteringsf=filter(b,a,y); % chevyshev filter를 이용한 필터링L2=length(sf);figure(3)NFFT = 2^nextpow2(L2);fftValue = fft(sf, NFFT) / L2;f = fs/2* linspace(0, 1, NFFT/2+1);plot(f,2* abs(fftValue(1:NFFT/2+1)));axis([0,1000,0,1.4*10^-3]);title('Chebyshev filter를 통과한 whitenoise파형');grid on%filter design(kaiser_FIR filter)wp = 0.005*pi; ws = 0.01*pi; As = 85; % 통과대역 주파수 및 기본사항 설정tr_width = ws - wp;M = ceil((As-7.95)/(14.36*tr_width/(2*pi))+1) + 1n=[0:1:M-1];beta = 0.1102*(As-8.7)wc = (ws+wp);alpha = (M-1)/2;n = [0:1:(M-1)];m = n - alpha + eps;hd = sin(wc*m) ./ (pi*m);w_kai = (kaiser(M,beta))';h = hd .* w_kai;[H,w] = freqz(h,[1],1000,'whole');H = (H(1:1:501))';w = (w(1:1:501))';mag = abs(H);db = 20*log10((mag+eps)/max(mag));pha = angle(H);delta_w = 2*pi/1000;As = -round(max(db(ws/delta_w+1:1:501)))figure(4)subplot(2,1,1); stem(n,w_kai); % Kaiser Window plottitle('Kaiser Window')axis([0 M-1 0 1.1]);subplot(2,1,2);plot(w/pi,db);gridaxis([0 1 -120 10]);xlabel('frequency in pi units'); ylabel('db') % Kaiser Window db값 plottitle('Chebyshev filter의 db출력');%filteringsf=filter(h,[1],y); % chevyshev filter를 이용한 필터링L2=length(sf);figure(5)NFFT = 2^nextpow2(L2);fftValue = fft(sf, NFFT) / L2;f = fs/2* linspace(0, 1, NFFT/2+1);plot(f,2* abs(fftValue(1:NFFT/2+1)));axis([0,1000,0,1.4*10^-3]);title('Kaiser Window를 통과한 whitenoise파형');grid on출력화면< chevyshev filter의시간영역과 db 영역의 그래프 >< chevyshev filter를 이용하여filtering 된 white noise의 출력값 >< Kaiser Window의시간영역과 db 영역의 그래프 >< Kaiser Window를 이용하여filtering 된 white noise의 출력값 >프로젝트 설명제일 처음에 파형을 읽어와서 그 값을 이용하여 시간에서의 그래프와 fft를 이용한 주파수에서의 그래프로 나타내게 됩니다. 여기서 처음에 whitenoise는 모든 주파수 성분을 포함하고 있기 때문에 whitenoise가 가장 필터링을 하게 되면 확인하기가 쉽다고 판단하여서 whitenoise를 선택하게 되었습니다. 그리고 이 data를 fft를 하게 됩니다. fft는 아래와 같은 방식으로 구현하였습니다.NFFT = 2^nextpow2(L);fftValue = fft(y, NFFT) / L;f = fs/2* linspace(0, 1, NFFT/2+1);subplot(2,1,2)plot(f,2* abs(fftValue(1:NFFT/2+1))); % whitenoise fft plot여기서 fft는 2의 거듭제곱값으로 차수를 사용하기 때문에 nextpow라는 함수를 통하여 가장 data에 가까운 2의 거듭제곱승을 찾아낸 후 그 거듭제곱을 한 것을 fft를 위한 차수로 정하게 됩니다. 그리고 그 값을 이용하여 fft라는 함수를 통하여 fft를 하게 됩니다. 그리고 linespace라는 함수는 0부터 fft를 수행한 곳까지를 1로 나누는 것으로 이 2가지를 통하여 plot을 이용하여 그래프를 그리게 됩니다.다음은 IIR filter의 부분으로 우선 처음에 IIR filter를 design 하게 됩니다. 우선 저는 IIR filter 가운데 Chebyshev 필터를 사용하였습니다.Chebyshev 필터는 위에 있는 그림과 같은 특성을 가지고 있습니다. Chebyshev 필터의 구현은 cheby1이라는 함수를 사용하여 구현하였습니다. cheby1함수의 기본적인 사용법은 cheby1( 차수 , ripple , 대역 주파수 , filter 종류[‘low', 'high' , 'stop'])방법을 사용하게 됩니다. 이렇게 해서 나온 값을 freqz라는 함수를 이용하여서 임펄스 주파수 응답의 형태로 바꾸게 됩니다. 주파수 응답으로 바꾼값을 abs라는 절대값 계산 함수로 바꾼 다음에 dB와 주파수 특성값을 출력하였습니다. 그리고 마지막으로 이 필터와 입력값을 filter라는 함수를 통하여 filtering하게 되도 그 값을 fft로 출력하여 실제로 filltering이 제한사양에 맞게 되었는지 확인 할 수 있었습니다.다음 그림을 보시면 실제 원래의 data를 필터링 하여서 stopband와 passband의 지역이 설계사양에 맞게 나온 것을 확인 할 수가 있습니다.