1. 程式人生 > >MAX6675 K型熱電偶讀溫度

MAX6675 K型熱電偶讀溫度

文章目錄

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採用序列匯流排協議,注意資料是在時鐘上升沿後時取樣。

MAX6675暫存器內容

暫存器
暫存器內容如圖,其中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採集到的資料一直不變,請注意自己的取樣頻率!!!

實際效果

實際演示效果如下圖~
在這裡插入圖片描述

其中k型熱電偶是自己後來單獨買的,MAX6675是在優信電子購買的~
MAX6675資料手冊