Forum: Mikrocontroller und Digitale Elektronik Temperaturausgabe LCD Festkommaarithmetik


von Zero V. (Firma: Freelancer) (gnd)


Lesenswert?

Hallo,

ich brauche Eure Unterstützung!
Ich habe einen NTC-Widerstand an den ADC angeschlossen und der µC 
ermittelt
mit Hilfe der gemessenen Spannung und der Steinhart-Hart Gleichung die 
Temperatur.

Die Temperatur wird in °C auf ein LCD ausgegeben. Soweit funktioniert es 
auch...
aber nur die Vorkommastellen werden angezeigt [Bsp. 25].

Ich möchte aber eine Kommazahl ausgeben lassen [Bsp. 00,00].

Ich habe mich über Festkommaarithmetik und ftoa() informiert, kann es 
aber nicht
konkret auf mein Projekt anwenden.

Probleme:

-Datentyp der Konstanten bzw. Variablen und deren Genauigkeit (zu genau, 
falscher Typ)

-Anwendung der Festkommaarithmetik auf die Formeln  (vorallem T=...) ???

Vielen Dank für jedwede Hilfe!

(bitte keine Verweise auf G..gle)
1
//Atmega32, 16MHz, RN-Control
2
3
#include <avr/io.h>
4
#include "lcd-routines.h"
5
#include <util/delay.h>
6
#include <math.h>
7
#include <stdlib.h>
8
 
9
int main(void)
10
{
11
12
const double A1= 0.003354016;
13
const double B1= 0.0002569850;
14
const double C1= 0.000002620131;
15
const double D1= 0.00000006383091;
16
17
double Vin;
18
19
double Analog;
20
21
double T;
22
23
double Rx;           
24
25
double R;
26
27
double Rref=9810;
28
29
char Buffer[25];
30
31
lcd_init();
32
33
ADCSRA |=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
34
//ADC Grundeinstellungen
35
36
while(1)
37
{
38
39
 ADCSRA |=(1<<ADSC);
40
41
 while(ADCSRA & (1<<ADSC))
42
 {;}
43
44
 Analog=ADC;
45
46
 Vin=(Analog*5)/1024;
47
48
 R=((5-Vin)/Vin)*Rref; //R(NTC)-Widerstand
49
50
 Rx=R/Rref;
51
52
 T=1/(A1+B1*log(Rx)+C1*log(Rx)*log(Rx)+D1*log(Rx)*log(Rx)*log(Rx));
53
 // Steinhart-Hart Gleichung
54
 
55
 T=T-273.15; //Konvertierung in °C
56
57
 lcd_setcursor(0,1);
58
59
 itoa(T,Buffer,10);
60
61
 lcd_string(Buffer);
62
 
63
 _delay_ms(500);
64
  
65
}
66
 return 0;
67
}

von Karl H. (kbuchegg)


Lesenswert?

Marvin B. schrieb:

> Ich habe mich über Festkommaarithmetik und ftoa() informiert, kann es
> aber nicht
> konkret auf mein Projekt anwenden.

da du sowieso schon double benutzt, kannst du ruhig auch ftoa benutzen.
Was genau verwirrt dich an ftoa? Funktioniert fast genauso wie itoa.

von Karl H. (kbuchegg)


Lesenswert?

1
T=1/(A1+B1*log(Rx)+C1*log(Rx)*log(Rx)+D1*log(Rx)*log(Rx)*log(Rx));

Du musst aber nicht für deinen µC eine Bschäftigungstherapie machen, 
indem du ihn 6 mal den Logarithmus von einem immer gleichen Wert 
ausrechnen lässt.

von Zero V. (Firma: Freelancer) (gnd)


Lesenswert?

Karl Heinz Buchegger schrieb:
> ftoa?

Ja theoretisch, aber es kommt immer eine "implicit decleration of ..." 
Fehlermeldung. Habe gelesen ich muss irgendwo etwas Linken ???
Aber in so etwas bin ich nicht geübt!

von Zero V. (Firma: Freelancer) (gnd)


Lesenswert?

Karl Heinz Buchegger schrieb:
> 6 mal den Logarithmus von einem immer gleichen Wert

Wäre eine Variable=log(..) besser?

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Marvin B. schrieb:
>
>> Ich habe mich über Festkommaarithmetik und ftoa() informiert, kann es
>> aber nicht
>> konkret auf mein Projekt anwenden.
>
> da du sowieso schon double benutzt, kannst du ruhig auch ftoa benutzen.
> Was genau verwirrt dich an ftoa? Funktioniert fast genauso wie itoa.

Mein Fehler. Ich hab nicht mitgedacht. Ein ftoa gibt es ja gar nicht. Du 
brauchst dtostrf()

von Zero V. (Firma: Freelancer) (gnd)


Lesenswert?

Marvin B. schrieb:
> itoa(T,Buffer,10);

Diesen Abschnitt durch dtostrf(T,Buffer,10) ersetzen oder andere 
Übergabeparameter ?

von Falk B. (falk)


Lesenswert?

Siehe Festkommaarithmetik

MFG
Falk

von Karl H. (kbuchegg)


Lesenswert?

Marvin B. schrieb:
> Marvin B. schrieb:
>> itoa(T,Buffer,10);
>
> Diesen Abschnitt durch dtostrf(T,Buffer,10) ersetzen oder andere
> Übergabeparameter ?

Wie wärs wenn du die Funktion ergoogelst um zu sehen welche Parameter 
sie haben will? Bei einer Gleitkommazahl gibt es noch mindestens einen 
Parameter mehr, der interessant ist: wieviele Nachkommastellen will man 
haben. Dafür sind die letzten 10 von itoa wieder eher uninteressant. 
Kein Mensch wird sich eine Gleikommazahl in Hexadezimal oder einem 
anderen Zahlen-System ausgeben lassen.

von Zero V. (Firma: Freelancer) (gnd)


Lesenswert?

Marvin B. schrieb:
> (bitte keine Verweise auf G..gle)

von Karl H. (kbuchegg)


Lesenswert?

Marvin B. schrieb:
> Marvin B. schrieb:
>> (bitte keine Verweise auf G..gle)

Gut. Dann nicht.
Wie wärs mit einem C-Buch


(Wir werden hier nicht für dich Abhandlungen über ein Thema schreiben, 
dass du problemlos und ausführlich in jedem Buch und/oder wahlweise in 
15 Sekunden ergoogeln kannst. Sorry. Ein wenig Eigeninitiative wird von 
dir erwartet. Was machst du, wenn die nächste Funktion ansteht, die du 
noch nie benutzt hast? Du kriegst gerne einen Funktionsnamen als 
Stichwort. Bei komplexeren Dingen auch mal eine Erklärung dazu. Aber im 
Allgemeinen Fall musst du lernen, dir mit einem Stichwort selbst zu 
helfen. Das ist heute einfacher als je zuvor)

von Zero V. (Firma: Freelancer) (gnd)


Lesenswert?

dtostrf(double __val,signed char __width,unsigned char __prec, char* 
__s)

dtostrf(double T,signed char ????? ,unsigned char 2, Buffer)

????? diesen Parameter verstehe ich nicht aus der Beschreibung?

von Karl H. (kbuchegg)


Lesenswert?

Marvin B. schrieb:
> dtostrf(double __val,signed char __width,unsigned char __prec, char*
> __s)
>
> dtostrf(double T,signed char ????? ,unsigned char 2, Buffer)
>
> ????? diesen Parameter verstehe ich nicht aus der Beschreibung?

OK.

val     ist klar. Das ist der Wert
width   wieviele Zeichen soll die Ausgabe insgesammt maximal breit
        sein.
        Das ist inklusive eines möglichen Vorzeichens und des
        Kommapunktes
prec    wieviele Zeichen von width sollen hinter dem Komma sein
s       buffer in den der String geschrieben werden soll (wie bei itoa)


  -78.345

wären also   width -> 7
             prec  -> 3

damit sind dann alle Zahlen von -99.999 bis +99.999 abbildbar. dennn 
alle diese Textrepräsentierungen benötigen 7 Zeichenpositionen. Wenn, 
wie zb bei 0.000 die 7 Zeichen nicht aufgebraucht werden, wird links mit 
Leerzeichen aufgefüllt.

von Zero V. (Firma: Freelancer) (gnd)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wie wärs mit einem C-Buch

In meinen Dreien steht diesbezüglich nichts, oder zw. den Zeilen...

von Zero V. (Firma: Freelancer) (gnd)


Lesenswert?

Karl Heinz Buchegger schrieb:
> -78.345
>
> wären also   width -> 7
>              prec  -> 3

Vielen Dank für das Beispiel! So etwas liefert G..gle nicht ohne ...

von Karl H. (kbuchegg)


Lesenswert?

Marvin B. schrieb:
> Karl Heinz Buchegger schrieb:
>> -78.345
>>
>> wären also   width -> 7
>>              prec  -> 3
>
> Vielen Dank für das Beispiel! So etwas liefert G..gle nicht ohne ...

Na ja. Wer die Formatangabe in printf kapiert hat, sollte damit 
eigentlich kein Schwierigkeiten haben. Ist bei Floating Point genau 
gleich, nur anders geschrieben.

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.