Skriptet är inte det vackraste men det fungerar (kanske:). Skriptet fungerar så här:
Den läser in en Excel-fil med motståndsserier:
Kod: Markera allt
"Motstånd.xls"
E12 Hemma
10 10
12 56
15 200
21 470
27 560
33 1200
39 1500
47 2000
56 ...
68
82
...
Man ändar:
Namnet på serien man vill använda tex. 'Hemma'.
Uttrycket man vill beräkna (i string format). Tex om man vill beräkna en icke-inverterande op så skriver man '1+( Hemma(i) / Hemma(j))'.
Vilken förstärkning man vill ha tex. 9.5 ggr.
Sen kan man ange en tolerans på svaren tex. +/- 1 %
Man anger även min och max resistanser om man inte vill använda hela serien.
Sen är det bara att köra igång skriptet. Man kan använda upp till 4 variabler i uttrycket. Det är nog bara fantasin, tiden och Matlab som sätter begränsningar i hur avancerat uttrycket kan vara.
Kod: Markera allt
%MATLAB skript:
clear
clc
tic
%%%%%%%%%%%%%%%%% EDIT %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[ndata, headertext] = xlsread('Motstånd.xls'); % Excel file with the resistor series. example: [ndata, headertext] = xlsread('Motstånd.xls')
Serie='E12'; %Name of the series you want to use example: Serie='E12';
uttryck='1+(E12(i)/E12(j))'; %Writh the expresion example: uttryck='(E12(i)+ E12(j))/E12(k)'; The script supports up to 4 varibles, i,j,k,l
AntalTal=2; % number of varibles
Amplification=9.5; % The result for the expresion
tolerans=1; % Tolerance for the result in +/-%
minresistance=100; %Min Resistance
maxresistance=1000000; %Max Resistance
%%%%%%%%%%%%%%%%% END EDIT %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%result=zeros(1, AntalTal+2);
r=1;
f=['i' 'j' 'k' 'l' 'm' 'n' 'o' 'p'];
min=NaN;
max=NaN;
for i=1:length(ndata(1,:))
assignin('base',cell2mat(headertext(:,i)),ndata(:,i)');
eval([cell2mat(headertext(:,i)) '=' cell2mat(headertext(:,i)) '(~isnan(' cell2mat(headertext(:,i)) '));']);
end
for i=1:length(eval(Serie))
if (eval([Serie '(' num2str(i) ')'])>=minresistance) & isnan(min)
min=i;
end
if (eval([Serie '(' num2str(i) ')'])>=maxresistance) & isnan(max)
max=i;
end
end
if isnan (max) & ~isnan(min)
eval([Serie '=' Serie '(' num2str(min) ':length(' Serie '));']);
elseif isnan (min) & ~isnan(max)
eval([Serie '=' Serie '(1:' num2str(max) ');']);
elseif isnan(min) & isnan(max)
eval([Serie '=' Serie '(1:length(' Serie '));']);
else
eval([Serie '=' Serie '(' num2str(min) ':' num2str(max) ');']);
end
l=0;
tolupper=(Amplification + Amplification*tolerans/100)
tollower=(Amplification - Amplification*tolerans/100)
while l<length(eval(Serie))
k=0;
l=l+1;
while k<length(eval(Serie))
j=0;
k=k+1;
while j<length(eval(Serie))
i=0;
j=j+1;
while i <length(eval(Serie))
i=i+1;
if (AntalTal==2)
l=length(eval(Serie));
k=length(eval(Serie));
elseif (AntalTal==3)
l=length(eval(Serie));
end
ratio(l,k,j,i)=eval(uttryck);
if((ratio(l,k,j,i)<=tolupper) & (ratio(l,k,j,i)>=(tollower)))
str='';
for a=1:AntalTal
str= [str Serie '(' f(a) ') ' ];
end
result(r,:) =[eval([ '[' str ']']) 0 ratio(l,k,j,i)];
r=r+1;
end
end
end
end
end
toc
openvar('result')
Kod: Markera allt
3300 390 9.4615
33000 3900 9.4615
330000 39000 9.4615