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
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.
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) |
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 |
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.
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.
http://forum.43oh.com/topic/2026-tlv-data-calibration-parse-and-display/ Schönes Beispiel zum Auslesen der Cal. Daten.
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.
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!
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.