OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6581|回复: 11

STM32F429接MAX6675读取热电偶温度

[复制链接]

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-11-13
在线时间
29 小时
发表于 2016-12-14 22:50:23 | 显示全部楼层 |阅读模式
10金钱
第一次编写STM32程序,有很多问题请教,我想把MAX6675的SO的数据读出来转换成实际温度,用串口工具读出来。
是不是还有哪些没配置好?小弟刚开始弄这个,着急用,在此感谢了!
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"

  4. #define SPI1_CS_Pin GPIO_PIN_4

  5. void Delay(__IO uint32_t nCount);

  6. void Delay(__IO uint32_t nCount)
  7. {
  8. while(nCount--){}
  9. }

  10. int main(void)
  11. {
  12.     uint16_t GetData=0;
  13.     uint16_t Temperature = 0;
  14.     uint16_t T = 0;



  15.     GPIO_InitTypeDef GPIO_A;        //定义一个GPIO_InitTypeDef的结构体GPIO_A
  16.     SPI_HandleTypeDef hspi1;        //SPI句柄


  17.     HAL_Init(); //初始化HAL库
  18.     Stm32_Clock_Init(360,25,2,8); uart_init(115200); //初始化USART

  19.     __HAL_RCC_SPI1_CLK_ENABLE();        //开启SP1时钟
  20.     __HAL_RCC_USART1_CLK_ENABLE();
  21.     __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟

  22.     GPIO_A.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  23.     GPIO_A.Mode = GPIO_MODE_AF_PP;        //复用推挽输出
  24.     GPIO_A.Pull=GPIO_PULLUP; //上拉
  25.     GPIO_A.Speed = GPIO_SPEED_LOW; //2MHz
  26.     GPIO_A.Alternate = GPIO_AF5_SPI1;
  27.     HAL_GPIO_Init(GPIOA,&GPIO_A);        //上面为配置参数,此处启动初始化

  28.     GPIO_A.Pin=SPI1_CS_Pin; //配置PA4(CS片选信号)
  29.     GPIO_A.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
  30.     GPIO_A.Speed = GPIO_SPEED_LOW; //2MHz
  31.     HAL_GPIO_Init(GPIOA,&GPIO_A);        //上面为配置参数,此处启动初始化
  32.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);        // 先把片选拉高,真正用的时候再拉低

  33.     hspi1.Instance = SPI1;
  34.     hspi1.Init.Mode = SPI_MODE_MASTER;        //主模式
  35.     hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;//SPI设置为单线接受
  36.     hspi1.Init.DataSize = SPI_DATASIZE_16BIT;//SPI发送接收数据为16位帧格式
  37.     hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;//同步时钟空闲状态为 高电平
  38.     hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;        //同步时钟第二个跳变沿数据被采集       
  39.     hspi1.Init.NSS = SPI_NSS_SOFT;        //NSS信号由软件控制
  40.     hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; //波特率预分频值为256;
  41.     hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;        //数据传输从MSB位开始
  42.     hspi1.Init.TIMode = SPI_TIMODE_DISABLE;        //关闭TI模式
  43.     hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;        //关闭CRC
  44.     hspi1.Init.CRCPolynomial = 7;        //CRC值计算的多项式
  45.     HAL_SPI_Init(&hspi1);        //初始化
  46.     __HAL_SPI_ENABLE(&hspi1);        //使能SPI1

  47.     #define SPI1_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);//片选信号拉低为SPI_L
  48.     #define SPI1_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);        //片选信号拉高为SPI_H
  49.     SPI1_H;        //拉高片选,为后面开启片选做准备


  50.     while(1)
  51.     {
  52.         SPI1_L;        //开启片选
  53.         HAL_SPI_Receive(&hspi1, (uint8_t*)&GetData, 1, 1000);
  54.         Temperature = (GetData>>3)&0x0fff;
  55.         SPI1_H;       
  56.         HAL_Delay(1000);

  57.         T = Temperature*1024/4095;
  58.         printf ("Temperature:%d\n",T);
  59.     }
复制代码


最佳答案

查看完整内容[请看2#楼]

hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; 注意,配置SPI的极性
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-9
在线时间
48 小时
发表于 2016-12-14 22:50:24 | 显示全部楼层
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;  
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;  
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;

注意,配置SPI的极性
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-12-17 20:56:53 | 显示全部楼层
帮顶
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-11-13
在线时间
29 小时
 楼主| 发表于 2017-1-9 10:07:37 | 显示全部楼层
wofei1314 发表于 2016-12-27 17:23
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;  
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;  
hspi2.Init.B ...

极性Polarity和相位Phase我都配置了[mw_shl_code=applescript,true]hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;        //同步时钟第二个跳变沿数据被采集        
hspi1.Init.NSS = SPI_NSS_SOFT;        //NSS信号由软件控制
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; //波特率预分频值为256;[/mw_shl_code]
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-11-13
在线时间
29 小时
 楼主| 发表于 2017-1-9 10:10:34 | 显示全部楼层
wofei1314 发表于 2016-12-27 17:23
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;  
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;  
hspi2.Init.B ...

极性Polarity和相位Phase我都配置了:
[mw_shl_code=c,true]hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;//同步时钟空闲状态为 高电平
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;        //同步时钟第二个跳变沿数据被采集        
hspi1.Init.NSS = SPI_NSS_SOFT;        //NSS信号由软件控制
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; //波特率预分频值为256;[/mw_shl_code]
回复

使用道具 举报

15

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-9
在线时间
48 小时
发表于 2017-1-11 11:13:27 | 显示全部楼层
木犀 发表于 2017-1-9 10:10
极性Polarity和相位Phase我都配置了:
[mw_shl_code=c,true]hspi1.Init.CLKPolarity = SPI_POLARITY_HIG ...

你看我回复的是  Low 和 2EDGE....

你配置的是  HIGH.....
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-11-13
在线时间
29 小时
 楼主| 发表于 2017-1-13 11:02:19 | 显示全部楼层
wofei1314 发表于 2017-1-11 11:13
你看我回复的是  Low 和 2EDGE....

你配置的是  HIGH.....

我改了,但是数据有问题,乱跳。
还有什么可能导致这样的结果?

结果.png
回复

使用道具 举报

15

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-9
在线时间
48 小时
发表于 2017-1-19 19:11:36 | 显示全部楼层
看看是不是转换的有问题??
回复

使用道具 举报

20

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2019-4-28
在线时间
80 小时
发表于 2020-4-20 14:44:06 | 显示全部楼层
楼主问题解决了么,最近在做,方便请教一下么
回复

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-6-3 18:13:50 | 显示全部楼层
木犀 发表于 2017-1-13 11:02
我改了,但是数据有问题,乱跳。
还有什么可能导致这样的结果?

数据乱跳  应该是干扰性问题,硬件方便  应在靠近MAX31855封装的位置,在T+和T-引脚之间安装10nF(最大值)陶瓷电容;在T+至GND以及T-至GND之间安装10nF去耦电容(最大值)。
回复

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-6-3 18:14:23 | 显示全部楼层
a3413209 发表于 2020-4-20 14:44
楼主问题解决了么,最近在做,方便请教一下么

你遇到具体什么问题,也是数据乱跳吗
回复

使用道具 举报

16

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2020-2-19
在线时间
10 小时
发表于 2020-6-3 18:19:41 | 显示全部楼层
a3413209 发表于 2020-4-20 14:44
楼主问题解决了么,最近在做,方便请教一下么

max31855性价比优越于max6675,而且6675要停产了

MAX6675关键特性
可读取温度达+1024°C,
热电偶在0°C至+700°C温度范围内精度为8 LSB。

冷端温度补偿
简单的SPI兼容串行接口
12位、0.25°C分辨率
热电偶开路检测


MAX31855关键特性

换器的温度分辨率为0.25°C,
最高温度读数为+1800°C,最低温度读数为-270°C,
对于K型热电偶,在-200°C至+700°C温度范围内,保持±2°C精度。
冷端补偿
14位、0.25°C分辨率
提供K、J、N、T和E型热电偶器件版本(如果使用S和R型热电偶,请联系硅天下集团) (参考完整数据资料中的表1)
简单的SPI兼容接口(只读)
检测热电偶对GND或VCC短路
检测热电偶开路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 23:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表