Ttelmah
Joined: 11 Mar 2010 Posts: 19462
|
Basic library for the MAX31865 |
Posted: Thu Aug 26, 2021 11:58 am |
|
|
This is based on some code posted by Jody, fixed by me, and adapted to
use spi_xfer. Gives a basis for anyone wanting to use this chip.
//main31865.c
Code: |
#include <18F87J50.h>
#device ADC=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOXINST
#FUSES NOIESO
#use delay(crystal=8000000)
#use SPI(SPI1, baud=4000000, MODE=1, bits=32, STREAM=MAX)
#include "math.h"
#include "stdint.h"
#include "MAX31865.h"
void main()
{
float Rref = 470.0;
uint16_t result = 0;
float Temperature_vriezer;
uint16_t vriezer;
float Resistance;
output_high(MAX31865_CS);
delay_ms(100); //ensure chip has time to wake up
MAX31865_init(); //wake up chip
while(1)
{
result = MAX31865_read_data();
if (result & 1)
{
//error bit is set, read the error status
result=MAX31865_read8(MAX31856_FAULTSTAT_REG);
//here add fault diagmostics
}
else
{
result>>=1; //remove low bit
if(result == 0x7fff) result = 0;
Resistance = ((double)result*Rref)/32768;
Temperature_vriezer = CallendarVanDusen(Resistance);
vriezer = (int16) Temperature_vriezer;
delay_ms(17); //minimum 16.5mSec between readings;
}
}
}
|
//max31865.h
Code: |
/***************************************************************************************/
// SPI chip select pin
#define MAX31865_CS PIN_D1
#define MAX31856_CONFIG_REG_READ 0x00
#define MAX31856_CONFIG_REG_WRITE 0x80
#define MAX31856_CONFIG_BIAS 0x80
#define MAX31856_CONFIG_MODEAUTO 0x40
#define MAX31856_CONFIG_MODEOFF 0x00
#define MAX31856_CONFIG_1SHOT 0x20
#define MAX31856_CONFIG_3WIRE 0x10
#define MAX31856_CONFIG_24WIRE 0x00
#define MAX31856_CONFIG_FAULTSTAT 0x02
#define MAX31856_CONFIG_FILT50HZ 0x01
#define MAX31856_CONFIG_FILT60HZ 0x00
#define MAX31856_RTDMSB_REG 0x01
#define MAX31856_RTDLSB_REG 0x02
#define MAX31856_HFAULTMSB_REG 0x03
#define MAX31856_HFAULTLSB_REG 0x04
#define MAX31856_LFAULTMSB_REG 0x05
#define MAX31856_LFAULTLSB_REG 0x06
#define MAX31856_FAULTSTAT_REG 0x07
#define MAX31865_FAULT_HIGHTHRESH 0x80
#define MAX31865_FAULT_LOWTHRESH 0x40
#define MAX31865_FAULT_REFINLOW 0x20
#define MAX31865_FAULT_REFINHIGH 0x10
#define MAX31865_FAULT_RTDINLOW 0x08
#define MAX31865_FAULT_OVUV 0x04
/***************************************************************************************/
//---------------------------------------
// Call this function to read a 16bit value from a register pair
uint16_t MAX31865_read16(int regno)
{
uint16_t rtd;
output_low(MAX31865_CS);
delay_us(1);
spi_xfer(MAX,regno,8); //send the register number
rtd = spi_xfer(MAX,0L,16); // clock out 16 dummy bits and read the reply
delay_us(1);
output_high(MAX31865_CS);
return(rtd);
}
// Call this function to read an 8bit value from a register
uint8_t MAX31865_read8(int regno)
{
uint8_t rtd;
output_low(MAX31865_CS);
delay_us(1);
spi_xfer(MAX,regno,8); //send the register number
rtd = spi_xfer(MAX,0,8); // clock out 8 dummy bits and read the reply
delay_us(1);
output_high(MAX31865_CS);
return(rtd);
}
//specific version for data register
#define MAX31865_read_data() MAX31865_read16(MAX31856_RTDMSB_REG)
//---------------------------------------
// Call this function to write a 8-bit value
// to a MAX31865 register.
void MAX31865_write_register(uint8_t reg_address,uint8_t value)
{
output_low(MAX31865_CS);
delay_us(1);
spi_xfer(MAX,reg_address,8);
spi_xfer(MAX,value,8);
delay_us(1);
output_high(MAX31865_CS);
}
//Resistance to degrees celcius - your PIC does not support a double type
float CallendarVanDusen(float r)
{
float a = 3.9083E-03;
float b = -5.7750E-07;
float R0 = 100;//bij 0C
float deel1 = -R0*a;
float deel2 = ((R0*a)*(R0*a));
float deel3 = 4*(R0*b*(R0-r));
float deel4 = 2*R0*b;
float deel5 = sqrt(deel2 - deel3);
float temp = (deel1+deel5)/deel4;
if(r == 0) temp =0;
delay_us(1);
return (temp);
}
void MAX31865_init(void)
{
MAX31865_write_register(MAX31856_CONFIG_REG_WRITE,0xC3);//BIAS, AUTO, 50Hz
delay_ms(63); //minimum 62.5mSec before a result can be read
}
|
Remember needs to be a 3.3v PIC. |
|