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冷端温度补偿、热电偶数字转换器可进行冷端温度补偿,并将K型热电偶信号转换成数字信号。数据输出为12位分辨率、SPI兼容、只读格式。
转换器温度分辨率为0.25°C,可读取温度达+1024°C,热电偶在0°C至+700°C温度范围内精度为8 LSB。
MAX6675采用串行总线协议,注意数据是在时钟上升沿后时采样。
寄存器内容如图,其中THERMOCOUPLE INPUT是传感器检测,当K型热电偶没有接入时返回1。
//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)引脚。
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数据手册