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資料手冊