MAX31855为热电偶至数字输出转换器,内置14位模/数转换器(ADC)。器件带有冷端补偿检测和修正、数字控制器、SPI兼容接口,以及相关的控制逻辑,在温度控制器、过程控制或监测系统中设计用于配合外部微控制器(μC)工作。提供多个版本的器件,每个版本针对特定的热电偶类型(K、J、N、T或E型)进行优化和调整。热电偶类型以器件型号后缀表示(例如MAX31855K)。器件输出14位带符号数据,通过SPI兼容接口、以只读格式输出。转换的温度分辨率为0.25℃,最高温度读数为+1800℃,最低温度读数为-270℃,对于K型热电偶,温度范围为-200℃至+700℃,保持±2℃精度。 MAX31855KASA+T硅天下科技开发资料技术支持 STM32F407+MAX31855 +K型热电偶进行测温方案 一、首先硬件方面的实现: 图1.MAX31855测温电路原理图 硬件注意事项: 1.由于MAX31855本身不具备抗干扰性,要添加抗干扰电路;(也可以使用硅天下新推出的MAX31856,自带抗干扰及先行修正电路) 2.热电偶分正负极,注意别接反了 二、软件程序大概分为三部分 2.1首先是声明和定义 [mw_shl_code=c,true] #define GPIOA_MAX31855_SCK GPIO_Pin_1 #define GPIOC_MAX31855_CS GPIO_Pin_5 #define GPIOC_MAX31855_SC GPIO_Pin_4 #define GPIOA_MAX31855_SCK_H GPIO_SetBits(GPIOA,GPIOA_MAX31855_SCK) #define GPIOA_MAX31855_SCK_L GPIO_ResetBits(GPIOA,GPIOA_MAX31855_SCK) #define GPIOC_MAX31855_CS_H GPIO_SetBits(GPIOC,GPIOC_MAX31855_CS) #define GPIOC_MAX31855_CS_L GPIO_ResetBits(GPIOC,GPIOC_MAX31855_CS) #define GPIOC_MAX31855_SC_IN (GPIOC->IDR & GPIOC_MAX31855_SC) [/mw_shl_code] 2.2MAX31855的初始化 图2.时序图 [mw_shl_code=c,true] void MAX31855_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIOA_MAX31855_SCK;//max31855 sck GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType= GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIOC_MAX31855_CS;//max31855 cs GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType= GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIOC_MAX31855_SC;//max31855 sc GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN;//注意读数据的端口要设置为普通输入模式 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIOA_MAX31855_SCK_L; GPIOC_MAX31855_CS_H; } [/mw_shl_code] 图3.位加权和功能 图4.热电偶温度格式 根据datasheet可以知道,在data的32位数据中,[31:18]为14位带符号的热电偶温度,[15:4]为12位带符号的内部温度。14位的数据表示是热电偶远端,即你想测量的物体的温度。而12位的数据则代表与电路板接触的那一端的热电偶的温度,通常这个温度是固定不变的,与室温接近。 2.3最后是MAX31855读数据和数据处理的过程 [mw_shl_code=c,true] floatMAX31855_ReadData() {u32 data=0;//用于存储从max31855读取的数据 u16Thermocouple=0; // float Ther=0; int i; GPIOC_MAX31855_CS_L;//片选,低电平有效 delay_us(1); for(i=31;i>=0;i--) { //按位读取一共是32位数据,从高位开始读取 GPIOA_MAX31855_SCK_H; //时序是在上升沿的时候读取数据,在初始化的时候,SCK为低,所以此时拉高 delay_us(1); if(GPIOC_MAX31855_SC_IN)//开始读数据,如果当前位为1的话,则通过左移至相应位置,如果是0则不处理 { data|=((u32)1<<i); //左移至i位,赋值给data的i位 } GPIOA_MAX31855_SCK_L;//读取一位完成 delay_us(1); } GPIOC_MAX31855_CS_H;//32位读取完成后取消片选 /**********下面对data进行处理****************/ Thermocouple=((temp_data>>18)&0x1fff);//取出[30:18]热电偶的数据 ,我这里没有取出符号位 Ther=Thermocouple*0.25; //从图5中可以看出,温度的分辨率是0.25摄氏度,固数据应乘0.25,参考端的温度应该乘0.0625,我这里没有对这部分数据进行处理。 return Ther; } [/mw_shl_code] 软件部分注意事项 1. MAX31855读数据的时序图,控制引脚有:一个片选(cs),一个时钟(sck),一个读数据(sc) 2.对读取到的32位的数据进行处理,分清楚哪个是你所需要的数据。
|