Forum: Mikrocontroller und Digitale Elektronik NTC- Lichtmessung- AT-Mega88


von Tim K. (tkrzyzan)


Angehängte Dateien:

Lesenswert?

Hallöchen zusammen,
ich wollte mithilfe von einem MiniMexleBoard(Platine bestückt mit einem 
At Mega88, LC-Display und ein paar weiteren Bauteilen) eine 
Temperaturmessung mithilfe von einem NTC machen. Nun zu meinem Problem 
ich hab jetzt die Werte des NTC(als Spannungsteiler verschalten) bzw die 
Spannung an meinem Mikrocontroller von einem Analogen in einen Digitalen 
Wert umgewandelt. Dies funktioniert auch und wird auf meinem LC-Display 
ausgegeben. Aber eben nur der Digitalwert(0-1024) wie wandle ich diesen 
jetzt in eine entsprechende Temperatur um? Ich hab auch schon eine 
Tabelle in der ich berechnet habe welcher Digitalwert welcher Spannung 
bzw welcher Temperatur entsprechen, aber was mach ich nun damit?

Hier mal mein Quellcode:
1
#ifndef F_CPU
2
#define F_CPU 18432000UL
3
#endif
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include "lcd_lib_de.h"
8
#include <stdio.h>
9
10
void initDisplay();
11
void initADC();
12
void initTimer();
13
void abrufzaehler();
14
void abruflcd();
15
int Tempwert;
16
17
// Variablen für Zähler
18
unsigned char takt1 = 0;
19
unsigned char takt10 = 0;
20
unsigned char takt100 = 0;
21
unsigned char takt1000 = 0;
22
unsigned char flag1 = 0;
23
24
25
26
27
int main()
28
  {
29
    initDisplay();
30
    initADC();
31
    initTimer();
32
33
    while(1);
34
  }
35
36
void initADC()
37
  {
38
    ADMUX  = (0<<REFS1) | (1<<REFS0)| (1<<MUX2); //ADC4(MUX 0100) Referenzspannung Netzteil(REF 01)
39
    ADCSRA  = (1<<ADEN)/*ADC An*/  | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
40
    
41
    
42
  }
43
44
void initDisplay() 
45
  {
46
    lcd_init();
47
48
    lcd_gotoxy(0,0); //schreiben in erste Zeile
49
    lcd_putstr("NTC");
50
  
51
    lcd_gotoxy(1,0); //schreiben in zweiten Zeile
52
    lcd_putstr("LED");
53
54
  }
55
56
void initTimer()
57
{
58
  TCCR0A  |= (1<<WGM01); // Betriebsmodus auf CTC setzen
59
  TCCR0B  |= (1<<CS00) | (1<<CS02);//Prescaler setzen
60
  OCR0A    = 17; //Zählt bis 18 und gibt dann erst eine Flanke aus
61
  TIMSK0  |=(1<<OCIE0A);//Interrupt wird aufgerufen
62
  sei();
63
64
}
65
66
ISR(TIMER0_COMPA_vect)// Interrupt jede 1ms aufrufen
67
{
68
  takt1++;
69
  if(takt1==10) 
70
  {
71
    takt1 = 0;
72
    takt10++;
73
  }
74
  if(takt10==10) 
75
  {
76
    takt10 = 0;
77
    takt100++;
78
  }
79
80
  if(takt100==10)
81
  {
82
    takt100=0;
83
    takt1000++;
84
    flag1 = 1;
85
  }
86
87
88
89
abrufzaehler();
90
}
91
92
void abrufzaehler()
93
{
94
  if(takt1000==1)//Jede Sekdunde abrufen
95
  {
96
    takt1000=0;
97
    ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
98
      while (ADCSRA & (1<<ADSC) );
99
100
      Tempwert = ADCW;
101
    abruflcd();
102
  }
103
}
104
105
void abruflcd() //Ausgabe des Digitalwerts an LCD
106
{
107
    lcd_gotoxy(0,5);
108
        
109
    char buffer [50];
110
    sprintf(buffer,"%d",Tempwert);
111
    lcd_putstr(buffer);
112
}

von Olaff (Gast)


Lesenswert?


von Tim K. (tkrzyzan)


Lesenswert?

Sorry aber was soll ich mit diesem Programm? Wenn ich da jetzt die Werte 
in die Tabelle eintippen würde, würde ich ja wieder nur die Funktion 
bekommen die auch im Datenblatt des NTC's steht oder? Meine eigentliche 
Frage ist wie ich den Digitalwert(Spannung in Digital) in eine 
Temperatur umwandle/rechne.

Danke schonmal im vorraus

von Karl H. (kbuchegg)


Lesenswert?

Tim Krzyzanowski schrieb:
> Sorry aber was soll ich mit diesem Programm? Wenn ich da jetzt die Werte
> in die Tabelle eintippen würde, würde ich ja wieder nur die Funktion
> bekommen die auch im Datenblatt des NTC's steht oder? Meine eigentliche
> Frage ist wie ich den Digitalwert(Spannung in Digital) in eine
> Temperatur umwandle/rechne.

Du hast doch die Vorwärtsrechnung geschafft, oder nicht?

Dann schreib dir das mal als einzige Formel zusammen, danach packst du 
deine Mathekenntnisse aus und versuchst die Formel umzudrehen.
Aus
1
   y = f(x)       // wie errechnet sich der ADC Wert aus der Temperatur
leítest du
1
   x = f'(y)      // die Umkehrung, wie errechnet sich die Temp. aus dem ADC Wert
her, sofern das möglich ist (ich hab in deinem Excel-Sheet jetzt auf die 
Schnelle keinen Zellenbezug gefunden, der dem entgegen stehen würde)

Und wenn das nicht möglich ist, dann lässt du dir eben von deinem Excel 
Sheet eine ordentliche Tabelle machen, in der nur noch die Temperaturen 
und die ADC-Werte drinnen stehen, gibst diese Werte in genanntes 
Programm ein, und lässt dir von dem ein Polynom errechnen, so dass
1
   x = g(y)
eine akzeptable Näherung für
1
   x = f'(y)
darstellt.

Und wenn du dann f' bzw. g kennst, dann programmierst du diese Formel in 
deinem Programm aus, um damit aus den ADC Werten (den y) die 
Temperaturen (die x) zu berechnen.


Disclaimer:
f' hat nichts mit der ersten Ableitung zu tun, sondern soll einfach nur 
die Umkehrung andeuten, weil mir f hoch -1 zu kompliziert zum tippen ist

von Tim K. (tkrzyzan)


Lesenswert?

Danke erstmal für die Antwort ich hab jetzt mal ein Polynom bilden 
lassen das sieht nun mit code so aus:
1
void abrufzaehler()
2
{
3
  if(takt1000==1)
4
  {
5
    takt1000=0;
6
    ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
7
      while (ADCSRA & (1<<ADSC) );
8
9
      Digitemp = ADCW;
10
    abruflcd();
11
  }
12
}
13
14
void digitotemp() //Digitalwert zu Temperatur umrechnen
15
{
16
  k0= 393,465;
17
  k1= -58,309;
18
  Tempwert = k0 + k1*log(Digitemp);
19
}
20
21
void abruflcd()
22
{
23
    lcd_gotoxy(0,5);
24
        
25
    char buffer [50];
26
    sprintf(buffer,"%d",Tempwert);
27
    lcd_putstr(buffer);
Habe auch schon die math.h libarie eingefügt aber irgendwie kommt auf 
meinem LC-Display nur die Zahl 0. Aber wenn ich den Digitalwert ausgeben 
lasse gibt er mir ~450 aus. Heist also irgendwas muss an der Formel 
falsch sein aber ich bekomme auch keine Fehlermeldung oder sonst etwas 
heraus.
Woran kann das liegen?

Danke schonmal im vorraus

von Tim K. (tkrzyzan)


Lesenswert?

Ok hab alles rausbekommen hab nur verpennt die Funktion void 
digitotemp() nicht aufgerufen habe... :D

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.