Skip to content

Instantly share code, notes, and snippets.

@3Nigma
Last active December 15, 2015 06:29
Show Gist options
  • Save 3Nigma/5216576 to your computer and use it in GitHub Desktop.
Save 3Nigma/5216576 to your computer and use it in GitHub Desktop.
[eAh-AVR1934] Script de extragere a modelului matematic pentru termistorul plăcuței ATXMEGAA3BU-XPLD
(*Autor : Victor ADĂSCĂLIȚEI [2013], Scris pentru Mathematica v8;
Descriere :
Secvența de cod a fost folosită pentru construirea de
modele matematice liniare [polinoame de gradul 1] în
vederea extinderii capacității plăcuței Atmel XMEGA-A3BU
Xplained de a citi temperatura ambientală.
Principiul poate fi folosit pentru calcularea polinoamelor
de aproximare si pentru alte familii de termistori pentru
care exista informatii extinse precum foi de catalog din
care să poată fi calculat parametrii modelului
Steinhart-Hart folosiți în algoritm.*)
(*configurăm diverși parametrii necesari codului*)
tensiuneRefADC = 3.3;
nrBitiADC = 12;
tempMinimaTermistor = -40;
tempMaximaTermistor = 125;
abatereMaximaPermisa = 1.00;
(*încărcăm parametrii modelului Steinhart-Hart pentru termistori*)
a := 7.954*10^-4;
b := 2.1406*10^-4;
c := 6.1563*10^-8;
(*încărcăm modelul Steinhart-Hart*)
y[T_] := (a - 1/(T + 273.15))/(2*c);
x[T_] := Sqrt[(b/(3*c))^3 + y[T]^2];
RT[T_] := Exp[((x[T] - y[T])^(1/3) - (x[T] + y[T])^(1/3))];
(*Atenție! A se modifica parametrii divizorului de tensiune după necesitate*)
UT[T_] := N[3.3*RT[T]/(RT[T] + 470000), 3];
(*căutăm modele liniare de aproximare pe secțiuni a datelor ADC disponibile*)
modeleLiniareDeduse = {};
subDate = {};
valADCMinimaPerModel = Round[UT[tempMinimaTermistor]/tensiuneRefADC*2^nrBitiADC];
For[temp = tempMinimaTermistor, temp <= tempMaximaTermistor, temp++,
valoareADC = Round[UT[temp]/tensiuneRefADC*2^nrBitiADC];
AppendTo[subDate, {valoareADC, temp}];
modelCurent = Fit[subDate, {1, x}, x];
If[Length[subDate] > 1,
(*avem cel puțin 2 puncte în vectorul de subDate*)
For[id = Length[subDate], id >= 1, id--,
tempCurenta = subDate[[id, 2]];
vADCCurent = subDate[[id, 1]];
If[Abs[tempCurenta - modelCurent /. x -> vADCCurent] >
abatereMaximaPermisa || (temp == tempMaximaTermistor && id == 1),
(*eroarea maximă admisă a fost depășită de către modelul curent!*)
(*salvează ecuația matematică asociată modelului precedent și reinițializează
vectorul de date pentru următaorea porțiune *)
vADCCurentPerModel = Round[UT[temp]/tensiuneRefADC*2^nrBitiADC];
AppendTo[modeleLiniareDeduse, {Fit[Drop[subDate, -1], {1, x}, x],
valADCMinimaPerModel, vADCCurentPerModel}];
subDate = {Last[subDate]};
valADCMinimaPerModel = vADCCurentPerModel;
Break[];
]
]
]
]
(*afișăm modelele astfel obținute alături de domeniile lor*)
Column[modeleLiniareDeduse]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment