MAX6675 进行热电偶冷端补偿和数字化 K 型热电偶信号。输出 12 位分辨率、 SPI 兼容、只读的数据。转换器的精度为 0.25℃,最高可读+1024℃,如果使用数据的 8LSB 则温度范围为 0℃到+700℃。
MAX6675模块的原理图:
从网上看到max6675模块并不便宜,正好手头又有MAX6675的芯片于是自己便根据原理图在洞洞板上搭建了一个测试模块
测试结果:将测得的温度信息通过串口1输出到上位机显示
max6675模块部分的测试代码:
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "max6675.h"
int main(void)
{
uint16_t temperature;
float t;
usart1_init(115200);
delay_init();
max6675_init();
while(1)
{
temperature = max6675_readRawValue();
printf("the raw value is:%d\n",temperature);
t = max6675_readTemperature();
printf("the temperature is:%.2f\n",t);
printf("\n");
delay_ms(500);
}
}
max6675操作函数库:
头文件:
#ifndef __MAX6675_H
#define __MAX6675_H
#include "stm32f10x.h"
#define MAX6675_CS1_CLK RCC_APB2Periph_GPIOA
#define MAX6675_CS1_PORT GPIOA
#define MAX6675_CS1_PIN GPIO_Pin_4
void max6675_init(void); //初始化max6675模块
uint8_t max6675_readWriteByte(uint8_t txData); //max6675模块读写一个字节
uint16_t max6675_readRawValue(void);
float max6675_readTemperature(void);
#endif
源文件:
#include "max6675.h"
#include "spi.h"
/**
* @brief max66675模块初始化
* @param None
* @retval None
*/
void max6675_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(MAX6675_CS1_CLK, ENABLE); //PORTA时钟使能
GPIO_InitStructure.GPIO_Pin = MAX6675_CS1_PIN; // PA4 推挽 T_CS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(MAX6675_CS1_PORT, &GPIO_InitStructure);
GPIO_SetBits(MAX6675_CS1_PORT,MAX6675_CS1_PIN); // T_CS=1
spi1_init();
}
/**
* @brief max6675模块读写一个字节的数据
* @param txData:要发送的数据
* @retval 接收到的数据
*/
uint8_t max6675_readWriteByte(uint8_t txData)
{
return spi1_readWriteByte(txData);
}
/**
* @brief max6675模块读取测得的原始数据
* @param None
* @retval 温度的原始数据
*/
uint16_t max6675_readRawValue(void)
{
uint16_t tmp;
GPIO_ResetBits(MAX6675_CS1_PORT,MAX6675_CS1_PIN); //enable max6675
tmp = max6675_readWriteByte(0XFF); //read MSB
tmp <<= 8;
tmp |= max6675_readWriteByte(0XFF); //read LSB
GPIO_SetBits(MAX6675_CS1_PORT,MAX6675_CS1_PIN); //disable max6675
if (tmp & 4)
{
// thermocouple open
tmp = 4095; //未检测到热电偶
}
else
{
tmp = tmp >> 3;
}
return tmp;
}
/**
* @brief max6675模块读取测得的原始数据
* @param None
* @retval 温度值(单位:℃)
*/
float max6675_readTemperature(void)
{
return (max6675_readRawValue() * 1024.0 / 4096);
}
最后附上测试例程:https://download.csdn.net/download/xiaoyuanwuhui/10606977
该例程的测试环境为STM32f103 用到的硬件资源有 串口1(PA9 PA10)SPI1(PA4 PA5 PA6 )。