MSP430 - Temperatursensor - Kalibrierungsdaten?

OP #3112323
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)
#3112428
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
OP #3112612
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.
#3112625
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.
OP #3112664
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.
OP #3112695
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!
#3112754
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...

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