Auf den folgenden Seiten findet Ihr ein kleines Xmega Tutorial – Max31855 zu den Microcontrollern der Familie AVR Xmega in der Programmiersprache “C”. Der Thermoelement Sensor MAX31855 erzeugt eine Kaltstellenkompensation und digitalisiert das Signal von einem K-, J-, N-, T-, S-, R-oder E-Typ Thermoelement. Die verschiedenen Daten des Sensores kann man mit Hilfe eines der SPI Module des Xmegas relativ einfach auslesen. Der Sensor liefert die Informationen in einem signierten 14-Bit Format über eine Standard SPI Schnittstelle. Der Konverter hat eine Temperaturauflösung bis zu 0,25 °C und ermöglicht Messungen im Temperaturbereich von -270 °C bis zu 1800 °C. Speziell für Thermoelemente des Typs K weist der Sensor im Temperaturbereich von -200 °C bis +700 °C eine Genauigkeit von ± 2 °C.
Features
- Cold-Junction Compensation
- 14-Bit, 0.25°C Resolution
- Versions Available for K-, J-, N-, T-, S-, R-, and E-Type Thermocouples
- Simple SPI-Compatible Interface (Read-Only)
- Detects Thermocouple Shorts to GND or VCC
- Detects Open Thermocouple
Das folgende Beispiel zeigt Ausschnitte zum Auslesen des Sensors. Xmega Tutorial – Max31855 Example
#define sbi(ADDRESS,BIT) ADDRESS |= (1<<BIT) // set Bit #define cbi(ADDRESS,BIT) ADDRESS &= ~(1<<BIT) // clear Bit #define toggle(ADDRESS,BIT) ADDRESS ^= (1<<BIT) // Bit umschalten #define bis(ADDRESS,BIT) ADDRESS & (1<<BIT) // bit is set? #define bic(ADDRESS,BIT) !(ADDRESS & (1<<BIT)) // bit is clear? //################################################## read_max31855 int read_max31855(void) { unsigned char data[4] = {0xff, 0xff, 0xff, 0xff}; // 4 byte bitfield from MAX31855 // SPI SS low cbi(PORTD.OUT,4); for (int i=0; i<4; i++) { data[i] = SPI_MasterTransceiveByte(&spiMasterD,0xff); } // SPI SS high sbi(PORTD.OUT,4); if (bis(data[3],0)) {usart_puts(&USART_data,"Open Circuit\r");return 1000;} else if (bis(data[3],1)) {usart_puts(&USART_data,"Short to GND\r");return 1001;} else if (bis(data[3],2)) {usart_puts(&USART_data,"Short to VCC\r");return 1002;} else { double tempCuple = 0; double tempDevic = 0; double ganz = 0; double komma = 0; //##### Temp Thermocuple ganz = (((data[0] << 8) | data[1])>> 4); komma = ((data[1]>> 2) & 0x03)*0.25 ; if (ganz>0) tempCuple = ganz+komma; else tempCuple = ganz-komma; //##### Temp device ganz = data[2]; komma = (data[3]>> 4)*0.0625; if (ganz>0) tempDevic = ganz+komma; else tempDevic = ganz-komma; //##### Temperaturkompensation double vout = 0.041276*(tempCuple-tempDevic); double kompen = tempDevic*100 + 2508.355*vout + 7.860106*vout*vout - 25.03131*vout*vout*vout + 8.31527*vout*vout*vout*vout - 1.228034*vout*vout*vout*vout*vout; // round into Integer and return value return (int)(kompen+0.005); } }
Ein ausführliches Beispiel zum Testen der im Xmega Tutorial – Max31855 vorgestellten Funktionen findet ihr unter Downloads. Weiterhin findet ihr die von Atmel zu dem Thema zur Verfügung gestellte Appnote im Anhang des Artikels unter Links.
Viel Spass beim Testen.
Hinweis:
Das
Tutorial wird nach und nach von mir ergänzt. Wenn ihr Fehler in dem
Tutorial findet, würde ich mich freuen wenn ihr mir diese mitteilt,
damit ich diese korrigieren kann. Wenn jemand eigene Tips, Informationen
oder Code-Schnipsel hat, kann er mir diese gern zusenden damit ich sie
anschließend in das Tutorial einbinden kann.
Links | |
Atmel Appnote Xmega SPI Datenblatt | AVR1309: Using the XMEGA SPI (pdf) AVR1309: Using the XMEGA SPI (Software) Thermocouple-to-Digital Converter MAX31855 |