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 | }
|