OneWire DS18B20,DS2450,MAX31850
Dependents: MAX31850_HelloWorld
MAX31850.cpp
- Committer:
- fblanc
- Date:
- 2015-02-12
- Revision:
- 0:9acbbb021a43
File content as of revision 0:9acbbb021a43:
/**
* @file MAX31850.cpp
* @brief library of MAX31850 1-Wire Thermocouple-to-Digital Converters,Cold-Junction Compensated (http://www.maximintegrated.com/datasheet/index.mvp/id/7953)
* @author Frederic BLANC
* @date 2014_01_15
*/
#include "mbed.h"
#include "onewire.h"
#include "MAX31850.h"
#include "crc8.h"
#include "Horner_ITS90.h"
int MAX31850_Read_Scratch(uint8_t id[],uint8_t sp[],uint8_t n)
{
if (id[0] == MAX31850_ID) {
if (ow_reset(n)) //reset OW
return OW_SHORT_CIRCUIT;
sp[0]=MAX31850_READ; // command
ow_command(n,sp[0], &id[0]);
for ( int i=0 ; i< MAX31850_SP_SIZE; i++ ) { //read 8xdata + CRC16
sp[i]=ow_byte_rd(n);
}
if(sp[8]!=crc8(sp,8))
return OW_ERROR_CRC;
return OW_OK;
}
return OW_ERROR_BAD_ID;
}
int MAX31850_Temp_TRUE(uint8_t *sp,double *temp)
{
float temp_cj,temp_tc;
double vtc;
int err;
err = MAX31850_Temp_TC(sp,&temp_tc);
if(err) {
return err;
}
MAX31850_Temp_CJ(sp,&temp_cj);
vtc = MAX31850_K * temp_tc ;
*temp=0;
if(temp_tc < 0.0) {
for(int i=0;i<10;++i)
{
*temp+=ITS90_TCK_subzero[i]*pow(vtc,i);
}
} else if(temp_tc < 500.0) {
for(int i=0;i<10;++i)
{
*temp+=ITS90_TCK_sub500[i]*pow(vtc,i);
}
} else {
for(int i=0;i<10;++i)
{
*temp+=ITS90_TCK_sub1372[i]*pow(vtc,i);
}
}
return OW_OK;
}
int MAX31850_Temp_TC(uint8_t *sp,float *temp)
{
uint8_t *ptr_meas;
uint16_t meas;
if(sp[0]& 1)
return MAX31850_ERR_FAULT;
if(sp[2]& (1<<1))
return MAX31850_ERR_OPEN_CIRCUIT;
if(sp[2]& (1<<2))
return MAX31850_ERR_SHORT2GND;
if(sp[2]& (1<<3))
return MAX31850_ERR_SHORT2VDD;
ptr_meas=(uint8_t*) &meas;
*ptr_meas = sp[0] ; // LSB
*++ptr_meas = sp[1]; // MSB
if ( meas & 0x8000 ) {
meas ^= 0xffff; // convert to positive => (twos complement)++
meas++;
*temp= -1.0 * MAX31850_ADC_TEMP_TC_UNIT * (float)(meas>>2);
} else {
*temp= MAX31850_ADC_TEMP_TC_UNIT * (float)(meas>>2);
}
return OW_OK;
}
int MAX31850_Temp_CJ(uint8_t *sp,float *temp)
{
uint8_t *ptr_meas;
uint16_t meas;
ptr_meas=(uint8_t*) &meas;
*ptr_meas = sp[2] ; // LSB
*++ptr_meas = sp[3]; // MSB
if ( meas & 0x8000 ) {
meas ^= 0xffff; // convert to positive => (twos complement)++
meas++;
*temp= -1.0 * MAX31850_ADC_TEMP_CJ_UNIT * (float)(meas>>4);
} else {
*temp= MAX31850_ADC_TEMP_CJ_UNIT * (float)(meas>>4);
}
return OW_OK;
}
int MAX31850_Start_meas(uint8_t id[],uint8_t n=0)
{
if (id[0] == MAX31850_ID) {
if (ow_reset(n)) //reset OW
return OW_SHORT_CIRCUIT;
ow_command(n,MAX31850_CONVERT_T, &id[0]);
return OW_OK;
}
return OW_ERROR_BAD_ID;
}
frederic blanc