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位在
不知道大神所说的外围电路
還要有抗干擾的旁路電路
使用手冊也沒提到
具体是什么意思?
按照max31855的规格书,只在VCC和GND端接电容,其他直接读取即可;
目前常温下的数据是错误的:
读出数据是:
就是个错的,不知道是什么问题,大神求助
一周热门 更多>