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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐