[新品上市] 【APM32F107VC-MINI开发板测评】-02-SPI+MAX31865 +PT100测试

[复制链接]
 楼主| shenxiaolin 发表于 2023-3-27 20:47 | 显示全部楼层 |阅读模式
前段时间一直在做一个MAX31865+PT100的测试,在淘宝买了一个模块,调试了很久,一直没有调试通,昨天晚上在家的时候一直在找问题,终于在今天晚上完成了调试,所以写个分享和大家说一下进度。
淘宝上的模块有点坑,本来是可以选择焊接的,但是说巧不巧,调试的时候通过错误状态寄存器发现了提示RTD+短路到GND,导致数据一直读取不出来来,而错误位一直提示错误,导致读取到的数据一直为0,经过排查,是网上后买的模块本生存在短路导致的,用小刀隔开之后就正常了,下面先上个图。由于一直在调试这个SPI,所以其他的都还没有做测试,这里就直接放仿真的图来。
SPI_PT100.png
好了,下面放一部分代码上来,以及自己搜集的资料。希望能够给大家一些帮助。






  1. #include "MAX_31865.h"
  2. #include "DRV_SPI.h"





  3. void LEDIO_Init(void)
  4. {
  5.         GPIO_Config_T  configStruct;
  6.         RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOE);
  7.         configStruct.pin =GPIO_PIN_6;
  8.         configStruct.mode = GPIO_MODE_OUT_PP;
  9.         configStruct.speed = GPIO_SPEED_50MHz;
  10.         GPIO_Config(GPIOE, &configStruct);
  11. }       


  12. void LED_Flash(void)
  13. {
  14.         GPIO_ResetBit(GPIOE,GPIO_PIN_6);
  15.         Delay(500);
  16.         GPIO_SetBit(GPIOE,GPIO_PIN_6);
  17.         Delay(500);
  18. }


  19.         float DataTemp=0;
  20. unsigned char REG_ADD0=0,FaultStatus=0;


  21. int main(void)
  22. {


  23.                 LEDIO_Init();
  24.                 Delay(10);
  25.           MAX_31865_Init(MAX31865_3WIRE);
  26.                 Delay(10);
  27.     while (1)
  28.     {
  29.                         DataTemp=MAX_31865_Test();
  30.                         LED_Flash();
  31.                         FaultStatus=ReadFaultREG();

  32.     }
  33. }



  1. #include "DRV_SPI.h"

  2. /*
  3. =====================================
  4. SPI_CS---->PB12
  5. SPI_SCLK-->PB13
  6. SPI_MISO-->PB14
  7. SPI_MOSI-->PB15
  8. =====================================
  9. */
  10. void SPI_FullDuplex_Init(void)
  11. {
  12.     GPIO_Config_T gpioConfig;
  13.     SPI_Config_T spiConfig;
  14.     /* Enable related Clock */
  15.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_SPI2);
  16.        
  17.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB);

  18.     /* config PIN_6  MISO */
  19.     gpioConfig.pin =  GPIO_PIN_14 ;
  20.     gpioConfig.mode = GPIO_MODE_IN_FLOATING;
  21.     gpioConfig.speed = GPIO_SPEED_50MHz;
  22.     GPIO_Config(GPIOB, &gpioConfig);

  23.     /* config PIN_5->SCK , PIN_7->MOSI */
  24.     gpioConfig.pin = GPIO_PIN_13 | GPIO_PIN_15;
  25.     gpioConfig.mode = GPIO_MODE_AF_PP;
  26.     gpioConfig.speed = GPIO_SPEED_50MHz;
  27.     GPIO_Config(GPIOB, &gpioConfig);
  28.             /* config PIN_6  cs */
  29.     gpioConfig.pin =  GPIO_PIN_12 ;
  30.     gpioConfig.mode = GPIO_MODE_OUT_PP;
  31.     gpioConfig.speed = GPIO_SPEED_50MHz;
  32.     GPIO_Config(GPIOB, &gpioConfig);
  33.                
  34.                
  35.        
  36.     SPI_ConfigStructInit(&spiConfig);
  37.     spiConfig.length = SPI_DATA_LENGTH_8B;
  38.     spiConfig.baudrateDiv = SPI_BAUDRATE_DIV_64;
  39.     /* 2 line full duplex */
  40.     spiConfig.direction = SPI_DIRECTION_2LINES_FULLDUPLEX;
  41.     /* LSB first */
  42.     spiConfig.firstBit = SPI_FIRSTBIT_MSB;
  43.     /* Slave mode */
  44.     spiConfig.mode = SPI_MODE_MASTER;
  45.     /* Polarity is low */
  46.     spiConfig.polarity = SPI_CLKPOL_LOW;
  47.     /*  Software select slave enable  */
  48.     spiConfig.nss = SPI_NSS_SOFT;
  49.     /* Phase is 1 edge */
  50.     spiConfig.phase = SPI_CLKPHA_2EDGE;
  51.     /* SPI config */
  52.     SPI_Config(SPI2, &spiConfig);
  53.     SPI_ConfigDataSize(SPI2, SPI_DATA_LENGTH_8B);

  54.     SPI_Enable(SPI2);
  55.                 SPI_CS_HIGH();
  56.                
  57. }



  58. void SPI_WriteByte(unsigned char  Data)
  59. {
  60.          while (SPI_I2S_ReadStatusFlag(SPI2, SPI_FLAG_BSY) != RESET){};
  61.           SPI_I2S_TxData(SPI2, Data);
  62. }

  63. unsigned char SPI_ReadByte(void)
  64. {
  65.         unsigned char Data=0;

  66.         Data = SPI_I2S_RxData(SPI2);
  67.          while (SPI_I2S_ReadStatusFlag(SPI2, SPI_FLAG_RXBNE) != RESET);
  68.         return Data;
  69. }


  70. unsigned char  SPI_Read_Write(unsigned char Data)
  71. {
  72.         unsigned char RTNData=0;
  73.          while (SPI_I2S_ReadStatusFlag(SPI2, SPI_FLAG_TXBE) == RESET){};
  74.           SPI_I2S_TxData(SPI2, Data);
  75.                  while(SPI_I2S_ReadStatusFlag(SPI2, SPI_FLAG_RXBNE) == RESET){};
  76.                 RTNData = SPI_I2S_RxData(SPI2);

  77.         return RTNData;

  78. }






  1. float MAX31865_ReadTemp(float RTDnominal, float RefResistor)
  2. {

  3.   float Z1, Z2, Z3, Z4, Rt, temp;
  4.   float rpoly = Rt;
  5.   Rt = MAX31865_ReadRTD();
  6.   Rt /= 32768.0;
  7.   Rt *= RefResistor;
  8.        
  9.   Z1 = -RTD_A;
  10.   Z2 = RTD_A * RTD_A - (4.0 * RTD_B);
  11.   Z3 = (4.0 * RTD_B) / RTDnominal;
  12.   Z4 = 2.0 * RTD_B;

  13.   temp = Z2 + (Z3 * Rt);
  14.   temp = (sqrt(temp) + Z1) / Z4;

  15.   if (temp >= 0)
  16.     return temp;

  17.   // ugh.
  18.   Rt /= RTDnominal;
  19.   Rt *= 100.0; // normalize to 100 ohm



  20.   temp = -242.02;
  21.   temp += 2.2228 * rpoly;
  22.   rpoly *= Rt; // square
  23.   temp += 2.5859e-3 * rpoly;
  24.   rpoly *= Rt; // ^3
  25.   temp -= 4.8260e-6 * rpoly;
  26.   rpoly *= Rt; // ^4
  27.   temp -= 2.8183e-8 * rpoly;
  28.   rpoly *= Rt; // ^5
  29.   temp += 1.5243e-10 * rpoly;
  30.   return temp;
  31. }


  32. float MAX_31865_Test(void)
  33. {
  34.                 float TempData=0.0;
  35.     TempData=MAX31865_ReadTemp(RTD_NNUM,REG_REF);
  36.                 Delay(10);
  37.                 return TempData;
  38. }



max31865.rar (7.55 MB, 下载次数: 5)
 楼主| shenxiaolin 发表于 2023-4-11 11:30 | 显示全部楼层
自己过来看看。
saservice 发表于 2023-4-15 19:53 | 显示全部楼层
PT100能测温范围是-200℃到420℃
abotomson 发表于 2023-4-15 20:03 | 显示全部楼层
温度传感器pt100精度是多少?
uiint 发表于 2023-4-15 20:10 | 显示全部楼层
这个测量的精度怎么样              

评论

感觉还行,我用的水银的温度计做了一下对比,差不多差0.4度左右,  发表于 2023-4-16 17:40
gygp 发表于 2023-4-16 21:49 | 显示全部楼层
MAX31865输出是数字信号,需要通过串口读取数值。
pmp 发表于 2023-4-16 22:01 | 显示全部楼层
max31865怎么接pt100

评论

分2线3线和四线,接法不一样  发表于 2023-4-17 09:45
qiufengsd 发表于 2023-4-16 22:07 | 显示全部楼层
采用MAX31865芯片采集PT100?
geraldbetty 发表于 2023-4-16 22:23 | 显示全部楼层
MAX31865的相关资料较少
burgessmaggie 发表于 2023-4-16 22:29 | 显示全部楼层
三芯PT100温度传感器怎么接线
linfelix 发表于 2023-4-16 22:36 | 显示全部楼层
max31865是一个SPI芯片 吧  
belindagraham 发表于 2023-4-16 22:53 | 显示全部楼层
四线是最准确的,因为单独的力和感测引线消除了线电阻的影响。
louliana 发表于 2023-4-16 23:02 | 显示全部楼层
MAX31865为每种配置提供专用的 RTD 信号调理电路,分辨率为 15 位,并提供加速 PT100 和 PT1000 RTD 设计的解决方案 热电偶 热电偶是最常用的温度传感器类型。

评论

的确是这样的,而且数字量还是比较准确的  发表于 2023-4-17 09:47
 楼主| shenxiaolin 发表于 2023-4-17 09:46 | 显示全部楼层
qiufengsd 发表于 2023-4-16 22:07
采用MAX31865芯片采集PT100?

是的,直接读取的
chenci2013 发表于 2023-4-17 18:11 | 显示全部楼层
如何校准PT100的温度数据              
louliana 发表于 2023-4-18 11:37 | 显示全部楼层
通过MAX31865读取PT100电阻值,转换为温度的。
louliana 发表于 2023-5-5 20:33 | 显示全部楼层
温度传感器pt100精度是多少?
wangdezhi 发表于 2023-5-5 20:41 | 显示全部楼层
PT100最高能达到多少精度?
xiaoyaodz 发表于 2023-5-5 21:06 | 显示全部楼层

pt100精度的A级和B级是什么意思
jackcat 发表于 2023-5-5 21:17 | 显示全部楼层
将PT100温度传感器连接到MAX31865芯片的RTD+和RTD-引脚上,并将MAX31865的其他引脚连接到微控制器或单片机上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:运达电气-产品经理
简介:毕业于西南科技大学,从事MCU、MPU开发工作近8年,熟悉嵌入式软硬件开发流程,产品管理以及现场项目管理。

94

主题

1351

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:运达电气-产品经理
简介:毕业于西南科技大学,从事MCU、MPU开发工作近8年,熟悉嵌入式软硬件开发流程,产品管理以及现场项目管理。

94

主题

1351

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部