Last active
December 15, 2015 06:29
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(*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