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/1.Software/STM32/Drivers/BSP/TP1000/TP1000.c

252 lines
7.2 KiB
C
Raw Permalink Normal View History

#include "./BSP/TP1000/TP1000.h"
#include "./SYSTEM/spi3/spi3.h"
#include "math.h"
#include "./SYSTEM/delay/delay.h"
tp1000_cs_drdy TP1000_CS_DRDY;
/***********************************************
TP1000_Init()
: DRDY引脚
************************************************/
void TP1000_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = RTD_DRDY1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = RTD_DRDY2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PGPin PGPin */
GPIO_InitStruct.Pin = RTD_DRDY3_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(RTD_DRDY3_GPIO_Port, &GPIO_InitStruct);
}
/***********************************************
max31865_Read()
max31865读取数据
************************************************/
uint8_t max31865_Read(uint8_t addr){
uint8_t read;
HAL_GPIO_WritePin(TP1000_CS_DRDY.RTD_NSS_GPIO_Port, TP1000_CS_DRDY.RTD_NSS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi3, &addr, 1, 60);
HAL_SPI_Receive(&hspi3, &read, 1, 60);
HAL_GPIO_WritePin(TP1000_CS_DRDY.RTD_NSS_GPIO_Port, TP1000_CS_DRDY.RTD_NSS_Pin, GPIO_PIN_SET);
return read;
}
/***********************************************
max31865_Write()
max31865读取数据
************************************************/
void max31865_Write(uint8_t addr, uint8_t wdata){
uint8_t dat[2];
dat[0] = addr;
dat[1] = wdata;
HAL_GPIO_WritePin(TP1000_CS_DRDY.RTD_NSS_GPIO_Port, TP1000_CS_DRDY.RTD_NSS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi3,dat,2,60);
HAL_GPIO_WritePin(TP1000_CS_DRDY.RTD_NSS_GPIO_Port, TP1000_CS_DRDY.RTD_NSS_Pin, GPIO_PIN_SET);
}
/***********************************************
max31865_init()
max31865配置
************************************************/
void max31865_init(void){
max31865_Write(0x80,0xc1);
}
/***********************************************
DRDY_Pin_Value(Port, Pin)
************************************************/
uint8_t DRDY_Pin_Value(void)
{
return HAL_GPIO_ReadPin(TP1000_CS_DRDY.RTD_DRDY_GPIO_Port, TP1000_CS_DRDY.RTD_DRDY_Pin);
}
/***********************************************
max31865_get_rtd_value()
************************************************/
void max31865_get_rtd_value(uint8_t *uch_buff)
{
uch_buff[0] = max31865_Read(0x01);
uch_buff[1] = max31865_Read(0x02);
}
/***********************************************
MAX31865_GetTemp1()
temp
************************************************/
static float MAX31865_GetTemp1(uint8_t value[2])
{
unsigned int data;
float Rt;
float Rt0 = 1000; //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; //去掉Fault位
Rt=(float)data/32768.0*4300;
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;
}
/***********************************************
max31865_fault_detection()
************************************************/
uint8_t max31865_fault_detection(void){
uint8_t uch_status;
uint8_t uch_config;
uch_config = max31865_Read(0x00);
uch_config|=0x80;
uch_config&=0xf3;
max31865_Write(0x80,uch_config);
delay_us(200);
uch_config|=0x88;
max31865_Write(0x80,uch_config);
delay_us(200);
uch_config|=0x8C;
max31865_Write(0x80,uch_config);
while((max31865_Read(0x00)&0x0C)!=0x00);
uch_status=max31865_Read(0x07);
return uch_status;
}
/***********************************************
max31865_clear_fault_status()
************************************************/
void max31865_clear_fault_status(void)
{
uint8_t uch_config;
uch_config=max31865_Read(0x00);
uch_config&=0xd3;
uch_config|=0x02;
max31865_Write(0x80, uch_config);
}
/***********************************************
Get_Hardware_SPI_Temp()
************************************************/
void Get_Hardware_SPI_Temp(uint8_t auch_rtd[2]){
float f_temperature = 0; //温度转换
uint8_t uch_fault_status; //故障代码
uch_fault_status = max31865_fault_detection();
printf("故障代码%d\r\n",uch_fault_status);
//没有故障,启动一次转换
if((uch_fault_status & 0xFC)==0){
max31865_init(); //启动一次测量
while(DRDY_Pin_Value() == GPIO_PIN_SET); //等待测量结束
max31865_get_rtd_value(auch_rtd); //读取测量结果
f_temperature = MAX31865_GetTemp1(auch_rtd); //数据转换
}
else{
printf("错误代码%d\r\n",(uch_fault_status & 0xFC));
auch_rtd[0] = 0xFF; // 设置默认值或错误码
auch_rtd[1] = 0xFF;
f_temperature = -999; //显示温度采集故障故障码
max31865_clear_fault_status();
uch_fault_status = max31865_fault_detection();
}
// printf("temp%d\r\n",auch_rtd[0]);
// printf("temp%d\r\n",auch_rtd[1]);
printf("temp%f\r\n",f_temperature);
}
tp1000_cs_drdy Get_Hardware_SPI3_Temp(void){
TP1000_CS_DRDY.RTD_DRDY_GPIO_Port = RTD_DRDY1_GPIO_Port;
TP1000_CS_DRDY.RTD_DRDY_Pin = RTD_DRDY1_Pin;
TP1000_CS_DRDY.RTD_NSS_GPIO_Port = SPI3_NSS1_GPIO_Port;
TP1000_CS_DRDY.RTD_NSS_Pin = SPI3_NSS1_Pin;
printf("通道1\r\n");
Get_Hardware_SPI_Temp(TP1000_CS_DRDY.f_temperature1);
TP1000_CS_DRDY.RTD_DRDY_GPIO_Port = RTD_DRDY2_GPIO_Port;
TP1000_CS_DRDY.RTD_DRDY_Pin = RTD_DRDY2_Pin;
TP1000_CS_DRDY.RTD_NSS_GPIO_Port = SPI3_NSS2_GPIO_Port;
TP1000_CS_DRDY.RTD_NSS_Pin = SPI3_NSS2_Pin;
printf("通道2\r\n");
Get_Hardware_SPI_Temp(TP1000_CS_DRDY.f_temperature2);
TP1000_CS_DRDY.RTD_DRDY_GPIO_Port = RTD_DRDY3_GPIO_Port;
TP1000_CS_DRDY.RTD_DRDY_Pin = RTD_DRDY3_Pin;
TP1000_CS_DRDY.RTD_NSS_GPIO_Port = SPI3_NSS3_GPIO_Port;
TP1000_CS_DRDY.RTD_NSS_Pin = SPI3_NSS3_Pin;
printf("通道3\r\n");
Get_Hardware_SPI_Temp(TP1000_CS_DRDY.f_temperature3);
return TP1000_CS_DRDY;
}