OneWire DS18B20,DS2450,MAX31850

Dependents:   MAX31850_HelloWorld

Committer:
fblanc
Date:
Thu Feb 12 14:03:55 2015 +0000
Revision:
0:9acbbb021a43
MAX31850 ok

Who changed what in which revision?

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