Motståndsberäknare
Postat: 14 oktober 2007, 00:41:56
Det sägs att nöden är uppfinningarnas moder och det stämmer i detta fall. Den senaste tiden har jag räknat ganska mycket på OP-kopplingar med filter. Problemet har varigt att det är ganska många motstånd som är inblandade för att få rätt förstärkning. Detta tillsammans med att jag inte direkt vet vilka motstånd jag har hemma har gjort det svårt att hitta rätt motstånd. Därför har jag nu slängt ihop ett MATLAB skript som räknar igenom alla alternativ utifrån en viss motståndsserie och presenterar de motstånd som ger rätt förstärkning.
Skriptet är inte det vackraste men det fungerar (kanske:). Skriptet fungerar så här:
Den läser in en Excel-fil med motståndsserier:
Sen editerar man m-skriptet så det passar.
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.
Skriptet ovan ger följande resultat:
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