Forum: Mikrocontroller und Digitale Elektronik NTC Berechnung am XMega128


von Axe (Gast)


Lesenswert?

Ich möchte einen ADC_result umrechnen auf kOhm. Und diesen kOhm auf C 
Grad. Folgende Formel habe ich hierfür. Von Hand gerechnet kommt das 
richtige raus. ADC_result ist 1400 und rauskommen sollte 22-23 Grad.

PullDown = 1M
NTC bei 25 = 100k
12Bit = 4095
Ref = 1V
Vcc = 3,3V

B Wert vom NTC = 4485


wert = 1000000*((1/4095)*ADC_result)/(3.3-((1/4095)*ADC_result));
temp = ((4485*298.15)/(4485+(log10(wert/100000)*298.15)))-273.15;


Schaft der uC diese Berechnung nicht? Möchte das ohne 
Temperaturstützpunkte programmieren.

von Karl H. (kbuchegg)


Lesenswert?

Axe schrieb:

> wert = 1000000*((1/4095)*ADC_result)/(3.3-((1/4095)*ADC_result));

Dir ist aber schon klar, dass zb 1/4095 eine glatte 0 ergibt?

Stell halt mal deine Formeln ein wenig um, so dass es a) weniger zu 
rechnen gibt und b) du nicht in arithmetische Fallen läufst.

zb ist es recht sinnlos ein Ergebnis mal 1000000 zu nehmen, nur um es 
dann im nächsten Schritt wieder durch 100000 zu dividieren.

von Erich (Gast)


Lesenswert?

"von Hand gerechnet", aha.
Mit Nutzung von Logarithmen Tafeln oder hast du gar einen Rechenschieber 
benutzt?

von Axe (Gast)


Lesenswert?

Egal wie weit ich den rechenaufwand für den uC verkleinere, das 1/4095 
bzw. wert/100000 bleibt bestehen. Und das funktioniert ja nicht.
Gibt vielleicht noch einen anderen Lösungsmöglichkeit?

von Olaf (Gast)


Lesenswert?

> Gibt vielleicht noch einen anderen Lösungsmöglichkeit?

Natuerlich. Nimm dies:

   http://de.wikipedia.org/wiki/Festkommazahl

Olaf

von Peter (Gast)


Lesenswert?

Axe schrieb:
> wert = 1000000*((1/4095)*ADC_result)/(3.3-((1/4095)*ADC_result));

ein kleiner Tipp: Multipliziere die ganze Gleichung mal mit 4095

von Martin B. (statler)


Lesenswert?

Viel zu umständlich!

Wenn du die Schaltung sinnig wählst, kommst du mit einem einfachen 
Dreisatz aus.
Schalte den NTC gegen Masse und mit einem Vorwiederstand nach Vref
Wähle den Vorwiederstand so, dass er dem Widerstand des NTC in der Mitte 
des interessierende Temperaturbereiches entspricht.
Die Kennlinei der NTC it auf diese Schaltung optimiert, so dass sich 
jetzt eine (fast) lineare Spannungs-Temperaturkennlinie ergibt.

z.B. Wenn der Vorwiderstand nach dem R20 gewählt wird, reicht der 
Bereich mit einem Fehler unter 1°C von ca. 0°C bis ca. 50°C

Die Gerade hat übrigens eine negative Steigung :)

von ha. (Gast)


Lesenswert?

Die division ist uebrigens durch 4096, macht shift 12 nach rechts. und 
den Dreisatz ober wuerd ich streichen. Nimm den logarithmus.

von Helmut S. (helmuts)


Lesenswert?

>wert = 1000000*((1/4095)*ADC_result)/(3.3-((1/4095)*ADC_result));

Müsste da nicht 1.0 statt der 3.3 stehen.

wert = ((1/4095.0)*ADC_result)/(1.0-((1/4095.0)*ADC_result));

Die Variable "wert" muss natürlich vom Typ "float" oder "double" sein.

: Bearbeitet durch User
von Axe (Gast)


Lesenswert?

Die intere Ref Spannung ist 1V. Der Spannungsteiler arbeitet mit 3,3V.

Mit float variablen und komplette zerstückelung der Formel hat es 
geklappt.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Axe schrieb:
> Die intere Ref Spannung ist 1V. Der Spannungsteiler arbeitet mit 3,3V.

Das ist schon mal Mist. Lege sowohl Referenz als auch 
NTC-Spannungsteiler auf dasselbe Potenzial. Um den ADC des XMEGA nicht 
zu überfahren und maximale Dynamik zu haben, bieten sich externe 2V an. 
Kann man z.B. mit einem LP2951 machen.

von Helmut S. (helmuts)


Lesenswert?

So sieht das bei meinem Temperaturmesser mit ATMEGA8 aus.
1
...
2
  ADC_val_i = ADCW & 0x3ff; // Read 10bit
3
  ADC_val_d = (double)ADC_val_i/CalFact;
4
  R_ntc = Rv*ADC_val_d/(1-ADC_val_d);
5
6
  T_ntc = B_NTC/(log(R_ntc/R25)+B_NTC/(T25+Kelvin))-Kelvin; 
7
8
  dtostrf(T_ntc, 6, 2, ADC_val);    
9
  lcd_set_cursor (1, 4); 
10
  lcd_write(ADC_val);  
11
...
Da ist man echt froh, dass es für viele Mikrocontrollerfamilien 
kostenlose C-compiler und IDEs gibt.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.