'DLP'에 해당되는 글 3건

  1. 2012.07.22 DLP 의 제작 (아날라이저 부분)
  2. 2011.09.19 DLP analyzer (매트랩용 m파일)
  3. 2011.04.26 DLP 측정 방법.

DLP 의 제작 (아날라이저 부분)

새로 시작한 프로젝트는 Dual Langmuir Probe(DLP) 라고 불리우는 플라즈마 용 진단 툴이다.


노이즈가 적고 간단하게 플라즈마 내의 전자 온도와 밀도를 계산할 수 있어 많이 선호된다.


사실 이미 모든 파트의 제작이 완료되었다.


DAQ 는 직접 제작하고 싶었으나, 시간 관계로 상용품을 사용하였다.


사용한 제품은 NI 사의 USB-6009 이다.


이 제품은 14BIT 해상도의 48Ksps 의 속도를 가진 adc,


그리고, 12BIT 해상도의 150sps 속도를 가진 dac 로 이루어져있다.


dac 사양이 살짝 모라자 보이지만 50만원 이하라는 나름 경제적인 측면에서 선택하였다.


NI 사의 DAQ 를 쓰면 흔히 랩뷰로 구현하는 걸 상상하지만, 나름 C로도 쉽게 사용할 수 있다.


NI-DAQmx 라는 라이브러리를 제공하는데 mfc 에서 쉽게 불러올 수 있다.


어쨌든 실행 화면은 다음과 같다.



프루브는 다음글에서 잠깐 소개하겠다.


제작된 컨트롤러 박스에 프루브를 물리고, 화면의 RUN 을 돌리면 유명한 DLP 곡선이 그려진다.


여기에 연구자들에게도 마약과 같은 SMOOTH 를 돌려준다. (red line)





사실 SMOOTH 는 너무나도 매혹적이긴 하지만, 남용하면 곤란하다.


특히 그래프의 미분이 필요한 경우, 로 데이타를 smooth 없이 미분하면 결과가 끔찍해진다.


그러나, 많이 돌리면 디테일이 사라진다는 거... 


사용된 알고리즘은 아직도 그 읽는 법이 궁금한 Savitzky- Goray 알고리즘이다.


이 넘이 가장 적당해 보여서 썼는데 구현이 좀 어렵더군.


이거 마음대로 갖다 쓰면 저작권같은게 걸리는거 아닐까 궁금한데, 어쨌든 일단 구현해서 사용하였다.


Calculate 를 누르면, 선형 피팅이 이뤄진 후에, 다음과 같이 밀도와 온도가 계산된다.




DLP analyzer (매트랩용 m파일)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%parameter%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 저항 세팅. 반드시 먼저!!!
R=100000;
%% 데이타 파일이 담겨있는 폴더 지정
folder='F:/meeting/20110902_micp_without_m/1mTorr_EH/pt1/1700w_r/';
%%  양쪽단 저항 앞뒤의 전압을 측정한 4개의 csv 파일이 필요하다.
file1name = 'C2000000.csv';
file2name = 'C2000001.csv';
file3name = 'C2000002.csv';
file4name = 'C2000003.csv';

C_e=1.602*10^(-19);
m_e=9.107*10^(-31);
k = 1.380622*10^(-23);
M_i=6.6423*10^(-26);%Ar의 질량
%M_i=6.6423*10^(-27);%He의 질량
R_probe=0.00015;
L_probe=0.008;
A_probe=2*pi*R_probe*L_probe;
A_r=1+R_probe/(2*L_probe);
alpha_0=0.61;
%alpha_0=0.5;
epsilon=8.854*10^(-12);
k=1.38062*10^(-23); 

quant_step = 500;
data_range = 70;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%data읽어들이기%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 이 다음부터의 코드는 수정할 필요가 없다. !!!!

i1a = strcat(folder,file1name);
i1b = strcat(folder,file2name);
i2a = strcat(folder,file3name);
i2b = strcat(folder,file4name);
I_1a=dlmread(i1a,',',5,0);
I_1b=dlmread(i1b,',',5,0);
I_2a=dlmread(i2a,',',5,0);
I_2b=dlmread(i2b,',',5,0);

time_=I_1a(:,1);
V_raw1=I_1a(:,2);
V_raw2=I_1b(:,2);
V_raw3=I_2a(:,2);
V_raw4=I_2b(:,2);

clear I_1a;
clear I_1b;
clear I_2a;
clear I_2b;

V_raw1 = smooth(V_raw1);
V_raw2 = smooth(V_raw2);
V_raw3 = smooth(V_raw3);
V_raw4 = smooth(V_raw4);

%%%%%%%%%%%%%%%%%%%%%%%%  raw I-V 커브 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

V__raw = V_raw2 - V_raw4;
I__raw=((V_raw1 - V_raw2)/R - (V_raw3 - V_raw4)/R)/2;

clear V_raw1;
clear V_raw2;
clear V_raw3;
clear V_raw4;

maxval = max(V__raw);
if(maxval >= data_range) 
    maxval = data_range;
end;

minval = min(V__raw);
if(minval <= -data_range)
    minval = -data_range;
end

V__quant = linspace(minval,maxval,quant_step);
I__val = zeros(quant_step,1);
I__quant_count = zeros(quant_step,1);

for(i = 1:1:length(V__raw)-1)
    for(j = 1:1:quant_step)
        if(V__raw(i) < -(data_range+quant_step))
            continue;
        end;
        
        if(V__raw(i) > (data_range))
            continue;
        end;
        
        if(V__raw(i) <= V__quant(j))
            I__val(j) = I__val(j) + I__raw(i);
            I__quant_count(j) = I__quant_count(j) + 1;
            break;
        end
    end
end

clear I__raw;
clear V__raw;

for(i = 1:1:quant_step)
    I__val(i) = I__val(i) / I__quant_count(i);
end

clear I__quant_count;

%%%%%%%%%%%%%%%%%%%%%%%%  Data 분석 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

pf1_coef = polyfit(V__quant(1:100),transpose(I__val(1:100)),1);
pf1 = polyval(pf1_coef,V__quant);
I_sat1 = pf1_coef(2);

pf2_coef = polyfit(V__quant(end-99:end),transpose(I__val(end-99:end)),1);
pf2 = polyval(pf2_coef,V__quant);
I_sat2 = pf2_coef(2);

pf3_coef = polyfit(V__quant(quant_step/2 - 50:quant_step/2 + 50),transpose(I__val(quant_step/2 - 50:quant_step/2 + 50)),1);
pf3 = polyval(pf3_coef,V__quant);

Isat = (-I_sat1 + I_sat2)/2;
Islop = pf3_coef(1);


T_ev = Isat / Islop / 2;

C_s=sqrt(T_ev*C_e/M_i);

eta_f=log((1/alpha_0)*sqrt(M_i/(2*pi*m_e)));
beta=1.0*(eta_f^(3/4))*sqrt((epsilon*T_ev*C_e)/(C_e^2));
alpha=Isat/(2*pi*C_e*L_probe*alpha_0*C_s);

n=(2*R_probe*alpha+(beta^2)-sqrt((4*R_probe*alpha*(beta^2))+beta^4))/(2*(R_probe^2));
n=n/1000000;

%%%%%%%%%%%%%%%%%%%%%%%%  Data 출력 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fprintf('##########################################################\n');
fprintf('# DLP data analysis tool\n');
fprintf('# Before you use this val, check the graph!!\n');
fprintf('# made by Kim Hyuk(plasma lab,snu)\n');
fprintf('# comasur@gmail.com\r\n');

fprintf('I saturation : %f, dI/dV : %f \r\n',Isat,Islop);
fprintf('Tev : %f, density : %e \r\n',T_ev,n);


plot(V__quant,I__val,V__quant,pf1,V__quant,pf2,V__quant,pf3);


title('DLP I- V curves');
xlabel('voltage(V)');
ylabel('current(I)');
outfile = strcat(folder,'I_Vcurve.tiff');
print('-dtiff',outfile);


outfile = strcat(folder,'output.csv');
fout = fopen(outfile,'w');
for(j = 1:1:length(V__quant))
fprintf(fout,'%f,%f\r\n',V__quant(j),I__val(j));
end
fclose(fout);

DLP 측정 방법.


#. 두개의 파일이 필요하다. (dlp_average2.m , dlp_calc.m)

1. 오실로스코프로 4개의 파형을 찍는다.

채널당 두개(전류 센싱 저항 앞단, 후단).
DLP는 반드시 FLOATING 되어야 하며, 프루브의 접지는 챔버의 접지에 연결한다.

2. 4개의 파형 저장하여 같은 폴더에 넣고 이를 dlp_average.m 파일로 돌린다.

돌리기 전에  해당 부분을 수정한다

--------------------------------
if(folder=='0')
    folder='F:/meeting/20110426/DLP_DUAL_FREQ/5mTorr/2M_200W/13M_100W/';
end
i1a = strcat(folder,'C11kw00000.csv');
i1b = strcat(folder,'C11kw00001.csv');
i2a = strcat(folder,'C11kw00002.csv');
i2b = strcat(folder,'C11kw00003.csv');

------------------------------

3. 4개의 출력된 파일을 볼 수 있다.

output.csv, raw1.tiff, raw2.tiff, raw3.tiff


  < averaging 을 통해 구한 DLP 의 I-V 파형 > 

4. origin pro 를 이용하여 output.csv 를 import 하고 그래프를 그린다.

5. draw line 을 이용하여 ion saturation 지점을 찾는다. (y축과 만나는 두 지점을 평균한 값)

6. 센터부분만 떼어내서 표로 만든 후에 다시 그래프를 그린다.

7. Fit linear 를 통해서 기울기를 찾는다 I_slop

8. 두 값을 dlp_calc() 에 대입하여 전자온도와, 플라즈마 밀도를 구할 수 있다.

 
 

 
prev 1 next