MAX6675 K型热电偶读温度

文章目录

    • K型热电偶简介
    • MAX6675简介
    • MAX6675时序
    • MAX6675寄存器内容
    • MAX6675读取程序
      • IO定义
      • IO初始化
      • 串行数据读写程序
      • 读取寄存器值
      • 温度计算
      • 主函数
    • 实际效果

K型热电偶简介

K型热电偶作为一种温度传感器,K型热电偶通常和显示仪表,记录仪表和电子调节器配套使用。
K型热电偶可以直接测量各种生产中从0℃到1300℃范围的液体蒸汽和气体介质以及固体的表面温度。
K型热电偶是目前用量最大的廉金属热电偶,其用量为其他热电偶的总和。K型热电偶丝直径一般为1.2mm~4.0mm。
正极(KP)的名义化学成分为:Ni:Cr=90:10,负极(KN)的名义化学成分为:Ni:Si=97:3,其使用温度为-200℃~1300℃。
K型热电偶具有线性度好,热电动势较大,灵敏度高,稳定性和均匀性较好,抗氧化性能强,价格便宜等优点,能用于氧化性惰性气氛中广泛为用户所采用。

MAX6675简介

MAX6675冷端温度补偿、热电偶数字转换器可进行冷端温度补偿,并将K型热电偶信号转换成数字信号。数据输出为12位分辨率、SPI兼容、只读格式。
转换器温度分辨率为0.25°C,可读取温度达+1024°C,热电偶在0°C至+700°C温度范围内精度为8 LSB。

MAX6675时序

MAX6675 K型热电偶读温度_第1张图片
MAX6675采用串行总线协议,注意数据是在时钟上升沿后时采样。

MAX6675寄存器内容

MAX6675 K型热电偶读温度_第2张图片
寄存器内容如图,其中THERMOCOUPLE INPUT是传感器检测,当K型热电偶没有接入时返回1。

MAX6675读取程序

IO定义

//PA5 SO
//PA6 CS
//PA7	SCK
#define MAX6675_SO_PORT	GPIOA
#define MAX6675_SO_PIN GPIO_Pin_0
#define MAX6675_CS_PORT	GPIOA
#define MAX6675_CS_PIN GPIO_Pin_11
#define MAX6675_SCK_PORT	GPIOA
#define MAX6675_SCK_PIN GPIO_Pin_12
#define SCK PAout(12)
#define CS PAout(11)
#define MISO PAin(0)

由于这里采用的是stm32f103rct6主控的正点原子mini板,为了保证不和其他IC冲突,使用A0(连接的wk_up)、A11(usb)、A12(usb)引脚。

IO初始化

void max6675_init(void)
{
     

    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PA端口时钟

    GPIO_InitStructure.GPIO_Pin = MAX6675_CS_PIN |MAX6675_SCK_PIN;			
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
    GPIO_Init(GPIOA, &GPIO_InitStructure);					 
    GPIO_SetBits(GPIOA,MAX6675_CS_PIN|MAX6675_SCK_PIN);						
	
    GPIO_InitStructure.GPIO_Pin = MAX6675_SO_PIN;	    	
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 		 
    GPIO_Init(GPIOA, &GPIO_InitStructure);	  				

}

其中用到的宏已经在上面引脚定义处给出。

串行数据读写程序

/**
  * @brief  max6675模块读写一个字节的数据
  * @param  txData:要发送的数据
  * @retval 接收到的数据
  */
uint8_t max6675_readWriteByte(uint8_t txData)
{
     
    unsigned char temp=0;
    unsigned char dat=0;
    for(temp=0x80; temp!=0; temp>>=1)
    {
     
        SCK=0;
        SPI_delay();  //让SCK稳定
        SCK=1;
        SPI_delay();  //让SCK稳定
        if(MISO==1)
        {
     
            dat|=temp;
        }
        else
        {
     
            dat&=~temp;
        }
    }
    return dat;
}

根据IC时序图,可以编写串行数据读取程序,注意因为是上升沿后读取数据,所以SCK先拉低再拉高,其中的SPI_delay调用的系统延时,用于使时钟线稳定,也保证采样时数据稳定,同时由于MAX6675允许的最快速率为4MHz,所以需要必要的延时。

void SPI_delay()
{
     
    delay_us(1);
}

读取寄存器值

uint16_t max6675_readRawValue(void)
{
     
    uint16_t tmp=0;
    GPIO_ResetBits(MAX6675_CS_PORT,MAX6675_CS_PIN); //enable max6675

    tmp=max6675_readWriteByte(0XFF); //read MSB
    tmp <<= 8;
    tmp |= max6675_readWriteByte(0XFF); //read LSB;
    //tmp=tmp&0x00FF;
    GPIO_SetBits(MAX6675_CS_PORT,MAX6675_CS_PIN); //disable max6675
    if (tmp & 4)
    {
     
        // thermocouple open
        //tmp = 0x0FFF; //未检测到热电偶	4095
		tmp = 4095; //未检测到热电偶	4095
		printf("thermocouple open\r\n");
    }
    else
    {
     
        tmp = tmp >> 3;
    }
		tmp=tmp&0x0FFF;	//12bit
    return tmp;
}

低电平片选设备,然后连续两次调用读取函数,读出16bit的寄存器值,先判断热电偶是否连接(如果热电偶没有连接,这里会直接返回4095,即测出来的值是1023.75摄氏度),最后返回12bit的温度值。

温度计算

/**
  * @brief  max6675模块读取测得的原始数据
  * @param  None
  * @retval 温度值(单位:℃)
  */
float max6675_readTemperature(void)
{
     
    return (max6675_readRawValue() * 1024.0 / 4096);
}

因为MAX6675的量程是0 ~ 1023.75摄氏度,而12bit表示的范围是 0 ~ 4095,所以需要读量程进行一个简单的转换。

主函数

直接改写正点原子的 ALIENTEK MINISTM32 实验11 TFT LCD液晶显示实验 的例程:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"


void max6675_init(void);
uint8_t max6675_readWriteByte(uint8_t txData); //max6675模块读写一个字节
uint16_t max6675_readRawValue(void);
float max6675_readTemperature(void);


char ss[20];
int main(void)
{
     
    float tempValue=0;
    u8 x=0;
    delay_init();	    	 //延时函数初始化
    uart_init(115200);	 	//串口初始化为9600
    LED_Init();		  		//初始化与LED连接的硬件接口
    LCD_Init();
    max6675_init();
    while(1)
    {
     

        POINT_COLOR=RED;
        tempValue=max6675_readTemperature();
        sprintf(ss,"temp:%f",tempValue);
        LCD_ShowString(30,40,200,24,24,ss);
        LED0=!LED0;
        delay_ms(200);
    }
}

注意MAX6675数据手册有说明,芯片的转换时间典型值为0.17s,最大值为0.22s,如果发现MAX6675采集到的数据一直不变,请注意自己的采样频率!!!

实际效果

实际演示效果如下图~
MAX6675 K型热电偶读温度_第3张图片

其中k型热电偶是自己后来单独买的,MAX6675是在优信电子购买的~
MAX6675数据手册

你可能感兴趣的:(stm32,stm32,k型热电偶,MAX6675,温度测量)