找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6434|回复: 8
打印 上一主题 下一主题
收起左侧

STM32F103+PT100+MAX31865+LCD1602+串口 源程序

  [复制链接]
跳转到指定楼层
楼主
本设计基于MAX31865设计了一款上位机实时显示当前温度的温控器,温控器具有报警功能。
下位机采用usb串口供电,供电方式简单,且可通过串口方式一键下载程序,不用使用额外的ST-LINK或者J-link下载。

STM32F103通过 SPI读取MAX31865采集铂电阻PT100温度并通过 串口发送温度值的实验程序。
压缩包包括:
程序源代码
MAX31865芯片手册(pdf格式 中文)

程序使用三线制,内通过修改寄存器数值,改成二线制以及四线制。

高精度设备满足误差预算:
15位ADC分辨率,标称温度分辨率为0.03125°C (随RTD非线性变化);
整个工作条件下,总精度保持在0.5°C (0.05%满量程);
全差分VREF输入;
转换时间:21ms (最大值);
集成故障检测,增加系统稳定性:



单片机源程序如下:
  1. #include "max31865.h"
  2. #include "spi.h"
  3. #include "delay.h"

  4. //max chushihua
  5. void MAX31865_Int(void)
  6. {
  7.         
  8.         GPIO_InitTypeDef        GPIO_InitStructure;
  9.                
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB端口时钟
  11. //        MAX31865_DRDY_APBxClkCmd(GPIO_Pin_11, ENABLE);
  12.         
  13.         
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
  17.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                //初始化GPIB15,14,13
  18.         
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //推挽输出
  21.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                //初始化GPIB15,14,13
  22.         
  23.         SPI2_Init();
  24.         SPI2_SetSpeed(SPI_BaudRatePrescaler_16);
  25. }
  26. /* 向MAX31865发送数据 */
  27. void MAX31865_SendData(uint8_t addr , uint8_t data)
  28. {
  29.         SPI_MAX31865_CS_LOW();

  30.         SPI2_ReadWriteByte(addr);

  31.         SPI2_ReadWriteByte(data);

  32.         SPI_MAX31865_CS_HIGH();
  33. }

  34. /* 从MAX31865读取数据 */
  35. uint8_t MAX31865_ReceiveData(uint8_t addr)
  36. {
  37.         uint8_t data;

  38.         SPI_MAX31865_CS_LOW();


  39.         SPI2_ReadWriteByte(addr);

  40.         data = SPI2_ReadWriteByte(addr);

  41.         SPI_MAX31865_CS_HIGH();
  42.         return data;
  43. }


  44. //void MAX31855_ReadData()
  45. //{
  46. //        u32 data=0;
  47. //        int i;
  48. //        SPI_MAX31865_CS_LOW();
  49. //        delay_ms(1);
  50. //        for(i=31;i>=0;i--)
  51. //                 GPIOA_MAX31855_SCK_H;
  52. //                        delay_ms(1);
  53. //               

  54. //}
复制代码
  1. #include "stm32f10x.h"
  2. #include "spi.h"
  3. //#include "./usart/bsp_usart_dma.h"
  4. #include "max31865.h"
  5. #include "lcd1602.h"
  6. #include "delay.h"
  7. #include "usart.h"
  8. //uint8_t read_temp_HIGH;
  9. //uint8_t read_temp_LOW;
  10. //uint16_t read_temp;
  11. u8 i;
  12.    u16 s1;
  13.    u16 s2;
  14.          u16 s3=0;
  15.          u32 s4=0;
  16.          u16 s5;
  17.          unsigned long wd=0;
  18. int main(void)
  19. {
  20.                 SystemInit();
  21.                 delay_init();                     //延时函数初始化         
  22.                 LCD1602_Init();                        //1602初始化
  23.                 SPI2_Init();                        //spi初始化
  24.                 MAX31865_Int();                        //MAX初始化ADC1
  25.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  26.                 uart_init(115200);                 //串口初始化为115200
  27.         
  28.         while(1)
  29.         {        
  30.                
  31.                 MAX31865_SendData(MAX31856_CONFIG_3WIRE,0xc1);
  32.                 MAX31865_SendData(MAX31856_CONFIG_REG,0xf2);    //11110010
  33.                 s1=MAX31865_ReceiveData(MAX31856_RTDMSB_REG);
  34.                 s2=MAX31865_ReceiveData(MAX31856_RTDLSB_REG);
  35.                 s3=(s1<<8) | s2;
  36.                 printf("s3:%x",s3);
  37. //                delay_ms(50);
  38.                 s3=s3>>1;
  39. //                s3=s3&0xfffe;
  40.                
  41.                 wd=(s3/32)-256;
  42.                 printf("wd:%d\r\n",wd);
  43.                 LCD1602_Show_Str(0,0,"WD:");
  44. //                LCD1602_Write_Dat(wd/100%10+0x30);
  45.                 LCD1602_Write_Dat(wd/10%10+0x30);
  46. //                LCD1602_Show_Str(5,0,".");
  47.                 LCD1602_Write_Dat(wd%10+0x30);

  48.                 LCD1602_Show_Str(9,0,"^C");

  49.         }
  50. }
复制代码


所有资料51hei提供下载:
MAX31865_PT100_源代码.7z (192.12 KB, 下载次数: 370)
max31865资料.zip (457.42 KB, 下载次数: 169)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:337609 发表于 2022-3-14 18:41 | 只看该作者
楼主您好,这款测量的温度范围是多少?
回复

使用道具 举报

板凳
ID:235954 发表于 2022-4-27 10:43 | 只看该作者
984055 发表于 2022-3-14 18:41
楼主您好,这款测量的温度范围是多少?

测量范围是根据PTC的器件参数决定
回复

使用道具 举报

地板
ID:622096 发表于 2022-6-10 18:46 | 只看该作者
您好,这个精度能达到多少
回复

使用道具 举报

5#
ID:493412 发表于 2022-11-27 19:26 | 只看该作者
感谢楼主分享,模块收到了测试是否可行
回复

使用道具 举报

6#
ID:748535 发表于 2023-8-14 19:49 | 只看该作者
刚好需要来参考
回复

使用道具 举报

7#
ID:62363 发表于 2023-10-29 18:36 | 只看该作者
程序里用的SPI2,管脚B13/14/15。为什么帖子里面的原理图画的PA4/5/6/7呢?本想按图接呢,发现对不上
回复

使用道具 举报

8#
ID:444215 发表于 2023-11-6 17:05 | 只看该作者
下载看了下,没原理图呢?
回复

使用道具 举报

9#
ID:140644 发表于 2023-12-7 18:58 | 只看该作者
NICE.
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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