ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1.15. SPI之max31865

2022-07-24 11:33:41  阅读:191  来源: 互联网

标签:1.15 lsb read self SPI max31865 cs msb


1.15.1. Max31865

MAX31865是一款集成的的单芯片RTD数字转换器,用于替代多个分立元件来降低成本。它提供简单而准确的温度测量,非常适合用于测量和过程控制,是在工业领域最常用的测量方案。

MAX31865完全集成了RTD数字转换器,单芯片方案降低了系统成本(CD约50%)和系统的复杂度,尤其适用于工业中最常用的铂RTD (如Pt100或Pt1000),解决了电阻->数字转换问题。

典型特征:

u 简单地解决了铂RTD电阻数字化问题

u 适用PT100、PT1000

u 适用于2线、3线、4线接法

u wps49转换时间≤21ms

u 15bits ADC精度

u 全局精度≤0.5℃

u 输入保护±50V

u 查分输入

u 检测机制

u SPI总线

u 20-PIN TQFN封装

TQFN封装手工焊有难度,故实验中采用某宝采购的模块和3线PT100,如上图所示。

1.15.2. SPI总线

ESP32的micropython固件,内置硬件spi模块SPI(spi1、spi2)和软件spi模块SoftSPI。SPI模块/SoftSPI模块作为machine的子模块,与Pin/I2C/Uart等处于同级目录。

下图摘自micropython官网:

wps50

wps51

实际使用时,硬件spi/软件spi均可满足使用要求,本实验中使用软件spi。

1.15.3. 接线

Pin

MAX31865

ESP32-WROOM-32

CS

CS

D4

SDI

Sdi

D23

SDO

sdo

D19

SCK

sck

D18

wps52

1.15.4. 读取温度

代码实现如下:

 1 from time import sleep,sleep_ms
 2 from machine import SPI,Pin,SoftSPI
 3 
 4 cs = Pin(4,Pin.OUT)
 5 max31865 = SoftSPI(baudrate=1000000,\
 6                    polarity=0,phase=1,\
 7                    firstbit=SPI.MSB,\
 8                    sck=Pin(18),\
 9                    mosi=Pin(23),\
10                    miso=Pin(19))
11 
12 max31865.init()
13 
14 DEBUG = False
15 
16 def config(value=b'\x80\xd3'):
17     cs.off()
18     max31865.write(value)
19     cs.on()
20     pass
21 
22 def readConfig():
23     cs.off()
24     max31865.write(b'\x00')
25     config = max31865.read(1)
26     cs.on()
27     if DEBUG:
28         print(config) 
29 
30 def readADC():
31     cs.off()
32     max31865.write(b'\x01')
33     msb = max31865.read(1)
34     lsb = max31865.read(1)
35     cs.on()
36     if DEBUG:
37         print("\t->msb:"+str(msb)+";lsb:"+str(lsb))
38     return(msb[0],lsb[0])
39 
40 def readHFault():
41     cs.off()
42     max31865.write(b'\x03')
43     msb = max31865.read(1)
44     lsb = max31865.read(1)
45     cs.on()
46     if DEBUG:
47         print("\t->hfmsb:"+str(msb)+";hflsb:"+str(lsb))
48 
49 def readLFault():
50     cs.off()
51     max31865.write(b'\x05')
52     msb = max31865.read(1)
53     lsb = max31865.read(1)
54     cs.on()
55     if DEBUG:
56         print("\t->lfmsb:"+str(msb)+";lflsb:"+str(lsb))
57 
58 def readFault():
59     cs.off()
60     max31865.write(b'\x07')
61     config = max31865.read(1)
62     cs.on()
63     if DEBUG:
64         print("\tfault:",config)
65 
66 Config()
67 
68 while True:
69     '''
70         max31865手册p19,r_pt=100Ω对应0℃,
71 r_pt=111.67Ω对应30℃,带入公式
72         t = r*a+b可得a = 2.57,b=-257
73         ∴temperature = 2.57*r_pt - 257
74     '''
75 
76     m,l = readADC()
77     adc_code = (((m*256)+l)>>1)
78     temp = ((adc_code/32) -256)
79     r_pt = ((adc_code*430)/32768)
80     print("R:",r_pt)
81     print("temperature:%3.2f ℃" %(2.57*r_pt-257))
82     sleep(1)

 

注意:max31865 datasheet说明

a. 连续转换时不要改变config寄存器D0值;

b. Max31865支持spi模式1/3,所以phase必须为1;

c. 高字节在前,MSB模式;

wps53wps54

1.15.5. 抽象为模块

Max31865驱动模块源码:

  1 from time import sleep,sleep_ms
  2 from machine import SPI,Pin,SoftSPI
  3 
  4 class MAX31865:
  5     def __init__(self,\
  6                  sck,\
  7                  mosi,\
  8                  miso,\
  9                  cs,\
 10                  baudrate=1000000,\
 11                  polarity=0,\
 12                  phase=1,\
 13                  firstbit=SPI.MSB,\
 14                  debug=False,\
 15                  compensation=0):
 16         '''
 17                 默认
 18                 baudrate=1000000 10M
 19                 polarity=0
 20                 phase =1
 21                 MSB
 22                 compensation=0
 23         '''
 24 
 25         self.cs = Pin(cs,Pin.OUT)
 26         self.max31865 = SoftSPI(baudrate=baudrate,\
 27                                polarity=polarity,phase=phase,\
 28                                firstbit=SPI.MSB,\
 29                                sck=Pin(sck),\
 30                                mosi=Pin(mosi),\
 31                                miso=Pin(miso))
 32         self.compensation = compensation
 33         self.max31865.init()
 34         self.DEBUG = debug
 35         self.config()
 36 
 37     def config(self,value=b'\x80\xd3'):
 38         '''
 39             默认:
 40             连续转换 bias on
 41         '''
 42         self.cs.off()
 43         self.max31865.write(value)
 44         self.cs.on()
 45         pass
 46 
 47     def readConfig(self):
 48         '''
 49         读配置寄存器
 50         '''
 51         self.cs.off()
 52         self.max31865.write(b'\x00')
 53         config = self.max31865.read(1)
 54         self.cs.on()
 55         if self.DEBUG:
 56             print(config)
 57         return(config)
 58 
 59     def readADC(self):
 60         '''
 61         读ADC值
 62         '''
 63         self.cs.off()
 64         self.max31865.write(b'\x01')
 65         msb = self.max31865.read(1)
 66         lsb = self.max31865.read(1)
 67         self.cs.on()
 68         if self.DEBUG:
 69             print("\t->msb:"+str(msb)+";lsb:"+str(lsb))
 70         return(msb[0],lsb[0])
 71 
 72     def readHFault(self):
 73         '''
 74         读上界限寄存器
 75         '''       
 76         self.cs.off()
 77         self.max31865.write(b'\x03')
 78         msb = self.max31865.read(1)
 79         lsb = self.max31865.read(1)
 80         self.cs.on()
 81         if self.DEBUG:
 82             print("\t->hfmsb:"+str(msb)+";hflsb:"+str(lsb))
 83         return(msb[0],lsb[0])
 84 
 85     def readLFault(self):
 86         '''
 87         读下界限寄存器
 88         '''       
 89         self.cs.off()
 90         self.max31865.write(b'\x05')
 91         msb = self.max31865.read(1)
 92         lsb = self.max31865.read(1)
 93         self.cs.on()
 94         if self.DEBUG:
 95             print("\t->hfmsb:"+str(msb)+";hflsb:"+str(lsb))
 96         return(msb[0],lsb[0])
 97 
 98     def readFault(self):
 99         '''
100         读错误
101         '''       
102         self.cs.off()
103         self.max31865.write(b'\x07')
104         config = self.max31865.read(1)
105         self.cs.on()
106         if self.DEBUG:
107             print("\tfault:",config)
108         return(config)
109 
110     def readTemperature(self):
111         '''
112         读温度值
113         '''
114         m,l = self.readADC()
115         adc_code = (((m*256)+l)>>1)
116         temp = ((adc_code/32) -256)
117         r_pt = ((adc_code*430)/32768)
118         temperature = (2.57*r_pt-257+self.compensation)
119         return(temperature)                                        

Main.py文件示例:

1 from max31865 import MAX31865
2 from time import sleep
3 
4 sensor = MAX31865(18,23,19,4)
5 
6 while True:
7     print("Temperature:%3.2f" %(sensor.readTemperature()))
8     sleep(1)

 

运行效果如下图:

wps55

标签:1.15,lsb,read,self,SPI,max31865,cs,msb
来源: https://www.cnblogs.com/horal/p/16514117.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有