function [ z ] = provac( file,data,vSoglia,er2Max )
%PROVAC Esecuzione della prova C
% Vengono eseguiti automaticamente tutti i calcoli
% relativi alla prova C di laboratorio.
%Caricamento dati
prn=load(file);
t=prn(:,1);
vce=prn(:,2);
vr=prn(:,4);
dati=load(data);
vcemax=dati(1);
R1=dati(2);
vbeSat=dati(3);
ib=dati(4);
%Correzione dell'errore di offset
eo=max(vce)-vcemax;
vce=vce-eo;
%Distinzione valori crescenti e decrescenti
ic=vr/R1;
DicProva=diff(ic);
[Fic,Dic]=filtra(ic);
[pos,neg]=posneg(Dic);
vceNeg=vce(neg);
icNeg=ic(neg);
%Interpolazione lineare
i=find(vceNeg>1);
x=vceNeg(i);
y=icNeg(i);
[m,n]=minquad(x,y);
e=max(abs(y-m*x-n));
er=e/max(icNeg)*100;
icLin=m*vceNeg+n;
%Selezione dei dati
%Estrazione tratto esponenziale
i=find(vceNeg>vSoglia);
vceSoglia=vceNeg(i);
icSoglia=icNeg(i);
x1=vbeSat-vceSoglia;
y1=-icSoglia+icLin(i);
%Estrazione tratto Ic>0
[x1,i]=sort(x1);
y1=y1(i);
i=find(y1<0);
inizio=max(i)+1;
fine=length(y1);
x1=x1(inizio:fine);
y1=y1(inizio:fine);
%Riduzione effetto quantizzazione
%Inizializzazione
fine=length(y1);
er2=er2Max+1;
i=1;
%Ciclo per riduzione errore relativo
while er2>er2Max
x2=x1(i:fine);
y2=y1(i:fine);
logy=log(y2);
[q,p]=minquad(x2,logy);
p=exp(p);
yLin=p*exp(q*x2);
e2=max(abs(logy-log(yLin)));
er2=e2/max(icNeg)*100;
if i==10
error('Aumentare er2Max');
end
i=i+1;
end
%Verifica modello
vceMod=linspace(vSoglia,max(vce),1000);
icMod=m*vceMod+n-p*exp(q*(vbeSat-vceMod));
%Parametri
iceo=p;
betaF=(n-p)/ib;
va=(n-p)/m;
etavt=1/q;
plot(ic);
xlabel('campioni');
ylabel('Ic [mA]');
title('Corrente di collettore');
pause;
plot(DicProva);
xlabel('campioni');
title('Andamento approssimato della derivata della corrente di collettore');
pause;
plot(Fic);
xlabel('campioni');
ylabel('Ic [mA]');
title('Corrente di collettore filtrata passa basso');
pause;
plot(Dic);
xlabel('campioni');
title('Andamento approssimato della derivata della corrente di collettore filtrata');
pause;
plot(t,ic), hold on, plot(t(neg),ic(neg),'ro'), hold off;
xlabel('t [s]');
ylabel('Ic [mA]');
title('dIc/dt<0');
pause;
plot(vceNeg,icNeg,'.');
xlabel('Vce [V]');
ylabel('Ic [mA]');
title('Caratteristica sperimentale');
pause;
plot(vceNeg,icNeg,'+',vceNeg,icLin,'r-');
xlabel('Vce [V]');
ylabel('Ic [mA]');
title('Verifica dell''interpolazione lineare');
pause;
plot(vceNeg,icNeg,'+',vceSoglia,icSoglia,'ro');
xlabel('Vce [V]');
ylabel('Ic [mA]');
title('Verifica del valore di soglia');
pause;
plot(vceNeg,icNeg,'+',vceMod,icMod,'r-');
xlabel('Vce [V]');
ylabel('Ic [mA]');
title('Verifica del modello e visualizzazione parametri');
ax=axis;
xlabel('Vce [V]');
ylabel('Ic [mA]');
riga1=[' ICEO=' num2str(iceo) ' mA'];
riga2=['BETAF=' num2str(betaF) ' '];
riga3=['VA=' num2str(va) ' V'];
riga4=['ETA*VT=' num2str(etavt) ' V'];
riga5=['Er=' num2str(er) ' V'];
riga6=['Er2=' num2str(er2) ' V'];
text(ax(2)-ax(2)*1/10,ax(4)-ax(4)*1/7,riga1,'HorizontalAlignment','right');
text(ax(2)-ax(2)*1/10,ax(4)-ax(4)*2/7,riga2,'HorizontalAlignment','right');
text(ax(2)-ax(2)*1/10,ax(4)-ax(4)*3/7,riga3,'HorizontalAlignment','right');
text(ax(2)-ax(2)*1/10,ax(4)-ax(4)*4/7,riga4,'HorizontalAlignment','right');
text(ax(2)-ax(2)*1/10,ax(4)-ax(4)*5/7,riga5,'HorizontalAlignment','right');
text(ax(2)-ax(2)*1/10,ax(4)-ax(4)*6/7,riga6,'HorizontalAlignment','right');
stringa=['Numero di campioni scartati nella seconda interpolazione: ' num2str(i-1)];
disp(stringa);
pause;
bjt(iceo,2,etavt,betaF,va,vce,vbeSat,ib);
pause;
close;