背景:
热电偶的测温是工业现场常用的测温手段,但是欧洲系列的工控领域中使用的大部分都是J型热电偶,而日本以及台湾等地大部分使用的是K型热电偶。因为日本和台湾的工控产品较早地进入国内,因此国内大部分设备胜场厂家在使用热电偶传感器的时候经常会使用K型热电偶。但是随着欧系的高端工控产品进入国内市场,单一支持K型热电偶的测温手段显得太过单一。市场急需一款支持多种热电偶的产品出现,此时Maxim厂家发布了一款支持K, J, N, R, S, T, E, B型的测温芯片MAX31856(市场上多是MAX31856 MUD+封装的芯片,实际功能一致)。
MAX31856芯片的介绍:
其他的我不想多介绍,免得文章过长使读者疲累。详细的说明请看此链接下的说明书:
接下来芯片的介绍主要围绕怎么用SPI通讯的方式去设置MAX31856的热电偶类型以及温度转换方式。
先介绍MAX31856的芯片寄存器总览。
表1:MAX31856寄存器地址
地址 |
读写权限 |
名称 |
默认 |
功能 |
00h/80h |
读/写 |
CR0 |
00h |
设置寄存器0 |
01h/81h |
读/写 | CR1 |
03h |
设置寄存器1 |
02h/82h |
读/写 | MASK |
FFh |
故障掩码寄存器 |
03h/83h |
读/写 | CJHF |
7Fh |
冷结温度高温阈值寄存器 |
04h/84h |
读/写 | CJLF |
C0h |
冷结温度低温阈值寄存器 |
05h/85h |
读/写 | LTHFTH |
7Fh |
热电偶测温高温阈值高8位寄存器 |
06h/86h |
读/写 | LTHFTL |
FFh |
热电偶测温高温阈值低8位寄存器 |
07h/87h |
读/写 | LTLFTH |
80h |
热电偶测温低温阈值高8位寄存器 |
08h/88h |
读/写 | LTLFTL |
00h |
热电偶测温低温阈值低8位寄存器 |
09h/89h |
读/写 | CJTO |
00h |
冷结温度偏移寄存器 |
0Ah/8Ah |
读/写 | CJTH |
00h |
冷结温度高8位寄存器 |
0Bh/8Bh |
读/写 | CJTL |
00h |
冷结温度低8位寄存器 |
0Ch |
只读 |
LTCBH |
00h |
热电偶温度高八位寄存器 |
0Dh |
只读 | LTCBM |
00h |
热电偶温度中八位寄存器 |
0Eh |
只读 | LTCBL |
00h |
热电偶温度低八位寄存器 |
0Fh |
只读 | SR |
00h |
故障状态记录寄存器 |
接下去详细介绍每个寄存器的功能。
寄存器 00h/80h: 设置寄存器0 (CR0)
默认值: 00h |
||||||||
寄存器地址 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
00h/80h |
CMODE |
1SHOT |
OCFAULT1 |
OCFAULT0 |
CJ |
FAULT |
FAULTCLR |
50/60Hz |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
位 |
名称 |
描述 |
7 |
CMODE |
转换模式 0 = 关闭模式 (默认) 1 = 自动转换模式。每100ms(标称)连续发生一次转换。 |
6 |
1SHOT |
一次性模式 0 = 未请求任何转换(默认) 1 = 当转换模式位=0(正常关闭模式)时,这会导致单冷端和热电偶转换。将1写入该位后,当CS变高时,将触发转换。请注意,如果执行多字节写入,则在事务结束时CS变高时会触发转换。在60Hz滤波模式下,单次转换需要约143ms或在50Hz滤波模式下需要169ms才能完成。该位自清除为0。 |
5:4 |
OCFAULT[1:0] |
这两位用于启用/禁用热电偶开路故障检测并选择故障检测定时。 |
3 |
CJ |
冷端传感器禁用 0 = 冷端温度传感器启用(默认) 1 = 冷端温度传感器已禁用。来自外部温度传感器的数据可写入冷端温度寄存器。当该位从0变为1时,最新的冷端温度值将保留在冷端温度寄存器中,直到内部传感器启用或新值写入寄存器。当该位设置为1时,总温度转换时间减少25ms(典型值)。 |
2 |
FAULT |
故障模式 0 = 比较器模式。故障输出和相应的故障位通过在故障条件为真时断言和在故障条件不再为真时解除断言来反映任何未掩盖故障的状态。在阈值故障条件下处于比较器模式时,存在2°C滞后。(默认) 1 = 中断模式。当非屏蔽故障条件为真时,故障输出和相应的故障位断言,并保持断言状态,直到将1写入故障状态清除位。此操作将取消对故障和相应故障位的评估,直到检测到新故障为止(请注意,如果故障条件仍然存在,则可能会立即发生)。 |
1 |
FAULTCLR |
故障状态清除 0 = 默认值 1 = 处于中断模式时,将故障状态寄存器(0Fh)中的所有故障状态位[7:0]返回到0,并取消对故障输出的评估。此位在比较器模式下无效。请注意,如果故障依然存在,故障输出和故障位可能会立即重新插入。为防止故障输出重新出现,首先设置故障掩码位。故障状态清除位自清除为0。 |
0 |
50/60Hz |
寄存器 01h/81h: 设置寄存器1 (CR1)
默认值: 03h |
||||||||
寄存器地址 | N/A |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
01h/81h |
Reserved |
AVGSEL2 |
AVGSEL1 |
AVGSEL0 |
TC TYPE3 |
TC TYPE2 |
TC TYPE1 |
TC TYPE0 |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
位 |
名称 |
描述 |
7 |
保留 |
保留 |
6:4 |
AVGSEL[2:0] |
热电偶电压转换平均模式 000=1个样本(默认) 1xx=16个平均样本 |
3:0 |
TC TYPE[3:0] |
热电偶类型: 0000=B类型 0001=E类型 0110=S型 |
寄存器 02h/82h: 故障掩码寄存器 (MASK)
默认值: FFh |
||||||||
寄存器地址 | N/A |
N/A |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
02h/82h |
Reserved |
Reserved | CJ High FAULT Mask |
CJ Low FAULT Mask |
TC High FAULT Mask |
TC Low FAULT Mask |
OV/UV FAULT Mask |
Open FAULT Mask |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
位 |
名称 |
描述 |
7:6 |
保留 |
保留 |
5 |
CJ High FAULT Mask |
冷结高故障阈值屏蔽 0=冷端温度高于冷端温度高阈值限值时断言的故障输出 1=故障输出屏蔽(默认) |
4 |
CJ Low FAULT Mask |
冷结低故障阈值屏蔽 0=冷端温度低于冷端温度低阈值时断言的故障输出 1=故障输出屏蔽(默认) |
3 |
TC High FAULT Mask |
热电偶温度高故障阈值屏蔽 0=热电偶温度高于热电偶温度高阈值限值时断言的故障输出 1=故障输出屏蔽(默认) |
2 |
TC Low FAULT Mask |
热电偶温度低故障阈值屏蔽 0=热电偶温度低于热电偶温度低阈值时断言的故障输出 1=故障输出屏蔽(默认) |
1 |
OV/UV FAULT Mask |
1=故障输出屏蔽(默认) |
0 |
Open FAULT Mask |
热电偶开路故障屏蔽 0=检测到热电偶开路情况时断言的故障输出 1=故障输出屏蔽(默认) |
寄存器 03h/83h: 冷结温度高温阈值寄存器 (CJHF)
默认值: 7Fh |
||||||||
寄存器地址 | R/W | R/W | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
03h/83h |
CJHF7 |
CJHF6 |
CJHF5 |
CJHF4 |
CJHF3 |
CJHF2 |
CJHF1 |
CJHF0 |
Sign | ||||||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 04h/84h: 冷结温度低温阈值寄存器 (CJLF)
默认值: C0h |
||||||||
寄存器地址 | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
04h/84h |
CJLF7 |
CJLF6 |
CJLF5 |
CJLF4 |
CJLF3 |
CJLF2 |
CJLF1 |
CJLF0 |
Sign | ||||||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 05h/85h: 热电偶测温高温阈值高八位寄存器 (LTHFTH)
目录
默认值: 7Fh |
||||||||
寄存器地址 | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
05h/85h |
LTHFTH7 |
LTHFTH6 |
LTHFTH5 |
LTHFTH4 |
LTHFTH3 |
LTHFTH2 |
LTHFTH1 |
LTHFTH0 |
Sign |
||||||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 06h/86h: 热电偶测温高温阈值低八位寄存器 (LTHFTL)
默认值: FFh |
||||||||
寄存器地址 | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
06h/86h |
LTHFTL7 |
LTHFTL6 |
LTHFTL5 |
LTHFTL4 |
LTHFTL3 |
LTHFTL2 |
LTHFTL1 |
LTHFTL0 |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 07h/87h: 热电偶测温低温阈值高八位寄存器 (LTLFTH)
默认值: 80h |
||||||||
寄存器地址 | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
07h/87h |
LTLFTH7 |
LTLFTH6 |
LTLFTH5 |
LTLFTH4 |
LTLFTH3 |
LTLFTH2 |
LTLFTH1 |
LTLFTH0 |
Sign |
||||||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 08h/88h: 热电偶测温低温阈值低八位寄存器 (LTLFTL)
默认值: 00h |
||||||||
寄存器地址 | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
08h/88h |
LTLFTL7 |
LTLFTL6 |
LTLFTL5 |
LTLFTL4 |
LTLFTL3 |
LTLFTL2 |
LTLFTL1 |
LTLFTL0 |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 09h/89h: 冷结温度偏移寄存器 (CJTO)
默认值: 00h |
||||||||
寄存器地址 | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
09h/89h |
CJTO7 |
CJTO6 |
CJTO5 |
CJTO4 |
CJTO3 |
CJTO2 |
CJTO1 |
CJTO0 |
Sign | ||||||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 0Ah/8Ah: 冷结温度高八位寄存器 (CJTH)
默认值: 00h |
||||||||
寄存器地址 | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
0Ah/8Ah |
CJTH7 |
CJTH6 |
CJTH5 |
CJTH4 |
CJTH3 |
CJTH2 |
CJTH1 |
CJTH0 |
Sign | ||||||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 0Bh/8Bh: 冷结温度低八位寄存器 (CJTL)
默认值: 00h |
||||||||
寄存器地址 | R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
0Bh/8Bh |
CJTL7 |
CJTL6 |
CJTL5 |
CJTL4 |
CJTL3 |
CJTL2 |
CJTL1 |
CJTL0 |
0 | 0 | |||||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 0Ch/8Ch: 热电偶温度高八位寄存器 (LTCBH)
默认值: 00h |
||||||||
寄存器地址 | R |
R |
R |
R |
R |
R |
R |
R |
0Ch/8Ch |
LTCBH7 |
LTCBH6 |
LTCBH5 |
LTCBH4 |
LTCBH3 |
LTCBH2 |
LTCBH1 |
LTCBH0 |
Sign |
||||||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 0Dh/8Dh: 热电偶温度中八位寄存器 (LTCBM)
默认值: 00h |
||||||||
寄存器地址 | R |
R |
R |
R |
R |
R |
R |
R |
0Dh/8Dh |
LTCBM7 |
LTCBM6 |
LTCBM5 |
LTCBM4 |
LTCBM3 |
LTCBM2 |
LTCBM1 |
LTCBM0 |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 0Eh/8Eh: 热电偶温度低八位寄存器 (LTCBL)
默认值: 00h |
||||||||
寄存器地址 | R |
R |
R |
R |
R |
R |
R |
R |
0Eh/8Eh |
LTCBL7 |
LTCBL6 |
LTCBL5 |
LTCBL4 |
LTCBL3 |
LTCBL2 |
LTCBL1 |
LTCBL0 |
X | X | X | X | X | ||||
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
寄存器 0Fh/8Fh: 故障状态记录寄存器 (SR)
默认值: 00h |
||||||||
寄存器地址 | R |
R |
R |
R |
R |
R |
R |
R |
0Fh/8Fh |
CJ Range |
TC Range |
CJHIGH |
CJLOW |
TCHIGH |
TCLOW |
OVUV |
OPEN |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
如果需要让STM32与MAX31856通讯的话,必须先将上面的寄存器好好阅读。
然后根据寄存器各个位的含意来进行SPI通信,让MAX31856进行温度转换。
STM32与MAX31856之间的硬件连接
MAX31856使用的是SPI通信输出数据,因此本文使用STM32的SPI1的接口与MAX31856进行通讯。使用PB3作为SCK、PB4作为MISO、PB5作为MOSI,另外需要使用一个CS片选信号,本文使用的是38译码器的结构,因此在这里不多进行赘述。如果对SPI通讯不是很理解的读者可以百度一下看一下相关资料。此外MAX31856还有温度转换完成信号输出引脚以及检测到错误的信号输出引脚,本文并没用使用他们,在电路设计中将这两个端口外接了LED进行显示。具体连接示意图请看下方的图片。
STM32主控程序的设计思路
第一步:咱们要准备好SPI通讯的基本功能函数,以及MAX31856的片选信号端口的设置。
第二步:通过SPI通讯来设置MAX31856的寄存器。
首先需要设置的是MAX31856的配置寄存器CR0和CR1。
其中在CR0需要设置的数据位是第七位保持默认。第六位1SHOT,将其设置为1时随着CS片选信号的拉高来启动转换,转换完成后自动清0。然后第四和第五位是用于设置热电偶开路检测模式的,具体内容可以看上方说明书的表四,此处将其设置为不检测开路也就是00。第三位保持默认。第二位的故障模式设置为比较模式也就是0。第一位保持默认。第零位保持默认。
CR1需要设置的数据位是第6~4位保持默认。第3~0位设置对应热电偶的类型,此处手动选用K型热电偶,保持默认即可。
故障掩码寄存器MASK不进行设置,保持默认即可。
因为MASK寄存器不进行设置,因此CJHF、CJLF、LTHFTH、LTHFTL、LTLFTH、LTLFTL都不用进行设置。
如果测温结果与实际有误差出现,则需要调整CJTO中的冷结温度偏移数据来校准实际的温度转换。
上述是MAX31856的工作配置,如果要STM32读取MAX31856的测温数据,则应该读取冷结温度的寄存器CJTH、CJTL。以及热电偶温度寄存器LTCBH、LTCBM、LTCBL。在不屏蔽故障的情况下,则应该继续读取故障记录寄存器SR。
至此,STM32程序的设计思路已经讲述完毕。
实际验证
按照上述的硬件连接以及程序设计思路设计程序,并且编译下载到STM32中后,实际的体现效果如下。另外本程序使用的是STM32F407IGT6平台写的程序,有寄存器和库函数两种代码。但是想到很多小白会下载使用,我还是决定将代码转换一下,换到STM32F103ZET6平台。但是具体的接线还是需要根据读者自身的平台调整,然后SPI通讯的CS片选信号也需要调整,我使用的是38译码器进行片选的。因此提供四种的工程下载,下载链接如下:
STM32F407IGT6平台MAX31856测温库函数工程:https://download.csdn.net/download/m0_/
STM32F407IGT6平台MAX31856测温寄存器工程:STM32F407IGT6平台MAX31856测温寄存器写法注释清晰接线说明留有作者联系邮箱-硬件开发文档类资源-CSDN下载
STM32F103ZET6平台MAX31856测温库函数工程:STM32F103ZET6平台MAX31856测温库函数写法注释清晰接线说明留有作者联系邮箱-硬件开发文档类资源-CSDN下载
STM32F103ZET6平台MAX31856测温寄存器工程:STM32F103ZET6平台MAX31856测温寄存器写法注释清晰接线说明留有作者联系邮箱-硬件开发文档类资源-CSDN下载
其中程序中可以使用单个手动触发来验证读者自己的MAX31856是否存在问题,还可以使用自动测温来循环遍历读者开发板上所有的MAX31856。并且MAX31856的每个寄存器的读取都可以在单个手动触发测量的部分看到数据的变化方便查错,但是需要读者自己有仿真器才可以(需要添加变量监控)。在下边的右图中可以看到测得冷节温度19℃和热电偶温度22.℃。