Forum: Mikrocontroller und Digitale Elektronik MSP430 - Temperatursensor - Kalibrierungsdaten?


von Michael H. (overthere)


Lesenswert?

Hallo,

weiß jemand, wie man beim MSP430 die Kalibrierungsdaten für den 
Temperatursensor verwendet? Irgendwie sehe ich das nicht im Datenblatt 
des MSP430G2252 beschrieben.

Vielen Dank schon mal für die Hilfe?
Michael

von Timmo H. (masterfx)


Lesenswert?

Guckst du User Guide Abschnitt 24.2.2

Sind ja zwei Referenzwerte für 1.5V und 2.5V Vref gegeben für 30°C und 
85°C.

von Michael H. (overthere)


Lesenswert?

Afaik sind das Werte für den 12 Bit Converter ("TAG_ADC12_1 Calibration 
TLV Structure"), ich haber hier aber nur den 10 Bit Converter.
Sind das dann die gleichen, wenn ich die durch 4 Teile?

Folgendes BeispieL gibt bei Zimmertemperatur ROT aus (Über 85°C).
1
  ADC10CTL0 &= ~(ENC|ADC10IE|ADC10IFG|ADC10SC);
2
3
  while((ADC10CTL1 & ADC10BUSY));
4
  //Konfiguriere ADC
5
  ADC10CTL0 = SREF_1 | REFON | ADC10ON | ADC10SHT_3 ;
6
  ADC10CTL1 = INCH_10+ ADC10DIV_3;
7
  ADC10CTL0 |= ENC + ADC10SC;
8
  ///Waehle ADC Kanal 10 und Teile 
9
  while((ADC10CTL1 & ADC10BUSY));
10
  ADC10CTL0 |= ENC + ADC10SC;
11
  while((ADC10CTL1 & ADC10BUSY));
12
  uint16_t temperature=ADC10MEM;
13
  ADC10CTL0=ADC10ON;
14
 
15
  if(temperature*4<CAL_ADC_15T30){
16
    blinking_set_pattern(led_display_GREEN_blink);
17
  }else if(temperature*4<CAL_ADC_15T85){
18
    blinking_set_pattern(led_display_GREENYEL_blink);
19
20
  }else{
21
    blinking_set_pattern(led_display_RED);
22
  }

Wobei ich selbst die Konstanten Definieren musste: (Vielleicht ist da ja 
ein Fehler)
1
 #define  CAL_ADC_15T30        *(int *)   (0x10DA+0x0008)
2
 #define  CAL_ADC_15T85             *(int *)   (0x10DA+0x000A)

von Timmo H. (masterfx)


Lesenswert?

Michael H. schrieb:
> Afaik sind das Werte für den 12 Bit Converter ("TAG_ADC12_1 Calibration
> TLV Structure"), ich haber hier aber nur den 10 Bit Converter.
> Sind das dann die gleichen, wenn ich die durch 4 Teile?
Normalerweise sollte dort einfach nur der Rohwert drin stehen, egal ob 
nun 12 oder 10 bit ADC. Wenn du nur nen 10 Bit ADC hast, dann ist die 
Adresse für die Kalibrierungswerte auch die gleiche
Aus "24.2"
1
Each device contains a subset of the tags shown in Table 24-2. See the device-specific data sheet for details. Table 24-2. Supported Tags (Device Specific)
2
Tag            Description                                  Value
3
TAG_EMPTY      Identifies an unused memory area             0xFE
4
TAG_DCO_30     Calibration values for the DCO at room 
5
               temperature and DVCC = 3 V                   0x01
6
TAG_ADC12_1    Calibration values for the ADC12 module      0x08
7
TAG_ADC10_1    Calibration values for the ADC10 module      0x08

von Michael H. (overthere)


Lesenswert?

Okay, ich bin nur mit den Werten, die abgespeichert sind nicht ganz so 
zufrieden, das können keine 10 Bit werte sein:
1
(mspdebug) md 0x10e2 4
2
    010e2: eb 02 73 03
Mein erster Gedanke: Lese ich die falschen Werte?
1
 #define  CAL_ADC_15T30        *(int *)   (0x10DA+8)
2
 #define  CAL_ADC_15T85             *(int *)   (0x10DA+10)
Ich glaube, ich lese die richtigen Werte.

von Timmo H. (masterfx)


Lesenswert?

Michael H. schrieb:
> Okay, ich bin nur mit den Werten, die abgespeichert sind nicht ganz so
> zufrieden, das können keine 10 Bit werte sein:
>
1
> (mspdebug) md 0x10e2 4
2
>     010e2: eb 02 73 03
3
>
Ja nun hast du sowohl T30 und T85 ausgelesen.
T30 ist 0x02eb
und T85 ist 0x0373
oder etwa nicht? Ist doch Little Endian. Die Kalibrierungswerte sind je 
16 Bit breit und enthalten einen 10/12 Bit Wert.

von Bernd N. (Gast)


Lesenswert?

http://forum.43oh.com/topic/2026-tlv-data-calibration-parse-and-display/

Schönes Beispiel zum Auslesen der Cal. Daten.

von Michael H. (overthere)


Lesenswert?

Omg, klar, immer diese Formatfragen. Vielen Dank für deine Qualifizierte 
Hilfe.

Ich habe mir, jetzt eine Funktion gebastelt, die mir die Temperatur in 
°C in Abhängigkeit der Temperaturwerte von 30°C und 85°C ausgibt.

Die Funktion legt quasi eine Gerade durch die entsprechnenden Teile und 
erechnet anhand der Steigung den entsprechnden Punkt. Im Prinzip Mathe 
Klasse8.
Eventuell hilft es ja jemanden.
1
int16_t get_degree_temperature(uint16_t adc_measure){
2
  uint16_t a,b;
3
  a=(CAL_ADC_15T85-CAL_ADC_15T30)/55;
4
  b=CAL_ADC_15T30-a*30;
5
  
6
  return (adc_measure-b)/a;
7
}
Anmerkung: 55 Da 55 Grad Temperaturunterschied.
30, da wir 30 Grad in die Gerade einsetzten. Alternativ kann man auch 85 
nutzen, kommt das gleiche raus.

von Michael H. (overthere)


Lesenswert?

Update zur Präzission: Im Zimmer werden Zimmergradtemperaturen gemessen,
Außen, zur Zeit knapp über 0 Grad, wird kleiner 10 Grad gemessen.
Mein Fazit: Bin ganz zufrieden mit der Präzission. Man darf keiner 
Wunder erwarten, aber dafür dass das Teil quasi für lau mitkommt =)
Danke an Timo und Bernd für eure Hilfe!

von Arc N. (arc)


Lesenswert?

Michael H. schrieb:
>
1
> int16_t get_degree_temperature(uint16_t adc_measure){
2
>   uint16_t a,b;
3
>   a=(CAL_ADC_15T85-CAL_ADC_15T30)/55;
4
>   b=CAL_ADC_15T30-a*30;
5
> 
6
>   return (adc_measure-b)/a;
7
> }
8
>
> Anmerkung: 55 Da 55 Grad Temperaturunterschied.
> 30, da wir 30 Grad in die Gerade einsetzten. Alternativ kann man auch 85
> nutzen, kommt das gleiche raus.

Da wird auch nicht unbedingt das rauskommen was erwartet wird...
T30 ist 0x02eb, T85 ist 0x0373
0x373 - 0x2eb = 136, 136 / 55 = 2,47272
bei einer Integerdivision sind das nur noch 2...

von Schupps (Gast)


Lesenswert?

Arc Net schrieb:
> Da wird auch nicht unbedingt das rauskommen was erwartet wird...
> bei einer Integerdivision sind das nur noch 2

Und was könnte helfen?

Man rechnet in 1/10 oder 1/100 °C.

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.