Temperaturausgabe LCD Festkommaarithmetik

OP (Firma: Angestellter/Freelancer) #2371098
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
}
#2371138
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()
#2371154
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.
#2371162
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)
#2371167
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren