打印
[STM32F1]

读取max6675温度

[复制链接]
2897|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aa911|  楼主 | 2019-5-1 12:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
得到的温度波动很大,不准确,串口打印的数据如图所示,哪里出了问题?
main.c
int main(void)
{       
        char key_code = 8;
        float t;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);
        delay_init();
        LED_Init();
        Key_User_Init();
        Exti_User_Init();
        TIM3_User_Init(9999, 7199);//频率10KHz,重装载值9999+1 ms

        max6675_init();


       
                while(1)
                {       
                        delay_ms(500);       
                        t = max6675_readTemperature();
                        printf("the temperature is:%.2f\n",t);
                        printf("\n");

                       
                }


}
max6675.c

#include "max6675.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"       

/*max6675初始化程序*/
void max6675_init(void){
    GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能

        //CS
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PB7推挽输出  GPIO_Mode_AF_PP
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB8

        //SO
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//PB9上拉输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB7

        //SCK
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PB8复用推挽输出  GPIO_Mode_AF_PP
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB11       
}

u16 max6675_readRawValue(void)
{
  u16 tmp=0;
  u16 i;
  MAX6675_CS_L;//cs低
  /*按位读取电平*/
  for(i=0;i<16;i++)
  {  
                  /*创建一个沿,按沿读取PB7的端口电平*/
                MAX6675_CK_H;
                delay_us(10);
                if(MAX6675_SO)
                {
                        tmp|=0x0001;
                        printf("tmp%d---:%d\n",i,tmp);/*这是为了检查错误时按位打印每个数*/
                }
            
                tmp<<=1;//按位左移
            MAX6675_CK_L;
                delay_us(10);
   }
  MAX6675_CS_H;//cs高                  
  if (tmp&0X04)
{
    tmp = 0; //未检测到热电偶
        // printf("未检测到热电偶\n");//测试用
  }
  else
{
        tmp<<=1;//去掉D15位
        tmp>>=4;//去掉D0、1、2位
  }
        return tmp;
}

float max6675_readTemperature(void)
{
        u16 d;
        float i,S;
        S=2.142857;//实验数,用温水和热水 环境测得的一个实际差量
        delay_ms(300);
        d=max6675_readRawValue();
        i=d*1023.75/4095/S;
    return i;
}




log.png (24.87 KB )

log.png

MCU.png (604.91 KB )

MCU.png

热电偶模块.png (58.79 KB )

热电偶模块.png

使用特权

评论回复
沙发
wangjiahao88| | 2019-5-1 16:13 | 只看该作者
请问一下 这个准吗?

读数准吗?

内部是靠什么做的滤波啊?

使用特权

评论回复
板凳
aa911|  楼主 | 2019-5-1 17:14 | 只看该作者
wangjiahao88 发表于 2019-5-1 16:13
请问一下 这个准吗?

读数准吗?

从打印出来的数据看,读数不准,不知道代码哪里出了问题。

使用特权

评论回复
地板
aa911|  楼主 | 2019-5-3 12:15 | 只看该作者
自己顶一下

使用特权

评论回复
5
dsyq| | 2019-5-4 09:36 | 只看该作者
用SPI读取吧!
我用F1的SPI读“没问题”,但用F072的SPI读出的数始终有问题。

感觉有十分之一的数据会变得离谱,不知是否该软件滤掉。

使用特权

评论回复
6
aa911|  楼主 | 2019-5-4 12:15 | 只看该作者
dsyq 发表于 2019-5-4 09:36
用SPI读取吧!
我用F1的SPI读“没问题”,但用F072的SPI读出的数始终有问题。

我也想用SPI,但是这个电路就这样了,而且实际项目用的MCU就是F072

使用特权

评论回复
7
aa911|  楼主 | 2019-5-4 12:24 | 只看该作者
aa911 发表于 2019-5-4 12:15
我也想用SPI,但是这个电路就这样了,而且实际项目用的MCU就是F072

可以看看你的代码吗?

使用特权

评论回复
8
dsyq| | 2019-5-4 13:23 | 只看该作者
aa911 发表于 2019-5-4 12:24
可以看看你的代码吗?

#include "max6675.h"

extern SPI_HandleTypeDef hspi1;


uint16_t max6675_readRawValue(void)
{
  uint8_t rx[2];
       
        HAL_StatusTypeDef halStatus;
       
        uint16_t tmp;
       
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,0);
        HAL_Delay(1);
       
        halStatus=HAL_SPI_Receive(&hspi1,(uint8_t*)&rx[0],1,100);
        HAL_Delay(1);
        halStatus=HAL_SPI_Receive(&hspi1,(uint8_t*)&rx[1],1,100);

        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,1);
               
        if(halStatus!=HAL_OK)
                return 0;
       
  tmp=rx[0]; //read MSB
  tmp<<= 8;
  tmp|=rx[1]; //read LSB
                         
  if (tmp & 4)
  {
    tmp = 4095;
  }
  else
  {
    tmp = tmp >> 3;
  }

  return tmp;
}

float max6675_readTemperature(void)
{
  return (max6675_readRawValue() * 1024.0 / 4096);
}

使用特权

评论回复
9
dsyq| | 2019-5-4 13:23 | 只看该作者
#ifndef __MAX6675_H
#define __MAX6675_H

#include "main.h"

#define MAX6675_CS1_CLK   RCC_APB2Periph_GPIOA
#define MAX6675_CS1_PORT  GPIOA
#define MAX6675_CS1_PIN   GPIO_Pin_4

uint8_t max6675_readWriteByte(void);
uint16_t max6675_readRawValue(void);
float max6675_readTemperature(void);


#endif

使用特权

评论回复
10
dsyq| | 2019-5-4 13:25 | 只看该作者
换个评估板试试吧!

我调试CAN收发和MAX6675,用103R8T6都可以,用072R8T6与103C8T6都不行.

使用特权

评论回复
11
aa911|  楼主 | 2019-5-4 21:18 | 只看该作者
dsyq 发表于 2019-5-4 13:25
换个评估板试试吧!

我调试CAN收发和MAX6675,用103R8T6都可以,用072R8T6与103C8T6都不行. ...

好 的,谢谢,我试试看

使用特权

评论回复
12
maximQ820270087| | 2020-4-15 11:58 | 只看该作者
具体源程序如下 :
# include < reg51. h >
# include < absacc. h >

sbit SO= P1.1;

sbit CS= P1.2;

sbit SCK= P1.3;

unsigned char resulth ,resultl ;
unsigned char flag;
void read(void)

{

unsigned char i ;
resulth = resultl = 0 ;
SC K = 0 ;
CS = 0 ;

SC K = 1 ;

SCK= 0 ; / / 输出数据 D15
SCK= 1
for(i=4;i> =1;i- - ) //读取转换结果的高四位
{ SCK=0;
resulth^0 = SO ; / / 读取 SO 输出的字节
resulth=resulth< <1;  //数据左移
SCK=1;
}
for(ℹ=8;i>=1;i--)//读取转换结果的低8位
{

SC K = 0 ;

resultl^0 = SO;

resultl = resultl < < 1 ;
SC K = 1 ;
}

SC K = 0 ;
flag = SO ; / / 读取断偶标志
SC K = 1 ;
SCK= 0 ; / / 输出数据 D0

使用特权

评论回复
13
maximQ820270087| | 2020-6-9 11:51 | 只看该作者
MAX31855
冷端补偿热电偶至数字输出转换器
高精度热电偶数字转换器IC,
【硅天下备样信息】
MAX31855KASA+T    -200°C to +1350°C     8SO
MAX31855JASA+T     -40°C to +750°C      8SO
MAX31855NASA+T    -200°C to + 1300°C    8SO
MAX31855SASA+T     -50°C to +1600°C     8SO
MAX31855TASA+T     -250°C to +400°C    8SO
MAX31855EASA+T     -40°C to +900°C     8SO
MAX31855RASA+T     -50°C to +1770°C    8SO



【MAX31855关键特性】
冷端补偿
14位、0.25°C分辨率
转换器的温度分辨率为0.25°C,
温度读数为-270°C 至+1800°C,
对于K型热电偶,在-200°C至+700°C温度范围内,保持±2°C精度。
提供K、J、N、T和E型热电偶器件版本
简单的SPI兼容接口(只读)
检测热电偶对GND或VCC短路
检测热电偶开路
应用
电器设备
汽车
HVAC
工业


【MAX31856关键特性】
提供高精度热电偶温度读数
包括8种热电偶的自动线性度修正
±0.15%(最大值,-20°C至+85°C)热电偶满幅和线性度误差
19位、0.0078125°C热电偶温度分辨率
内置冷端补偿,将系统元件数量降至最少
转换器的温度分辨率达0.0078125°C,
允许读取高达+1800°C以及低至-210°C(取决于热电偶类型)的温度读数
±0.7°C(最大值,-20°C至+85°C)冷端补偿精度
±45V输入保护,系统性能可靠
简化系统故障管理和诊断
检测热电偶开路
过温和欠温故障检测
50Hz/60Hz噪声抑制滤波,提高系统性能
14引脚TSSOP封装

使用特权

评论回复
14
maximQ820270087| | 2020-6-9 11:52 | 只看该作者
推荐MAX31855  31856 都可以 带自动补偿的,56还自带抗干扰电路,线性优化,性价比 比6675高很多,max6675要停产了哦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

69

帖子

0

粉丝