267 lines
7.2 KiB
C
267 lines
7.2 KiB
C
![]() |
#include "MAX31865drv.h"
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_31865_write_register()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
|
|||
|
************************************************/
|
|||
|
void maxim_31865_write_register(uint8_t uch_register_address, uint8_t uch_register_value)
|
|||
|
{
|
|||
|
SPI_CS_LOW;
|
|||
|
SPI_WriteByte(uch_register_address);
|
|||
|
SPI_WriteByte(uch_register_value);
|
|||
|
SPI_CS_HIGH;
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_31865_write_nregisters()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
************************************************/
|
|||
|
void maxim_31865_write_nregisters(uint8_t uch_register_address,uint8_t *uch_buff,uint8_t uch_nBytes)
|
|||
|
{
|
|||
|
SPI_CS_LOW;
|
|||
|
SPI_WriteByte(uch_register_address);
|
|||
|
SPI_Write(uch_buff,uch_nBytes);
|
|||
|
SPI_CS_HIGH;
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_31865_read_register()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD> uch_register_data
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
************************************************/
|
|||
|
uint8_t maxim_31865_read_register(uint8_t uch_register_address)
|
|||
|
{
|
|||
|
uint8_t uch_register_data;
|
|||
|
SPI_CS_LOW;
|
|||
|
SPI_WriteByte(uch_register_address);
|
|||
|
uch_register_data=SPI_ReadByte();
|
|||
|
SPI_CS_HIGH;
|
|||
|
return (uch_register_data);
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_31865_read_nregisters()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
************************************************/
|
|||
|
void maxim_31865_read_nregisters(uint8_t uch_register_address, uint8_t *uch_buff,uint8_t uch_nBytes)
|
|||
|
{
|
|||
|
SPI_CS_LOW;
|
|||
|
SPI_WriteByte(uch_register_address);
|
|||
|
SPI_Read(uch_buff,uch_nBytes);
|
|||
|
SPI_CS_HIGH;
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_31865_init()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>max31865<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
************************************************/
|
|||
|
void maxim_31865_init(max31865_configuration* configuration)
|
|||
|
{
|
|||
|
uint8_t temp=0;
|
|||
|
temp|=configuration->Vbias|configuration->Conversion_mode|configuration->Rtd_wire|configuration->Filter;
|
|||
|
maxim_31865_write_register(0x80,temp);
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_set_fault_threshold()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ޣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
************************************************/
|
|||
|
void maxim_set_fault_threshold(float high_threshold, float low_threshold)
|
|||
|
{
|
|||
|
uint8_t au_threshold[4];
|
|||
|
uint16_t u_threshold;
|
|||
|
|
|||
|
u_threshold= ((int)((high_threshold/REF_RES)*16383))<<1;
|
|||
|
au_threshold[0]=(u_threshold>>8);
|
|||
|
au_threshold[1]=u_threshold&0xff;
|
|||
|
u_threshold=((int)((low_threshold/REF_RES)*16383))<<1;
|
|||
|
au_threshold[2]=(u_threshold>>8);
|
|||
|
au_threshold[3]=u_threshold&0xff;
|
|||
|
|
|||
|
maxim_31865_write_nregisters(0x83,au_threshold,4);
|
|||
|
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_auto_fault_detection()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
************************************************/
|
|||
|
uint8_t maxim_auto_fault_detection(void)
|
|||
|
{
|
|||
|
uint8_t uch_status;
|
|||
|
uint8_t uch_config;
|
|||
|
uch_config=maxim_31865_read_register(0x00);
|
|||
|
uch_config|=0x84;
|
|||
|
maxim_31865_write_register(0x80, uch_config);
|
|||
|
while((maxim_31865_read_register(0x00)&0xC0)!=0x00);
|
|||
|
uch_status=maxim_31865_read_register(0x07);
|
|||
|
return(uch_status);
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_manual_fault_detection()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
************************************************/
|
|||
|
uint8_t maxim_manual_fault_detection(void)
|
|||
|
{
|
|||
|
uint8_t uch_status;
|
|||
|
uint8_t uch_config;
|
|||
|
uch_config=maxim_31865_read_register(0x00);
|
|||
|
uch_config|=0x80;
|
|||
|
uch_config&=0xf3;
|
|||
|
maxim_31865_write_register(0x80, uch_config);
|
|||
|
delay_us(200);
|
|||
|
uch_config|=0x88;
|
|||
|
maxim_31865_write_register(0x80, uch_config);
|
|||
|
delay_us(200);
|
|||
|
uch_config|=0x8C;
|
|||
|
maxim_31865_write_register(0x80, uch_config);
|
|||
|
while((maxim_31865_read_register(0x00)&0x0C)!=0x00);
|
|||
|
uch_status=maxim_31865_read_register(0x07);
|
|||
|
return(uch_status);
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_clear_fault_status()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼĴ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
************************************************/
|
|||
|
void maxim_clear_fault_status(void)
|
|||
|
{
|
|||
|
uint8_t uch_config;
|
|||
|
|
|||
|
uch_config=maxim_31865_read_register(0x00);
|
|||
|
uch_config&=0xd3;
|
|||
|
uch_config|=0x02;
|
|||
|
maxim_31865_write_register(0x80, uch_config);
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> maxim_get_rtd_value()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
************************************************/
|
|||
|
void maxim_get_rtd_value(uint8_t *uch_buff)
|
|||
|
{
|
|||
|
maxim_31865_read_nregisters(0x01,uch_buff,2);
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> MAX31865_GetTemp1()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD> temp
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȡ<EFBFBD>¶<EFBFBD>
|
|||
|
************************************************/
|
|||
|
static float MAX31865_GetTemp1(uint8_t value[2])
|
|||
|
{
|
|||
|
unsigned int data;
|
|||
|
float Rt;
|
|||
|
float Rt0 = 100; //PT100
|
|||
|
float Z1,Z2,Z3,Z4,temp;
|
|||
|
float a = 3.9083e-3;
|
|||
|
float b = -5.775e-7;
|
|||
|
float rpoly;
|
|||
|
data= value[0]<<8;
|
|||
|
data|= value[1];
|
|||
|
data>>=1; //ȥ<><C8A5>Faultλ
|
|||
|
Rt=(float)data/32768.0*REF_RES;
|
|||
|
Z1 = -a;
|
|||
|
Z2 = a*a-4*b;
|
|||
|
Z3 = 4*b/Rt0;
|
|||
|
Z4 = 2*b;
|
|||
|
temp = Z2+Z3*Rt;
|
|||
|
temp = (sqrt(temp)+Z1)/Z4;
|
|||
|
if(temp>=0){
|
|||
|
return temp;
|
|||
|
}
|
|||
|
rpoly = Rt;
|
|||
|
temp = -242.02;
|
|||
|
temp += 2.2228 * rpoly;
|
|||
|
rpoly *= Rt; // square
|
|||
|
temp += 2.5859e-3 * rpoly;
|
|||
|
rpoly *= Rt; // ^3
|
|||
|
temp -= 4.8260e-6 * rpoly;
|
|||
|
rpoly *= Rt; // ^4
|
|||
|
temp -= 2.8183e-8 * rpoly;
|
|||
|
rpoly *= Rt; // ^5
|
|||
|
temp += 1.5243e-10 * rpoly;
|
|||
|
|
|||
|
return temp;
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> Get_Hardware_SPI_Temp_Init()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>PT100<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
************************************************/
|
|||
|
void Get_Hardware_SPI_Temp_Init(void)
|
|||
|
{
|
|||
|
max31865_configuration configuration;
|
|||
|
/*<2A><><EFBFBD><EFBFBD>MAX31865<36><35><EFBFBD><EFBFBD>ģʽ*/
|
|||
|
configuration.Vbias = ON;
|
|||
|
configuration.Rtd_wire = RTD_3wire;
|
|||
|
configuration.Filter = Filter_50Hz;
|
|||
|
maxim_31865_init(&configuration);
|
|||
|
/*<2A><><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ֵ*/
|
|||
|
maxim_set_fault_threshold(430, 0);
|
|||
|
}
|
|||
|
/***********************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><EFBFBD> Get_Hardware_SPI_Temp()
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶Ƚ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
************************************************/
|
|||
|
float Get_Hardware_SPI_Temp(void)
|
|||
|
{
|
|||
|
max31865_configuration configuration;
|
|||
|
|
|||
|
uint8_t uch_fault_status;//<2F><><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>
|
|||
|
uint8_t auch_rtd[2];//<2F><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
|||
|
float f_temperature;//<2F>¶<EFBFBD>ת<EFBFBD><D7AA>
|
|||
|
uch_fault_status = maxim_manual_fault_detection();
|
|||
|
/*
|
|||
|
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTD<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD>룬ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD>RTD<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬һ<EFBFBD><EFBFBD>
|
|||
|
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶Ȳɼ<EFBFBD>
|
|||
|
*/
|
|||
|
if((uch_fault_status & 0xFC) == 0){
|
|||
|
configuration.Conversion_mode = One_Shot_Conversion;
|
|||
|
maxim_31865_init(&configuration); //<2F><><EFBFBD><EFBFBD>һ<EFBFBD>β<EFBFBD><CEB2><EFBFBD>
|
|||
|
|
|||
|
while(DRDY_Pin_Value() == SET); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
maxim_get_rtd_value( auch_rtd); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if((auch_rtd[1] & 0x01) == 0x01){ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>ʶ<EFBFBD><CAB6>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9>ϼ<EFBFBD><CFBC>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>
|
|||
|
uch_fault_status = maxim_manual_fault_detection(); //<2F><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC>⣬Ҳ<E2A3AC><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>
|
|||
|
maxim_clear_fault_status(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼĴ<CFBC><C4B4><EFBFBD>
|
|||
|
printf("%d",uch_fault_status);
|
|||
|
}
|
|||
|
else{
|
|||
|
//<2F><><EFBFBD><EFBFBD>û<EFBFBD>й<EFBFBD><D0B9>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
f_temperature = MAX31865_GetTemp1(auch_rtd);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else{
|
|||
|
maxim_clear_fault_status();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼĴ<CFBC><C4B4><EFBFBD>
|
|||
|
printf("%d",uch_fault_status);
|
|||
|
}
|
|||
|
return f_temperature;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|