#include "max31865.h" /*********************************************** 调用方式:MAX31865_Init() 返回值: SDO ---> PC10 CS ---> PC12 SCLK ---> PC9 SDI ---> PC11 DRDY ---> PC13 函数说明:MAX31865 初始化,软件模拟 ************************************************/ void MAX31865_Init(void) { GPIO_InitTypeDef GPIO_InitStructure ; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = MAX31865_CS|MAX31865_SCLK|MAX31865_SDI; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(MAX31865_CONTROL_PORT,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = MAX31865_SDO|MAX31865_DRDY; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(MAX31865_CONTROL_PORT,&GPIO_InitStructure); MAX31865_CS_SET; MAX31865_SCLK_SET; } /*********************************************** 调用方式:MAX31865_Write() 返回值: 函数说明:MAX31865 写寄存器,addr:寄存器地址,data:数据 ************************************************/ void MAX31865_Write(unsigned char addr, unsigned char data) { unsigned char i; MAX31865_CS_CLR; for(i=0;i<8;i++) //写地址 { MAX31865_SCLK_CLR; if(addr&0x80) MAX31865_SDI_SET; else MAX31865_SDI_CLR; MAX31865_SCLK_SET; addr<<=1; } for(i=0;i<8;i++) //写数据 { MAX31865_SCLK_CLR; if(data&0x80) MAX31865_SDI_SET; else MAX31865_SDI_CLR; MAX31865_SCLK_SET; data<<=1; } MAX31865_CS_SET; } /*********************************************** 调用方式:MAX31865_Read() 返回值: data 函数说明:MAX31865 读寄存器 ,addr:寄存器地址 ************************************************/ unsigned char MAX31865_Read(unsigned char addr) { unsigned char i; unsigned char data=0; MAX31865_CS_CLR; for(i=0;i<8;i++) //写地址 { MAX31865_SCLK_CLR; if(addr&0x80) MAX31865_SDI_SET; else MAX31865_SDI_CLR; MAX31865_SCLK_SET; addr<<=1; } for(i=0;i<8;i++) //读数据 { MAX31865_SCLK_CLR; data<<=1; MAX31865_SCLK_SET; if(MAX31865_SDO_READ) data|=0x01; else data|=0x00; } MAX31865_CS_SET; return data; } /*********************************************** 调用方式:MAX31865_Cfg() 返回值: 函数说明:MAX31865 配置 ************************************************/ void MAX31865_Cfg(void) { //BIAS ON,自动,4线,50HZ 根据文件修改四线还是三线 MAX31865_Write(0x80, 0xC3); } /*********************************************** 调用方式:MAX31865_GetTemp() 返回值: 函数说明:MAX31865 获取温度 ************************************************/ float MAX31865_GetTemp(void) { 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; // MAX31865_Write(0x80, 0xD3); data=MAX31865_Read(0x01)<<8; data|=MAX31865_Read(0x02); data>>=1; //去掉Fault位 Rt=(float)data/32768.0*RREF; 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; }