打印
[STM32F1]

读取max6675温度

[复制链接]
376|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengdc|  楼主 | 2022-6-16 20:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
得到的温度波动很大,不准确,串口打印的数据如图所示,哪里出了问题?

使用特权

评论回复
沙发
dengdc|  楼主 | 2022-6-16 20:51 | 只看该作者
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");



                        

                }





}

使用特权

评论回复
板凳
dengdc|  楼主 | 2022-6-16 20:53 | 只看该作者
#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;

}




使用特权

评论回复
地板
dengdc|  楼主 | 2022-6-16 20:55 | 只看该作者

使用特权

评论回复
5
dengdc|  楼主 | 2022-6-16 20:58 | 只看该作者

使用特权

评论回复
6
dengdc|  楼主 | 2022-6-16 21:00 | 只看该作者

使用特权

评论回复
7
jlyuan| | 2022-6-16 21:02 | 只看该作者
请问一下 这个准吗?

读数准吗?

使用特权

评论回复
8
stly| | 2022-6-16 21:04 | 只看该作者
内部是靠什么做的滤波啊?

使用特权

评论回复
9
dengdc|  楼主 | 2022-6-16 21:06 | 只看该作者
从打印出来的数据看,读数不准,不知道代码哪里出了问题。

使用特权

评论回复
10
zhenykun| | 2022-6-16 21:09 | 只看该作者
用SPI读取吧!
我用F1的SPI读“没问题”,但用F072的SPI读出的数始终有问题。

使用特权

评论回复
11
shimx| | 2022-6-16 21:12 | 只看该作者
感觉有十分之一的数据会变得离谱,不知是否该软件滤掉。

使用特权

评论回复
12
dengdc|  楼主 | 2022-6-16 21:16 | 只看该作者
我也想用SPI,但是这个电路就这样了,而且实际项目用的MCU就是F072

使用特权

评论回复
13
dengdc|  楼主 | 2022-6-16 21:18 | 只看该作者
本帖最后由 dengdc 于 2022-6-16 21:22 编辑

有人知道咋回事吗

使用特权

评论回复
14
wyjie| | 2022-6-16 21:23 | 只看该作者
可以看看你的代码吗?

使用特权

评论回复
15
dengdc|  楼主 | 2022-6-16 21:28 | 只看该作者
#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);
}

使用特权

评论回复
16
午夜粪车| | 2022-6-16 21:31 | 只看该作者
#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

使用特权

评论回复
17
juventus9554| | 2022-6-16 21:32 | 只看该作者
换个评估板试试吧!

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

使用特权

评论回复
18
llljh| | 2022-6-16 21:36 | 只看该作者
具体源程序如下 :
# 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

使用特权

评论回复
19
dengdc|  楼主 | 2022-6-16 21:39 | 只看该作者
好 的,谢谢,我试试看

使用特权

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

本版积分规则

892

主题

13885

帖子

7

粉丝