STM32驱动MAX6675读取K型热电偶温度

   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 )。

 

这段代码是通过STM32的SPI2接口与MAX6675热电偶温度传感器进行通信,以测量K热电偶温度MAX6675是一种数字式热电偶温度传感器,通过SPI接口与STM32微控制器进行通信。 首先,在函数MAX6675_GPIO_Init中,配置了SPI2的引脚和相关参数。GPIO_InitStructure结构体用于配置GPIO引脚的模式、速度和复用功能。SPI_InitStructure结构体用于配置SPI的工作模式、数据大小、时钟极性和相位等参数。RCC_APB2PeriphClockCmd函数用于使能GPIOB的时钟。 接下来,在函数TEMP_ReadReg中,通过控制SCK和CS引脚的电平变化以及读取SO引脚的状态,逐位读取16位的温度值。具体的操作过程如下: 1. 置CS为高电平,SCK为低电平,进行一些延时。 2. 置CS为低电平,开始传输数据。 3. 循环读取16位数据: a. 左移Temp_2一位。 b. 置SCK为高电平,进行一些延时。 c. 判断SO引脚状态,如果为高电平,则将Temp_2最低位置为1,否则为0。 d. 置SCK为低电平,进行一些延时。 4. 置SCK为低电平,进行一些延时。 5. 置CS为高电平,进行一些延时。 6. 对Temp_2进行一些位操作,将其右移4位,以获得实际的温度值。 7. 返回温度值Temp_2。 需要注意的是,这段代码中的引脚操作和寄存器配置是基于特定的STM32F10x系列微控制器和MAX6675热电偶温度传感器,实际使用时需要根据具体的硬件和接口配置进行修改。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值