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

猜你喜欢

转载自blog.csdn.net/xiaoyuanwuhui/article/details/81734764