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.
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 Hand gerechnet", aha. Mit Nutzung von Logarithmen Tafeln oder hast du gar einen Rechenschieber benutzt?
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?
> Gibt vielleicht noch einen anderen Lösungsmöglichkeit? Natuerlich. Nimm dies: http://de.wikipedia.org/wiki/Festkommazahl Olaf
Axe schrieb: > wert = 1000000*((1/4095)*ADC_result)/(3.3-((1/4095)*ADC_result)); ein kleiner Tipp: Multipliziere die ganze Gleichung mal mit 4095
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 :)
Die division ist uebrigens durch 4096, macht shift 12 nach rechts. und den Dreisatz ober wuerd ich streichen. Nimm den logarithmus.
>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
Die intere Ref Spannung ist 1V. Der Spannungsteiler arbeitet mit 3,3V. Mit float variablen und komplette zerstückelung der Formel hat es geklappt.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.