NTC- Lichtmessung- AT-Mega88

OP #3220616
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
}
Angehängte Dateien:
OP #3220744
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
#3220782
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
OP #3222047
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.