MAX31850, DS18B20, DS2450, thermocouple

Committer:
fblanc
Date:
Mon Mar 09 11:55:54 2015 +0000
Revision:
0:5d39f2521173
MAX31850

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fblanc 0:5d39f2521173 1 /**
fblanc 0:5d39f2521173 2 * @file MAX31850.cpp
fblanc 0:5d39f2521173 3 * @brief library of MAX31850 1-Wire Thermocouple-to-Digital Converters,Cold-Junction Compensated (http://www.maximintegrated.com/datasheet/index.mvp/id/7953)
fblanc 0:5d39f2521173 4 * @author Frederic BLANC
fblanc 0:5d39f2521173 5 * @date 2014_01_15
fblanc 0:5d39f2521173 6 */
fblanc 0:5d39f2521173 7 #include "mbed.h"
fblanc 0:5d39f2521173 8 #include "onewire.h"
fblanc 0:5d39f2521173 9 #include "MAX31850.h"
fblanc 0:5d39f2521173 10 #include "crc8.h"
fblanc 0:5d39f2521173 11 #include "Horner_ITS90.h"
fblanc 0:5d39f2521173 12 int MAX31850_Read_Scratch(uint8_t id[],uint8_t sp[],uint8_t n)
fblanc 0:5d39f2521173 13 {
fblanc 0:5d39f2521173 14 if (id[0] == MAX31850_ID) {
fblanc 0:5d39f2521173 15 if (ow_reset(n)) //reset OW
fblanc 0:5d39f2521173 16 return OW_SHORT_CIRCUIT;
fblanc 0:5d39f2521173 17 sp[0]=MAX31850_READ; // command
fblanc 0:5d39f2521173 18 ow_command(n,sp[0], &id[0]);
fblanc 0:5d39f2521173 19 for ( int i=0 ; i< MAX31850_SP_SIZE; i++ ) { //read 8xdata + CRC16
fblanc 0:5d39f2521173 20 sp[i]=ow_byte_rd(n);
fblanc 0:5d39f2521173 21 }
fblanc 0:5d39f2521173 22 if(sp[8]!=crc8(sp,8))
fblanc 0:5d39f2521173 23 return OW_ERROR_CRC;
fblanc 0:5d39f2521173 24 return OW_OK;
fblanc 0:5d39f2521173 25 }
fblanc 0:5d39f2521173 26 return OW_ERROR_BAD_ID;
fblanc 0:5d39f2521173 27 }
fblanc 0:5d39f2521173 28
fblanc 0:5d39f2521173 29 int MAX31850_Temp_TRUE(uint8_t *sp,double *temp)
fblanc 0:5d39f2521173 30 {
fblanc 0:5d39f2521173 31
fblanc 0:5d39f2521173 32
fblanc 0:5d39f2521173 33 float temp_cj,temp_tc;
fblanc 0:5d39f2521173 34 double vtc;
fblanc 0:5d39f2521173 35 int err;
fblanc 0:5d39f2521173 36
fblanc 0:5d39f2521173 37 err = MAX31850_Temp_TC(sp,&temp_tc);
fblanc 0:5d39f2521173 38 if(err) {
fblanc 0:5d39f2521173 39 return err;
fblanc 0:5d39f2521173 40 }
fblanc 0:5d39f2521173 41 MAX31850_Temp_CJ(sp,&temp_cj);
fblanc 0:5d39f2521173 42
fblanc 0:5d39f2521173 43 vtc = MAX31850_K * temp_tc ;
fblanc 0:5d39f2521173 44 *temp=0;
fblanc 0:5d39f2521173 45 if(temp_tc < 0.0) {
fblanc 0:5d39f2521173 46 for(int i=0;i<10;++i)
fblanc 0:5d39f2521173 47 {
fblanc 0:5d39f2521173 48
fblanc 0:5d39f2521173 49 *temp+=ITS90_TCK_subzero[i]*pow(vtc,i);
fblanc 0:5d39f2521173 50 }
fblanc 0:5d39f2521173 51 } else if(temp_tc < 500.0) {
fblanc 0:5d39f2521173 52 for(int i=0;i<10;++i)
fblanc 0:5d39f2521173 53 {
fblanc 0:5d39f2521173 54
fblanc 0:5d39f2521173 55 *temp+=ITS90_TCK_sub500[i]*pow(vtc,i);
fblanc 0:5d39f2521173 56 }
fblanc 0:5d39f2521173 57 } else {
fblanc 0:5d39f2521173 58 for(int i=0;i<10;++i)
fblanc 0:5d39f2521173 59 {
fblanc 0:5d39f2521173 60
fblanc 0:5d39f2521173 61 *temp+=ITS90_TCK_sub1372[i]*pow(vtc,i);
fblanc 0:5d39f2521173 62 }
fblanc 0:5d39f2521173 63 }
fblanc 0:5d39f2521173 64 return OW_OK;
fblanc 0:5d39f2521173 65 }
fblanc 0:5d39f2521173 66
fblanc 0:5d39f2521173 67
fblanc 0:5d39f2521173 68 int MAX31850_Temp_TC(uint8_t *sp,float *temp)
fblanc 0:5d39f2521173 69 {
fblanc 0:5d39f2521173 70
fblanc 0:5d39f2521173 71 uint8_t *ptr_meas;
fblanc 0:5d39f2521173 72 uint16_t meas;
fblanc 0:5d39f2521173 73
fblanc 0:5d39f2521173 74 if(sp[0]& 1)
fblanc 0:5d39f2521173 75 return MAX31850_ERR_FAULT;
fblanc 0:5d39f2521173 76 if(sp[2]& (1<<1))
fblanc 0:5d39f2521173 77 return MAX31850_ERR_OPEN_CIRCUIT;
fblanc 0:5d39f2521173 78 if(sp[2]& (1<<2))
fblanc 0:5d39f2521173 79 return MAX31850_ERR_SHORT2GND;
fblanc 0:5d39f2521173 80 if(sp[2]& (1<<3))
fblanc 0:5d39f2521173 81 return MAX31850_ERR_SHORT2VDD;
fblanc 0:5d39f2521173 82 ptr_meas=(uint8_t*) &meas;
fblanc 0:5d39f2521173 83 *ptr_meas = sp[0] ; // LSB
fblanc 0:5d39f2521173 84 *++ptr_meas = sp[1]; // MSB
fblanc 0:5d39f2521173 85 if ( meas & 0x8000 ) {
fblanc 0:5d39f2521173 86
fblanc 0:5d39f2521173 87 meas ^= 0xffff; // convert to positive => (twos complement)++
fblanc 0:5d39f2521173 88 meas++;
fblanc 0:5d39f2521173 89 *temp= -1.0 * MAX31850_ADC_TEMP_TC_UNIT * (float)(meas>>2);
fblanc 0:5d39f2521173 90 } else {
fblanc 0:5d39f2521173 91 *temp= MAX31850_ADC_TEMP_TC_UNIT * (float)(meas>>2);
fblanc 0:5d39f2521173 92 }
fblanc 0:5d39f2521173 93
fblanc 0:5d39f2521173 94 return OW_OK;
fblanc 0:5d39f2521173 95 }
fblanc 0:5d39f2521173 96
fblanc 0:5d39f2521173 97 int MAX31850_Temp_CJ(uint8_t *sp,float *temp)
fblanc 0:5d39f2521173 98 {
fblanc 0:5d39f2521173 99 uint8_t *ptr_meas;
fblanc 0:5d39f2521173 100 uint16_t meas;
fblanc 0:5d39f2521173 101
fblanc 0:5d39f2521173 102 ptr_meas=(uint8_t*) &meas;
fblanc 0:5d39f2521173 103 *ptr_meas = sp[2] ; // LSB
fblanc 0:5d39f2521173 104 *++ptr_meas = sp[3]; // MSB
fblanc 0:5d39f2521173 105 if ( meas & 0x8000 ) {
fblanc 0:5d39f2521173 106
fblanc 0:5d39f2521173 107 meas ^= 0xffff; // convert to positive => (twos complement)++
fblanc 0:5d39f2521173 108 meas++;
fblanc 0:5d39f2521173 109 *temp= -1.0 * MAX31850_ADC_TEMP_CJ_UNIT * (float)(meas>>4);
fblanc 0:5d39f2521173 110 } else {
fblanc 0:5d39f2521173 111 *temp= MAX31850_ADC_TEMP_CJ_UNIT * (float)(meas>>4);
fblanc 0:5d39f2521173 112 }
fblanc 0:5d39f2521173 113 return OW_OK;
fblanc 0:5d39f2521173 114 }
fblanc 0:5d39f2521173 115
fblanc 0:5d39f2521173 116 int MAX31850_Start_meas(uint8_t id[],uint8_t n=0)
fblanc 0:5d39f2521173 117 {
fblanc 0:5d39f2521173 118 if (id[0] == MAX31850_ID) {
fblanc 0:5d39f2521173 119 if (ow_reset(n)) //reset OW
fblanc 0:5d39f2521173 120 return OW_SHORT_CIRCUIT;
fblanc 0:5d39f2521173 121 ow_command(n,MAX31850_CONVERT_T, &id[0]);
fblanc 0:5d39f2521173 122 return OW_OK;
fblanc 0:5d39f2521173 123 }
fblanc 0:5d39f2521173 124 return OW_ERROR_BAD_ID;
fblanc 0:5d39f2521173 125 }