Ich möchte ein Thermometer mit einem NTC bauen.
Aber die Berechnung der Temperatur funktioniert nicht. Ich möchte den
ADC Wert ermitteln(klappt), Die Temperatur daraus ausrechnen (klappt
nicht), und die Temperatur per RS232 an meinen Laptop schicken(klappt).
Bei meinem Laptop kommt immer nur "25.01" oder "-273,15" an.
Am ADC ist der NTC und ein 10k Pullup angeschlossen.
Das ist der Code:
1
#define F_CPU 1000000
2
3
#include <stdio.h>
4
5
//#include <avr/interrupt.h>
6
7
8
//#include "General.h"
9
10
#include "RS232.c"
11
12
#include <util/delay.h>
13
14
#include <math.h>
15
16
//#include "RS232.h"
17
18
//#include "Delay.h"
19
20
uint16_t ADC_Read(uint8_t channel)
21
22
{
23
24
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
25
26
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
27
28
while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
Ist "ln" nicht der Logarithmus und über welchen Temperaturbereich soll
die Messung sein ?
Welche Werte nimmt "raw" an, also bevor es in die Temperatur umgerechnet
wird.
Einfacher als diese Floatberechnung wäre erstmal eine Tabelle, die für
einen bestimmten ADC-Wert den entsprechenden Temperaturwert hat.
Hast Du auch dem Linker gesagt, dass er die Floating-Point Bibliothek
mit einbinden soll?
Sebastian Deppisch schrieb:> #include "RS232.c"
Btw., C-Programme werden nicht included
Moin,
ich kenn mich nich so genau mit dem AVR aus, aber die math.h lib hat
meines Wissens keine "ln" Funktion, sondern nur eine "log" bzw. "log10"
Funktion. Das entspricht auch so in etwa dem Original der Formel aus der
Lego-NXT Sammlung. Also mal ausprobieren:
=(1282088/(4300+LOG(RAW/(1023-RAW))*298,16))-273,15
ABER, hast Du auch den gleichen NTC-Widerstand ??
Peter schrieb:> Moin,>> ich kenn mich nich so genau mit dem AVR aus, aber die math.h lib hat> meines Wissens keine "ln" Funktion, sondern nur eine "log" bzw. "log10"
log IST der ln
1
raw/(1023-raw)
einfach mal mit Ganzzahlarithmetik ausprobieren, was da rauskommt.
Oder um es so zu sagen: Wenn er auf dem Taschenrechner diesen
Teilausdruck hier ausrechnet, dann nach der Division alle Kommastellen
wegwerfen. Dann sieht sein Ergebnis auf dem Taschenrechner nämlich auch
plötzlich ganz anders aus. Zb wird alles für raw kleiner 512 zu einer
schnöden 0 (was für den ln dann wieder gar nicht gut ist)
Karl heinz Buchegger schrieb:> log IST der ln
Danke für den Hinweis. Der OP hat aber "ln" in seiner Berechnung. Das
sollte doch eher schief gehen, oder ?
Der Hinweis mit der Ganzzahlarithmetik ist deshalb interessant, weil
jetzt auch klar wird, warum "MaWin" vorgeschlagen hat, mit 1023.0 zu
rechnen. Dadurch wird der gesamte Ausdruck eine Floatberechnung. Oder
sehe ich das falsch ?
Peter schrieb:> Karl heinz Buchegger schrieb:>> log IST der ln>> Danke für den Hinweis. Der OP hat aber "ln" in seiner Berechnung. Das> sollte doch eher schief gehen, oder ?
Nochmal:
In Programmiersprachen ist die Funktion log der Logarithmus zur Basis e
(vulgo der 'natürliche Logarithmus', vulgo ln). Der Logarithmus zur
Basis 10 schreibt sich meistens log10.
> jetzt auch klar wird, warum "MaWin" vorgeschlagen hat, mit 1023.0 zu> rechnen. Dadurch wird der gesamte Ausdruck eine Floatberechnung. Oder> sehe ich das falsch ?
Das siehst du richtig.
Also es funktioniert jetzt.
Vielen Dank.
Und µC Programmieren klappt bei mir jetzt auch unter Linux.
@Peter
Woher hast du die Formel?
Die ist doch von meiner Homepage, und die Formel hab ich so erstellt.
http://mylegopage.my.funpic.de/index.php?page=selbstbau&sub=ntc-nxt
Und da es meine ist, hab ich sogar nicht nur den gleiche, sondern auch
den selben NTC ;)
Sebastian Deppisch schrieb:> Woher hast du die Formel?> Die ist doch von meiner Homepage, und die Formel hab ich so erstellt.
Was immer du damit sagen willst - es gibt eine Formel für das Verhalten
eines NTC, die steht in Wikipedia und in jedem einschlägigen Datenblatt.
Die muss man für die Anzeige nach T auflösen, und wie das halt in der
Mathematik so ist, kommt dabei IMMER das Gleiche heraus. U.a. deswegen
gibt es auch keine Patente auf mathematische Formeln, jedenfalls bisher
nicht.
Gruss Reinhard
Das ist mir schon klar, aber
"=(1282088/(4300+LOG(RAW/(1023-RAW))*298,16))-273,15"(so wie Peter es
geschrieben hat) Habe ich so auf meiner Homepage stehen.