基于max31865芯片PT100、PT1000温度传感器数据采集ADC STM32单片机驱动程序
#include "max31865.h"
uint8_t Channel;
uint8_t Fault;
uint8_t Error;
uint8_t Temp_Cnt;
uint8_t Fault_H[2];
uint8_t Fault_L[2];
int16_t Temp_Now[4];
uint16_t Temp_Adc;
uint16_t Temp_Buff[Temp_Max_Samples];
//====================================================================
//===MAX31865初始化===//
void Temp_GPIO_Init(void)
{
GPIO_InitPara GPIO_InitStructure;
RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA| \
RCC_AHBPERIPH_GPIOB| \
RCC_AHBPERIPH_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0|GPIO_PIN_15;//
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT; //输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;//最高频率50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP; //
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_PIN_0);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_9;//
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT; //输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;//最高频率50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP; //
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_PIN_8|GPIO_PIN_9);
GPIO_SetBits(GPIOB,GPIO_PIN_5);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_4;//定义GPIOA_15脚
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN; //输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_13;//
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT; //输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;//最高频率50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP; //
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_PIN_13);
Send_Write_Byte(0x80,0xc1);//初始化
}
//====================================================================
//===中位值滤波===//
uint16_t MiddleValueFilter(uint16_t *Data)
{
uint8_t i,j,k;
uint16_t Temp;
uint16_t DataBuff[Temp_Max_Samples];
for(i = 0;i < Temp_Max_Samples;i++)
{
DataBuff[i] = *Data;
Data++;
}
for(j = 0;j < (Temp_Max_Samples - 1);j++)
{//采样值由小到大排列,采用冒泡法排序
for(k = 0;k < (Temp_Max_Samples - j - 1);k++)
{
if(DataBuff[k] > DataBuff[k + 1])
{
Temp = DataBuff[k];
DataBuff[k] = DataBuff[k + 1];
DataBuff[k + 1] = Temp;
}
}
}
return(DataBuff[(Temp_Max_Samples - 1) / 2]);//取中间值
}
//====================================================================
//===写数据===//
void Send_Write_Byte(uint8_t Address,uint8_t Data)
{
uint8_t i;
Set_Max_CS(OFF);
for(i = 0;i < 8;i++)
{
Set_Max_CLK(ON);
if((Address & 0x80) == 0x80)
{
Set_Max_Din(ON);
}
else
{
Set_Max_Din(OFF);
}
Set_Max_CLK(OFF);
Address <<= 1;
}
for(i = 0;i < 8;i++)
{
Set_Max_CLK(ON);
if((Data & 0x80) == 0x80)
{
Set_Max_Din(ON);
}
else
{
Set_Max_Din(OFF);
}
Set_Max_CLK(OFF);
Data <<= 1;
}
Set_Max_CS(ON);
}
//====================================================================
//===读数据===//
uint8_t Send_Read_Byte(uint8_t Address)
{
uint8_t i,Temp=0;
Set_Max_CS(OFF);
for(i = 0;i < 8;i++)
{
Set_Max_CLK(ON);
if((Address & 0x80) == 0x80)
{
Set_Max_Din(ON);
}
else
{
Set_Max_Din(OFF);
}
Set_Max_CLK(OFF);
Address <<= 1;
}
for(i = 0;i < 8;i++)
{
Temp <<= 1;
Set_Max_CLK(ON);
if(Read_InData() != RESET)
{
Temp |= 0x01;
}
else
{
Temp &= 0xfe;
}
Set_Max_CLK(OFF);
}
Set_Max_CS(ON);
return Temp;
}
//====================================================================
//===通道转换===//
void Temp_Change_Process(void)
{
uint8_t Low=0;
uint8_t High=0;
switch(Channel)
{
case 0:
Set_Change_1(ON);
Set_Change_2(OFF);
Set_Change_3(OFF);
Set_Change_4(OFF);
break;
case 1:
Set_Change_1(OFF);
Set_Change_2(ON);
Set_Change_3(OFF);
Set_Change_4(OFF);
break;
case 2:
Set_Change_1(OFF);
Set_Change_2(OFF);
Set_Change_3(ON);
Set_Change_4(OFF);
break;
case 3:
Set_Change_1(OFF);
Set_Change_2(OFF);
Set_Change_3(OFF);
Set_Change_4(ON);
break;
default:
Set_Change_1(OFF);
Set_Change_2(OFF);
Set_Change_3(OFF);
Set_Change_4(OFF);
break;
}
Fault = Send_Read_Byte(0x00);
High = Send_Read_Byte(0x01);
Low = Send_Read_Byte(0x02);
Temp_Buff[Temp_Cnt] = (High << 8) + Low;
Temp_Buff[Temp_Cnt] >>= 1;
Fault_H[0] = Send_Read_Byte(0x03);
Fault_H[1] = Send_Read_Byte(0x04);
Fault_L[0] = Send_Read_Byte(0x05);
Fault_L[1] = Send_Read_Byte(0x06);
Error = Send_Read_Byte(0x07);
Temp_Cnt++;
if(Temp_Cnt >= Temp_Max_Samples)
{
Temp_Cnt = 0;
Temp_Adc = MiddleValueFilter(Temp_Buff);
Temp_Now[Channel] = ((Temp_Adc / 32) - 256);
Channel++;
if(Channel >= 4)
{
Channel = 0;
}
}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)