搜索
bottom↓
回复: 10

分享max31865读温度

[复制链接]

出0入0汤圆

发表于 2020-11-19 17:30:07 | 显示全部楼层 |阅读模式
本帖最后由 windyxin872 于 2020-11-19 17:36 编辑

生活中需要总结,大家3线制割这个板时别割断了别的线,看我图片修的惨
  1. /*********start********第一块max31865芯片相关************************/   
  2.    
  3. //硬件对应
  4. #define T1_SCLK        PFout(8)   // 对应PG1
  5. #define T1_MISO        PFin(6)   // 对应PF15     
  6. #define T1_MOSI        PFout(4)  // 对应PF13  
  7. #define T1_CS          PFout(2)  // 对应PF11  
  8. #define T1_RE          PFin(0)    // 对应PB1   
  9. //信号描述定义   
  10. #define SDI_H  T1_MOSI=1
  11. #define SDI_L  T1_MOSI=0
  12. #define SCLK_H T1_SCLK=1
  13. #define SCLK_L T1_SCLK=0
  14. #define NCS_H  T1_CS=1
  15. #define NCS_L  T1_CS=0

  16. #define SDO    T1_MISO   
  17. #define DRDY   T1_RE   

  18. //数据变量   
  19. IO_EXT u8  Fault_Status; //出水max31865芯片错误标志   
  20. IO_EXT float tempture;  //出水
  21. IO_EXT u16   temp1_ad;  //出水的AD值

  22. /*********end********第一块max31865芯片相关************************/   



  23. //功能实现函数
  24. IO_EXT void ConfigurePortPins(void); //初始化 引脚功能   
  25. IO_EXT void Task_ReadIOInfo(void); //读取IO资源函数
  26. IO_EXT void MAX31865_SB_Write(u8 addr,u8 wdata); //3线配置MAX31865
  27. IO_EXT u8 MAX31865_SB_Read(u8 addr);
复制代码



  1. #define IO_GLOBAL

  2. #include "io.h"
  3. #include "main.h"
  4. /**
  5. * @brief        MAX31865芯片所用单片机引脚的初始化
  6. * @param       
  7. * @param       
  8. * @retval   
  9. */
  10. static void MAX31865_Port_Init(void)
  11. {  
  12.     GPIO_InitTypeDef GPIO_InitStruct;
  13.   /*##-1- Enable peripherals and GPIO Cloc #########################*/
  14.   /* Enable GPIO TX/RX clock */
  15.     __HAL_RCC_GPIOF_CLK_ENABLE();
  16.   /* SPI SCK GPIO pin configuration********  PG1  */
  17.   GPIO_InitStruct.Pin       = GPIO_PIN_8;      //哪个引脚
  18.   GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;  //输出
  19.   GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH; //速度选最快的
  20.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  21.   /* SPI MISO GPIO pin configuration****** PF15 */
  22.   GPIO_InitStruct.Pin = GPIO_PIN_6;
  23.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  24.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  25.   /* SPI MOSI GPIO pin configuration**** PF13  */
  26.   GPIO_InitStruct.Pin = GPIO_PIN_4;
  27.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  28.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  29.   /* SPI cs GPIO pin configuration**** PF11  */  
  30.   GPIO_InitStruct.Pin = GPIO_PIN_2;
  31.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  32.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  33.     /*  re GPIO pin configuration****** PB1 */
  34.   GPIO_InitStruct.Pin = GPIO_PIN_0;
  35.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  36.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  37.    NCS_H;
  38.    SCLK_H;
  39. }
  40. /**
  41. * @brief        IO资源引脚的初始化
  42. * @param       
  43. * @param       
  44. * @retval   
  45. */
  46. void ConfigurePortPins(void)
  47. {
  48.     MAX31865_Port_Init();
  49. }

  50. #define  DT_NUM    0x30  //延时时间
  51. /**
  52. * @brief        简单粗暴的延时函数
  53. * @param       
  54. * @param       
  55. * @retval   
  56. */
  57. void Delay(u32 nCount)
  58. {
  59.   for(; nCount != 0; nCount--);
  60. }

  61. /**
  62. * @brief        读max31865的寄存器
  63. * @param        地址
  64. * @param       
  65. * @retval   
  66. */

  67. u8 MAX31865_SB_Read(u8 addr)//SPI Single-Byte Read
  68. {
  69.   u8 i=0;
  70.   u8 read = 0;
  71.   
  72.   NCS_L;
  73.   Delay(DT_NUM);
  74.   for(i = 0; i < 8; i++)
  75.   {
  76.     SCLK_L;
  77.     if (addr & 0x80)
  78.         {SDI_H;}
  79.     else
  80.         {SDI_L;}
  81.     Delay(DT_NUM);
  82.     SCLK_H;
  83.     addr <<= 1;
  84.     Delay(DT_NUM);
  85.   }
  86.   Delay(DT_NUM);
  87.   for (i = 0; i < 8; i++)
  88.   {
  89.     SCLK_L;
  90.     read = read<<1;
  91.     Delay(DT_NUM);
  92.     if(SDO)
  93.     {
  94.       read++;
  95.     }
  96.     SCLK_H;
  97.     Delay(DT_NUM);
  98.   }
  99.   NCS_H;
  100.   return read;
  101. }

  102. /**
  103. * @brief        写max31865的寄存器
  104. * @param        地址
  105. * @param        数据
  106. * @retval   
  107. */
  108. void MAX31865_SB_Write(u8 addr,u8 wdata)//SPI Single-Byte Write
  109. {
  110.   u8 i = 0;
  111.   NCS_L;                          //拉低片选信号
  112.   Delay(DT_NUM);          //粗暴延时
  113.   //写地址
  114.   for(i = 0; i < 8; i++)  //0-7
  115.   {
  116.     SCLK_L;                                  //时钟线拉高
  117.     if (addr & 0x80)      // xxxx xxxx  & 1000 0000   addr最高位是否为1简单判断
  118.         {SDI_H;}                  // 为1 发送高电平                       
  119.     else
  120.         {SDI_L;}                          //为0 发送低电平
  121.     Delay(DT_NUM);                   //粗暴延时
  122.     SCLK_H;               //时钟线拉低
  123.     addr <<= 1;           //数据左移 判断次高位
  124.     Delay(DT_NUM);                  //粗暴延时
  125.   }
  126.   //写数据
  127.   for(i = 0; i < 8; i++)
  128.   {
  129.     SCLK_L;
  130.     if (wdata & 0x80)
  131.         {SDI_H;}
  132.     else {SDI_L;}
  133.     Delay(DT_NUM);
  134.     SCLK_H;
  135.     wdata <<= 1;
  136.     Delay(DT_NUM);
  137.   }
  138.   //操作完成拉高片选
  139.   NCS_H;
  140. }


  141. /**
  142. * @brief        简单滤波计算温度值
  143. * @param       
  144. * @param       
  145. * @retval   扩大100倍的温度
  146. */
  147. u8 temp1;
  148. u8 temp2;
  149. float Get_tempture(void)//PT100
  150. {
  151.   float temps;      
  152.   
  153.   u16 dtemp[2];
  154.   u16 data_temp;
  155.   u8 i;
  156.   static u8 cnt_num =0;
  157.   static u16 temp1_num[8];
  158.   static u32 temp1_sum;
  159.   static u16 temp1_min =0;
  160.   static u16 temp1_max =0;
  161.   dtemp[0]=MAX31865_SB_Read(0x01);//读RTD_MSB
  162.   dtemp[1]=MAX31865_SB_Read(0x02);//读RTD_LSB  
  163.   data_temp=(dtemp[0]<<7)+(dtemp[1]>>1);//Get 15Bit DATA;
  164.    
  165.   temp1=dtemp[0];
  166.   temp2=dtemp[1];
  167.   temp1_ad = data_temp;

  168.     if(cnt_num<8)cnt_num++;
  169.     else cnt_num=0;
  170.    
  171.     temp1_num[cnt_num] = data_temp;

  172.         temp1_min = temp1_num[cnt_num];
  173.           temp1_max = temp1_num[cnt_num];

  174.           if(power_time < 10) return 0;
  175.   
  176.           for (i=0,temp1_sum=0; i<8; i++)
  177.           {
  178.                  temp1_sum += temp1_num[i];
  179.                  if (temp1_num[i]<=temp1_min) temp1_min = temp1_num[i];
  180.                  if (temp1_num[i]>=temp1_max) temp1_max = temp1_num[i];
  181.           }

  182.           temp1_sum -= temp1_min;       
  183.           temp1_sum -= temp1_max;
  184.     temps = temp1_sum/6;
  185.        
  186.     temps=(temps*402)/32768;//Here is the rtd R value;
  187.   
  188.     temps=(temps-100)*100/0.385055;//A gruad 本身值经扩大100倍单位为1摄氏度
  189.    
  190.     return temps;
  191. }

  192. /**
  193. * @brief        得到PT100温度值
  194. * @param       
  195. * @param       
  196. * @retval
  197. */

  198. void  GetPT100_Temp(void)
  199. {

  200.         u8 i;
  201.         static u8 cnt_num =0;
  202.         static float temp1_num[64];
  203.         static float temp1_sum;
  204.         static float temp1_min =0;
  205.         static float temp1_max =0;
  206.        
  207.     if(cnt_num<64)cnt_num++;
  208.     else cnt_num=0;
  209.    
  210.     temp1_num[cnt_num] = Get_tempture();

  211.         temp1_min = temp1_num[cnt_num];
  212.           temp1_max = temp1_num[cnt_num];

  213.           if(power_time < 10) return;
  214.   
  215.           for (i=0,temp1_sum=0; i<64; i++)
  216.           {
  217.                  temp1_sum += temp1_num[i];
  218.                  if (temp1_num[i]<=temp1_min) temp1_min = temp1_num[i];
  219.                  if (temp1_num[i]>=temp1_max) temp1_max = temp1_num[i];
  220.           }
  221.          
  222.           temp1_sum -= temp1_min;       
  223.           temp1_sum -= temp1_max;
  224.     tempture = temp1_sum/62;
  225.     Fault_Status=MAX31865_SB_Read(0x07);//Get Fault_Status
  226. }

  227. /**
  228. * @brief        读取IO资源
  229. * @param       
  230. * @param       
  231. * @retval
  232. */
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-11-19 23:05:41 来自手机 | 显示全部楼层
哎,我们在用,只是这货没办法切量程,只能换电阻。

出0入0汤圆

 楼主| 发表于 2020-11-20 16:19:06 | 显示全部楼层
lingdianhao 发表于 2020-11-19 23:05
哎,我们在用,只是这货没办法切量程,只能换电阻。

这位兄台,为啥故障寄存器  为 0x04 ,温度还是正常的呢,tempture 是扩大100倍的温度?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-11-20 18:19:29 | 显示全部楼层
windyxin872 发表于 2020-11-20 16:19
这位兄台,为啥故障寄存器  为 0x04 ,温度还是正常的呢,tempture 是扩大100倍的温度? ...

故障没注意过,温度看你前面的算法是扩大了100倍的。

出0入0汤圆

发表于 2020-11-21 07:14:40 | 显示全部楼层
本帖最后由 cnxh 于 2020-11-21 07:16 编辑

有没有碰到用带接地屏蔽网的热电偶,有些天,会一直读不出实际温度,读出温度为0,工业现场,原来用玻璃纤维包裹的热电偶一直正常,后来客户换用带接地屏蔽网的热电偶就有问题,
然后,想了佷多办法都解决不了,最后还是用了无接地的屏蔽网热电偶敷衍过关

出0入0汤圆

发表于 2021-1-5 09:33:26 | 显示全部楼层
收藏,马上要用到

出0入137汤圆

发表于 2021-4-12 13:48:19 | 显示全部楼层
lingdianhao 发表于 2020-11-19 23:05
哎,我们在用,只是这货没办法切量程,只能换电阻。

PT100和PT1000切换?

出0入0汤圆

发表于 2021-4-13 09:12:00 | 显示全部楼层
pulan 发表于 2021-4-12 13:48
PT100和PT1000切换?

对,它是以参考电阻来采样的,只能固定量程,不能动态切换。

出0入137汤圆

发表于 2021-4-13 09:29:54 | 显示全部楼层
lingdianhao 发表于 2021-4-13 09:12
对,它是以参考电阻来采样的,只能固定量程,不能动态切换。

最近遇到麻烦,本来用zlg的模块采集PT100,结果客户要换成PT1000,模块不能兼容。只能换成其他方案了,准备用这个MAX31865了。

出55入66汤圆

发表于 2021-4-13 22:35:43 来自手机 | 显示全部楼层
搭车问一下,这个芯片有没有国产替代型号?

出0入0汤圆

发表于 2021-5-8 16:29:34 | 显示全部楼层
lingdianhao 发表于 2021-4-13 09:12
对,它是以参考电阻来采样的,只能固定量程,不能动态切换。

是不是可以自己设计电路,做个电子开关。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 03:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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