Forum: Mikrocontroller und Digitale Elektronik NTC Berechnung am XMega128


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Axe (Gast)


Bewertung
0 lesenswert
nicht 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) (Moderator)


Bewertung
0 lesenswert
nicht 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)


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

von Axe (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
> Gibt vielleicht noch einen anderen Lösungsmöglichkeit?

Natuerlich. Nimm dies:

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

Olaf

von Peter (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Moderator

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.