MAX31850, DS18B20, DS2450, thermocouple
MAX31850.cpp@0:5d39f2521173, 2015-03-09 (annotated)
- Committer:
- fblanc
- Date:
- Mon Mar 09 11:55:54 2015 +0000
- Revision:
- 0:5d39f2521173
MAX31850
Who changed what in which revision?
User | Revision | Line number | New 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 | } |