标题: STM32F103+PT100+MAX31865+LCD1602+串口 源程序 [打印本页]

作者: 梁廷明    时间: 2021-1-23 15:17
标题: 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, 下载次数: 430)
max31865资料.zip (457.42 KB, 下载次数: 192)





作者: 984055    时间: 2022-3-14 18:41
楼主您好,这款测量的温度范围是多少?
作者: 梁廷明    时间: 2022-4-27 10:43
984055 发表于 2022-3-14 18:41
楼主您好,这款测量的温度范围是多少?

测量范围是根据PTC的器件参数决定
作者: 83286924    时间: 2022-6-10 18:46
您好,这个精度能达到多少
作者: 787384900    时间: 2022-11-27 19:26
感谢楼主分享,模块收到了测试是否可行
作者: 椰子01    时间: 2023-8-14 19:49
刚好需要来参考
作者: 51hei1005    时间: 2023-10-29 18:36
程序里用的SPI2,管脚B13/14/15。为什么帖子里面的原理图画的PA4/5/6/7呢?本想按图接呢,发现对不上
作者: 249449417@qq.co    时间: 2023-11-6 17:05
下载看了下,没原理图呢?
作者: czhaii    时间: 2023-12-7 18:58
NICE.
作者: huaishang    时间: 2024-10-2 19:18
谢谢楼主分享,学习学习!!
作者: huaishang    时间: 2025-1-1 09:43
感谢楼主分享
作者: dreamer1231    时间: 2025-6-4 14:16
感谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1