OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 19364|回复: 19

MAX31855 冷端补偿热电偶至数字输出转换器 使用經驗

[复制链接]

15

主题

53

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2013-4-19
在线时间
0 小时
发表于 2013-6-26 11:04:54 | 显示全部楼层 |阅读模式

MAX31855 冷端补偿热电偶至数字输出转换器 使用經驗


花我半個月以上的時間做研究 

有交機壓力, 差點就想放棄,  換其它方式,

但由於 热电偶 固定方式, 換其它方式,機構也要跟著改造又要花更多錢

但想 MAX 是國際大廠, MAX31855 出品的 IC ,應不會有問題



當初只買 MAX31855TASA+  IC   接上 T Type 
熱電偶

照使用手冊的方式去接線

以為像是之前用過 S11059-02DT 或是  DS18B20 等感測IC 

那麼容易使用, 線接一接就可以測試

但讀取溫度值, MingLiU;font-size:16px;font-weight:normal;line-height:18px;text-indent:32px;">熱端一直不準, 但冷MingLiU;font-size:16px;font-weight:normal;line-height:18px;text-indent:32px;">端確非常準,但MingLiU;font-size:16px;font-weight:normal;line-height:18px;text-indent:32px;">熱端溫度值才是要用的感測溫度

花我半個月的時間研究 MAX31855  讀取溫度不準的問題 

想說 國際大廠出品的 IC ,應不會有問題

打去問 MAX 的客服,也沒得到想知道的答案

最後沒辦法, 到網拍上買個

MAX31855 thermocouple 熱電偶 負溫度支援溫度模組 試一試 

測試結果 ok

原來 MAX31855 thermocouple 熱電偶 

不能只接 MAX31855  IC 

還要有抗干擾的旁路電路

使用手冊也沒提到


以下是 提供測試 成功的 
MAX31855 冷端补偿热电偶至数字输出转换器 程式

共有17組溫度感測器


/////////////////////////////////////////////////////////////
MAX31855.H
///////////////////////////////////////////////////////

#ifndef __MAX31855_H

#define __MAX31855_H  

#include "sys.h"


//-----------------IO口操作定义----------------

//IO操作函数


#define MAX_CS1 PFout(0) // PC0 Pin6

#define MAX_CS2 PFout(1) // PC1

#define MAX_CS3 PFout(2) // PC2

#define MAX_CS4 PFout(3) // PC3

#define MAX_CS5 PFout(4) // PC4

#define MAX_CS6 PFout(5) // PC5

#define MAX_CS7 PFout(6) // PC0 Pin6

#define MAX_CS8 PFout(7) // PC0 Pin6

#define MAX_CS9 PFout(11) // PC1

#define MAX_CS10 PFout(12) // PC2

#define MAX_CS11 PFout(13) // PC3

#define MAX_CS12 PFout(14) // PC4

#define MAX_CS13 PAout(2) // PC5

#define MAX_CS14 PAout(3) // PC0 Pin6

#define MAX_CS15 PAout(4) // PC3

#define MAX_CS16 PAout(5) // PC4

#define MAX_CS17 PAout(6) // PC5


#define MAX_SCK1 PCout(0)    // PF6 Pin5

#define MAX_SCK2 PCout(0)    // PF6 Pin5

#define MAX_SCK3 PCout(0)    // PF6 Pin5

#define MAX_SCK4 PCout(0)    // PF6 Pin5

#define MAX_SCK5 PCout(0)    // PF6 Pin5

#define MAX_SCK6 PCout(0)    // PF6 Pin5

#define MAX_SCK7 PCout(2)    // PF6 Pin5

#define MAX_SCK8 PCout(2)    // PF6 Pin5

#define MAX_SCK9 PCout(2)    // PF6 Pin5

#define MAX_SCK10 PCout(2)    // PF6 Pin5

#define MAX_SCK11 PCout(2)    // PF6 Pin5

#define MAX_SCK12 PCout(2)    // PF6 Pin5

#define MAX_SCK13 PCout(4)    // PF6 Pin5

#define MAX_SCK14 PCout(4)    // PF6 Pin5

#define MAX_SCK15 PCout(4)    // PF6 Pin5

#define MAX_SCK16 PCout(4)    // PF6 Pin5

#define MAX_SCK17 PCout(4)    // PF6 Pin5


#define MAX_MISO1 PCin(1)     //PF7 Pin7

#define MAX_MISO2 PCin(1)     //PF7 Pin7

#define MAX_MISO3 PCin(1)     //PF7 Pin7

#define MAX_MISO4 PCin(1) //PF7 Pin7

#define MAX_MISO5 PCin(1)     //PF7 P

#define MAX_MISO6 PCin(1)     //PF7 P

#define MAX_MISO7 PCin(3)     //PF7 Pin7

#define MAX_MISO8 PCin(3)     //PF7 Pin7

#define MAX_MISO9 PCin(3)     //PF7 Pin7

#define MAX_MISO10 PCin(3)  //PF7 Pin7

#define MAX_MISO11 PCin(3)     //PF7 P

#define MAX_MISO12 PCin(3)     //PF7 Pin7

#define MAX_MISO13 PCin(5)     //PF7 Pin7

#define MAX_MISO14 PCin(5)     //PF7 Pin7

#define MAX_MISO15 PCin(5)  //PF7 Pin7

#define MAX_MISO16 PCin(5)     //PF7 Pin7

#define MAX_MISO17 PCin(5)     //PF7 Pin7


//-----------------函数声明------------------


struct Thermocouple

{

u32 Data;

u32 Thermocouple;

u32 Internal;

};

extern struct Thermocouple MAX31855,MAX31855_0,MAX31855_1, MAX31855_2, MAX31855_3, MAX31855_4, MAX31855_5, MAX31855_6, MAX31855_7, MAX31855_8, MAX31855_9,

                                        MAX31855_10, MAX31855_11, MAX31855_12, MAX31855_13, MAX31855_14, MAX31855_15, MAX31855_16, MAX31855_17;


void MAX31855_Init(void) ; //初始化


void MAX31855_1_Read(void) ;

void MAX31855_2_Read(void) ;

void MAX31855_3_Read(void) ;

void MAX31855_4_Read(void) ;

void MAX31855_5_Read(void) ;

void MAX31855_6_Read(void) ;

void MAX31855_7_Read(void) ;

void MAX31855_8_Read(void) ;

void MAX31855_9_Read(void) ;

void MAX31855_10_Read(void) ;

void MAX31855_11_Read(void) ;

void MAX31855_12_Read(void) ;

void MAX31855_13_Read(void) ;

void MAX31855_14_Read(void) ;

void MAX31855_15_Read(void) ;

void MAX31855_16_Read(void) ;

void MAX31855_17_Read(void) ;


#endif


/////////////////////////////////////////////////////////

MAX31855.C

/////////////////////////////////////////////////////////

#include "max31855.h"
#include "delay.h"
#include "lcd.h"

struct Thermocouple MAX31855,MAX31855_0,MAX31855_1, MAX31855_2, MAX31855_3, MAX31855_4, MAX31855_5, MAX31855_6, MAX31855_7, MAX31855_8,
 MAX31855_9,MAX31855_10, MAX31855_11, MAX31855_12, MAX31855_13, MAX31855_14, MAX31855_15, MAX31855_16, MAX31855_17;

/************************************************************
函数名称:IMAX31855_Init()
功    能:模拟SPI的相关IO口初始化
入口参数:无
出口参数:无
说    明:无
************************************************************/
//MAX31855 初始化函数
void MAX31855_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PORTA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能PORTC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE); //使能PORTF时钟
 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|
                                                  GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;  //PF6 SCK,PF0~PF15 CS 设为推挽输出;  
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP ;   //推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIO PF0~PF15

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;  //PF6 SCK,PF0~PF15 CS 设为推挽输出;  
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP ;   //推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO PF0~PF15

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIO PF0~PF15
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5;
//GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ; //;PF7 MISO 设为浮空输入 = GPIO_Mode_IPD ; //;PF7 MISO 设为下拉输入 //GPIO_Mode_IPU 上拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //;PF7 MISO 设为浮空输入
    GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOF 0,

// GPIO_ResetBits(GPIOC,GPIO_Pin_0);
// GPIO_SetBits(GPIOC,GPIO_Pin_1); //PC0 输出高

    MAX_SCK1=0;  // PC0
MAX_SCK2=0;  // PC0
MAX_SCK3=0;  // PC0
MAX_SCK4=0;  // PC0
MAX_SCK5=0;  // PC0
MAX_SCK6=0;  // PC0
MAX_SCK7=0;  // PC0
MAX_SCK8=0;  // PC0
MAX_SCK9=0;  // PC0
MAX_SCK10=0;  // PC0
MAX_SCK11=0;  // PC0
MAX_SCK12=0;  // PC0
MAX_SCK13=0;  // PC0
MAX_SCK14=0;  // PC0
MAX_SCK15=0;  // PC0
MAX_SCK16=0;  // PC0
MAX_SCK17=0;  // PC0
    MAX_CS1=1; // PC1
    MAX_CS2=1;  // PC2
    MAX_CS3=1;  // PC3
    MAX_CS4=1;  // PC4
    MAX_CS5=1;  // PC5
    MAX_CS6=1;  // PF0
    MAX_CS7=1; // PC1
    MAX_CS8=1;  // PC2
    MAX_CS9=1;  // PC3
    MAX_CS10=1;  // PC4
    MAX_CS11=1;  // PC5
    MAX_CS12=1;  // PF0
MAX_CS13=1; // PC1
    MAX_CS14=1;  // PC2
    MAX_CS15=1;  // PC3
    MAX_CS16=1;  // PC4
    MAX_CS17=1;  // PC5
}

void MAX31855_1_Read(void)
{
int spi1;
u32 SPI1_Data=0;
MAX_CS1=0;
delay_us(1);
    for(spi1=31; spi1>=0; spi1--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK1=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO1) SPI1_Data|=((u32)1<<spi1);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK1=0;
        delay_us(1);
    }
MAX_CS1=1; //PC02, Pin6   
MAX31855_1.Data=SPI1_Data;            
    MAX31855_1.Thermocouple=((MAX31855_1.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_1.Internal=((MAX31855_1.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_2_Read(void)
{
int spi2;
u32 SPI2_Data=0;
MAX_CS2=0;
delay_us(1);
    for(spi2=31; spi2>=0; spi2--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK2=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO2) SPI2_Data|=((u32)1<<spi2);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK2=0;
        delay_us(1);
    }
MAX_CS2=1; //PC02, Pin6   
MAX31855_2.Data=SPI2_Data;            
    MAX31855_2.Thermocouple=((MAX31855_2.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_2.Internal=((MAX31855_2.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_3_Read(void)
{
int  spi3;
u32 SPI3_Data=0;
MAX_CS3=0;
delay_us(1);
    for(spi3=31; spi3>=0; spi3--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK3=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO3) SPI3_Data|=((u32)1<<spi3);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK3=0;
        delay_us(1);
    }
MAX_CS3=1; //PC02, Pin6   
MAX31855_3.Data=SPI3_Data;            
    MAX31855_3.Thermocouple=((MAX31855_3.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_3.Internal=((MAX31855_3.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}


void MAX31855_4_Read(void)
{
int  spi4;
u32 SPI4_Data=0;
MAX_CS4=0;
delay_us(1);
    for(spi4=31; spi4>=0; spi4--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK4=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO4) SPI4_Data|=((u32)1<<spi4);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK4=0;
        delay_us(1);
    }
MAX_CS4=1; //PC02, Pin6   
MAX31855_4.Data=SPI4_Data;            
    MAX31855_4.Thermocouple=((MAX31855_4.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_4.Internal=((MAX31855_4.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}

void MAX31855_5_Read(void)
{
int  spi5;
u32 SPI5_Data=0;
MAX_CS5=0;
delay_us(1);
    for(spi5=31; spi5>=0; spi5--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK5=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO5) SPI5_Data|=((u32)1<<spi5);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK5=0;
        delay_us(1);
    }
MAX_CS5=1; //PC02, Pin6   
MAX31855_5.Data=SPI5_Data;            
    MAX31855_5.Thermocouple=((MAX31855_5.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_5.Internal=((MAX31855_5.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_6_Read(void)
{
int  spi6;
u32 SPI6_Data=0;
MAX_CS6=0;
delay_us(1);
    for(spi6=31; spi6>=0; spi6--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK6=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO6) SPI6_Data|=((u32)1<<spi6);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK6=0;
        delay_us(1);
    }
MAX_CS6=1; //PC02, Pin6   
MAX31855_6.Data=SPI6_Data;            
    MAX31855_6.Thermocouple=((MAX31855_6.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_6.Internal=((MAX31855_6.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_7_Read(void)
{
int spi7;
u32 SPI7_Data=0;
MAX_CS7=0;
delay_us(1);
    for(spi7=31; spi7>=0; spi7--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK7=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO7) SPI7_Data|=((u32)1<<spi7);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK7=0;
        delay_us(1);
    }
MAX_CS7=1; //PC02, Pin6   
MAX31855_7.Data=SPI7_Data;            
    MAX31855_7.Thermocouple=((MAX31855_7.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_7.Internal=((MAX31855_7.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_8_Read(void)
{
int spi8;
u32 SPI8_Data=0;
MAX_CS8=0;
delay_us(1);
    for(spi8=31; spi8>=0; spi8--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK8=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO8) SPI8_Data|=((u32)1<<spi8);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK8=0;
        delay_us(1);
    }
MAX_CS8=1; //PC02, Pin6   
MAX31855_8.Data=SPI8_Data;            
    MAX31855_8.Thermocouple=((MAX31855_8.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_8.Internal=((MAX31855_8.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_9_Read(void)
{
int  spi9;
u32 SPI9_Data=0;
MAX_CS9=0;
delay_us(1);
    for(spi9=31; spi9>=0; spi9--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK9=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO9) SPI9_Data|=((u32)1<<spi9);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK9=0;
        delay_us(1);
    }
MAX_CS9=1; //PC02, Pin6   
MAX31855_9.Data=SPI9_Data;            
    MAX31855_9.Thermocouple=((MAX31855_9.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_9.Internal=((MAX31855_9.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}


void MAX31855_10_Read(void)
{
int  spi10;
u32 SPI10_Data=0;
MAX_CS10=0;
delay_us(1);
    for(spi10=31; spi10>=0; spi10--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK10=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO10) SPI10_Data|=((u32)1<<spi10);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK10=0;
        delay_us(1);
    }
MAX_CS10=1; //PC02, Pin6   
MAX31855_10.Data=SPI10_Data;            
    MAX31855_10.Thermocouple=((MAX31855_10.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_10.Internal=((MAX31855_10.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}


void MAX31855_11_Read(void)
{
int spi11;
u32 SPI11_Data=0;
MAX_CS11=0;
delay_us(1);
    for(spi11=31; spi11>=0; spi11--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK11=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO11) SPI11_Data|=((u32)1<<spi11);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK11=0;
        delay_us(1);
    }
MAX_CS11=1; //PC02, Pin6   
MAX31855_11.Data=SPI11_Data;            
    MAX31855_11.Thermocouple=((MAX31855_11.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_11.Internal=((MAX31855_11.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_12_Read(void)
{
int spi12;
u32 SPI12_Data=0;
MAX_CS12=0;
delay_us(1);
    for(spi12=31; spi12>=0; spi12--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK12=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO12) SPI12_Data|=((u32)1<<spi12);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK12=0;
        delay_us(1);
    }
MAX_CS12=1; //PC02, Pin6   
MAX31855_12.Data=SPI12_Data;            
    MAX31855_12.Thermocouple=((MAX31855_12.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_12.Internal=((MAX31855_12.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_13_Read(void)
{
int  spi13;
u32 SPI13_Data=0;
MAX_CS13=0;
delay_us(1);
    for(spi13=31; spi13>=0; spi13--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK13=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO13) SPI13_Data|=((u32)1<<spi13);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK13=0;
        delay_us(1);
    }
MAX_CS13=1; //PC02, Pin6   
MAX31855_13.Data=SPI13_Data;            
    MAX31855_13.Thermocouple=((MAX31855_13.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_13.Internal=((MAX31855_13.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}


void MAX31855_14_Read(void)
{
int  spi14;
u32 SPI14_Data=0;
MAX_CS14=0;
delay_us(1);
    for(spi14=31; spi14>=0; spi14--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK14=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO14) SPI14_Data|=((u32)1<<spi14);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK14=0;
        delay_us(1);
    }
MAX_CS14=1; //PC02, Pin6   
MAX31855_14.Data=SPI14_Data;            
    MAX31855_14.Thermocouple=((MAX31855_14.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_14.Internal=((MAX31855_14.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}

void MAX31855_15_Read(void)
{
int  spi15;
u32 SPI15_Data=0;
MAX_CS15=0;
delay_us(1);
    for(spi15=31; spi15>=0; spi15--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK15=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO15) SPI15_Data|=((u32)1<<spi15);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK15=0;
        delay_us(1);
    }
MAX_CS15=1; //PC02, Pin6   
MAX31855_15.Data=SPI15_Data;            
    MAX31855_15.Thermocouple=((MAX31855_15.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_15.Internal=((MAX31855_15.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_16_Read(void)
{
int  spi16;
u32 SPI16_Data=0;
MAX_CS16=0;
delay_us(1);
    for(spi16=31; spi16>=0; spi16--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK16=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO16) SPI16_Data|=((u32)1<<spi16);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK16=0;
        delay_us(1);
    }
MAX_CS16=1; //PC02, Pin6   
MAX31855_16.Data=SPI16_Data;            
    MAX31855_16.Thermocouple=((MAX31855_16.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_16.Internal=((MAX31855_16.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}
void MAX31855_17_Read(void)
{
int spi17;
u32 SPI17_Data=0;
MAX_CS17=0;
delay_us(1);
    for(spi17=31; spi17>=0; spi17--)  //*也是同IIC的读格式类似*/
{    
        MAX_SCK17=1;  //*第1位在CS被拉低之后产生,不需要时钟,故在第1位将时钟屏蔽
        delay_us(1);    
        if (MAX_MISO17) SPI17_Data|=((u32)1<<spi17);   //*第31个时钟之后不再移位*/ //{ Dat_Out |= 1;}    
        MAX_SCK17=0;
        delay_us(1);
    }
MAX_CS17=1; //PC02, Pin6   
MAX31855_17.Data=SPI17_Data;            
    MAX31855_17.Thermocouple=((MAX31855_17.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_17.Internal=((MAX31855_17.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
}





























MAX31855_icpdf.pdf

2.87 MB, 下载次数: 3567

戰艦 2.8 吋螢幕 如換成 3.5 吋螢幕 請教問題1: 戰鑑库函数版本3.5吋觸控螢幕無法設成橫式顯示
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-6-26 17:39:58 | 显示全部楼层
回复 支持 反对

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
发表于 2016-3-4 12:01:43 | 显示全部楼层
你是香港人吗?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-4-6
在线时间
0 小时
发表于 2016-4-6 10:52:10 | 显示全部楼层
我这边也有个项目是要用到热电偶的,现有项目是用MAX6675,但是发现MAX6675的转化速度太慢了,且听说6675Y要停产。我现在想了解一下楼主,用MAX31855的转换速度能达到多快?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-4-6
在线时间
0 小时
发表于 2016-4-6 10:52:55 | 显示全部楼层

我这边也有个项目是要用到热电偶的,现有项目是用MAX6675,但是发现MAX6675的转化速度太慢了,且听说6675Y要停产。我现在想了解一下楼主,用MAX31855的转换速度能达到多快?
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-12-8
在线时间
4 小时
发表于 2016-4-19 14:28:52 | 显示全部楼层
本帖最后由 LJMP 于 2016-4-19 14:30 编辑

不知道大神所说的外围电路
還要有抗干擾的旁路電路

使用手冊也沒提到
具体是什么意思?
按照max31855的规格书,只在VCC和GND端接电容,其他直接读取即可;
目前常温下的数据是错误的:
00.jpg
读出数据是:
01.jpg
就是个错的,不知道是什么问题,大神求助
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-12-8
在线时间
4 小时
发表于 2016-4-20 10:53:17 | 显示全部楼层
你温度没有处理小数部分
回复 支持 反对

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2908
金钱
2908
注册时间
2016-5-13
在线时间
184 小时
发表于 2016-11-14 23:30:19 | 显示全部楼层
围观大神的分享。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复 支持 反对

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-7-25
在线时间
28 小时
发表于 2016-11-16 09:57:12 | 显示全部楼层
请问乘以25  和  *625是什么意思   手册上貌似没说哩
回复 支持 反对

使用道具 举报

4

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-5-30
在线时间
26 小时
发表于 2018-3-5 15:44:14 | 显示全部楼层
MAX31855_11.Thermocouple=((MAX31855_11.Data>>18)&0x1fff)*25;  //提取D31-D18,14位数据
    MAX31855_11.Internal=((MAX31855_11.Data>>4)&0x07ff)*625 ;  //提取D15-D4,12位数据  
老哥这两行为什么要乘25和625?
回复 支持 反对

使用道具 举报

18

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2013-6-27
在线时间
82 小时
发表于 2018-11-19 09:21:15 | 显示全部楼层
你这是一条SPI下挂载了很多个MAX31855是吧,所以写了很多个几乎一样的read()函数,你可以将CS引脚当作函数的参数传递到read()中,这样能减少很多代码量
回复 支持 反对

使用道具 举报

18

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2013-6-27
在线时间
82 小时
发表于 2018-11-19 09:26:14 | 显示全部楼层
恳请分享一下你的抗干扰电路,还有max31855的转化时间典型值70ms最大值100ms,你的读取周期设多大?我现在也用max31855,但还是嫌弃max31855的转换时间不够快,不知道能不能以70ms的速度去读取,若没转换好读取会不会出错?
回复 支持 反对

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-3-18 11:07:29 | 显示全部楼层
zcz0426 发表于 2018-11-19 09:26
恳请分享一下你的抗干扰电路,还有max31855的转化时间典型值70ms最大值100ms,你的读取周期设多大?我现在 ...

MAX31855没有任何内置50Hz/60Hz陷波滤波,也没有任何高频滤波器。应在靠近MAX31855封装的位置,在T+和T-引脚之间安装10nF(最大值)陶瓷电容;在T+至GND以及T-至GND之间安装10nF去耦电容(最大值)。与MAX31855评估板类似,可增加小磁珠或串联电阻(< 1000Ω),有助于滤波。然而,对于高频噪声(> 100MHz),MAX31855的ADC将产生较大失调的读数。
作为替代方案,MAX31856集成了50Hz/60Hz陷波滤波以及EMI/RF噪声滤波器。以上有硅天下科技整理
回复 支持 反对

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-3-18 15:04:37 | 显示全部楼层
LJMP 发表于 2016-4-19 14:28
不知道大神所说的外围电路
還要有抗干擾的旁路電路

应在靠近MAX31855封装的位置,在T+和T-引脚之间安装10nF(最大值)陶瓷电容;在T+至GND以及T-至GND之间安装10nF去耦电容(最大值)。与MAX31855评估板类似,可增加小磁珠或串联电阻(< 1000Ω),有助于滤波。然而,对于高频噪声(> 100MHz),MAX31855的ADC将产生较大失调的读数。
作为替代方案,MAX31856集成了50Hz/60Hz陷波滤波以及EMI/RF噪声滤波器。
回复 支持 反对

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-3-25 17:10:27 | 显示全部楼层
回复 支持 反对

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-3-25 17:12:09 | 显示全部楼层
  max31855 最新开发手册
回复 支持 反对

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-6-3 18:24:54 | 显示全部楼层
cpc859 发表于 2016-4-6 10:52
**** 作者被禁止或删除 内容自动屏蔽 ****

最快能达到70ms
回复 支持 反对

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-6-3 18:31:03 | 显示全部楼层
LJMP 发表于 2016-4-19 14:28
不知道大神所说的外围电路
還要有抗干擾的旁路電路

给你参考一下

2.png
MAX31855参考电路图.png

回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2020-9-22
在线时间
12 小时
发表于 2021-8-19 17:33:59 | 显示全部楼层
zcz0426 发表于 2018-11-19 09:26
恳请分享一下你的抗干扰电路,还有max31855的转化时间典型值70ms最大值100ms,你的读取周期设多大?我现在 ...

你好,你那里MAX31855程序能用吗,能分享一下吗
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-4-10
在线时间
7 小时
发表于 2021-9-10 00:17:20 | 显示全部楼层

磁珠滤除100M的高频辐射干扰吗?感觉并个1uF的陶瓷电容更好,其实电源最主要吧,影响6675内部参考电压的稳定度。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表