This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
CMS3in1/2.Blade/4.MISC/温度检测/max31865/MAX31865drv.c

267 lines
7.2 KiB
C
Raw Normal View History

#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;
}