新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2020-11-20
- 在线时间
- 3 小时
|

楼主 |
发表于 2020-11-25 20:12:27
|
显示全部楼层
void MAX31865_Init(void)
{
SPI_InitTypeDef SPI_Inistructure;
GPIO_InitTypeDef GPIO_InitStructure ;
//接线在GPIOA上,CS/SS接A4主要是片选信号主机控制从机,SCLK是串行时钟信号A5,SDI输入信号A6,SDO输出信号A7,DRAY为存储查询信号A3
//使能A口时钟及SPI1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG,不关SW
//PA4、PA5、PA6、PA7端口可以复用重映像为SPI的CS、SCK、MISO、MOSI,只需要将这四个端口配置为复用推挽输出GPIO_Mode_AF_PP
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;
/*SPI1配置,关于这个怎么配置见STM32的手册,为什么这样配置见后续内容*/
//SPI_Inistructure.SPI_Direction=SPI_Direction_1Line_Tx;//主发送
//SPI_Inistructure.SPI_Mode=SPI_Mode_Master;//主机模式
//SPI_Inistructure.SPI_DataSize=SPI_DataSize_8b;//数据长度为8位
//SPI_Inistructure.SPI_CPOL=SPI_CPOL_High;
//两个脉冲沿做如下设置
//SPI_Inistructure.SPI_CPHA=SPI_CPHA_2Edge;
//SPI_Inistructure.SPI_NSS=SPI_NSS_Soft;//外部软件片选
//SPI_Inistructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4; //4比较合适
//SPI_Inistructure.SPI_FirstBit=SPI_FirstBit_MSB;//第1位为高位
//SPI_Init(SPI1,&SPI_Inistructure);//SPI1设置
//SPI_Cmd(SPI1,ENABLE);//SPI1使能
}
/* 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 读寄存器
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 配置*/
void MAX31865_Cfg(void)
{
//MAX31865_Write(0x80, 0xC3); //BIAS ON,自动,4线,50HZ 根据文件修改四线还是三线
MAX31865_Write(0x80,0xC1);//二线、四线配置
//MAX31865_Write(0x80,0xD1);//三线配置
}
/* MAX31865 PT1000获取温度 */
float Get_tempture_pt1000(void)
//PT1000
{
unsigned int data;
float Rt;
float Rt0 = 1000; //PT100为100,PT1000为1000
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位
//printf("Read=0x%02X\r\n",data);
Rt=(float)data/32768.0*RREF;
//printf("Rt=0x%.1f\r\n",Rt);
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;
}
|
|