Ardunio MEGA+MAX6675热电偶测温
本帖最后由 nust_奔跑 于 2013-5-13 13:59 编辑1、热电偶工作原理
两种不同成份的导体两端接合成回路,当两个接合点的温度不同时,在回路中就会产生电动势,这种现象称为热电效应,而这种电动势称为热电势。
热电偶就是利用热点效应原理进行温度测量的,其中,直接用作测量介质温度的一端叫做工作端(也称为测量端),另一端叫做冷端(也称为补偿端);冷端与显示仪表或配套仪表连接,显示仪表会指出热电偶所产生的热电势。
热电偶实际上是一种能量转换器,它将热能转换为电能,用所产生的热电势测量温度,对于热电偶的热电势,应注意如下几个问题:
1、热电偶的热电势是热电偶工作端的两端温度函数的差,而不是热电偶冷端与工作端,两端温度差的函数;
2、热电偶所产生的热电势的大小,当热电偶的材料是均匀时,与热电偶的长度和直径无关,只与热电偶材料的成份和两端的温差有关;
3、当热电偶的两个热电偶丝材料成份确定后,热电偶热电势的大小,只与热电偶的温度差有关;若热电偶冷端的温度保持一定,这时候的热电偶热电势仅是工作端温度的单值函数。
将两种不同材料的导体或半导体A和B焊接起来,构成一个闭合回路。当导体A和B的两个执着点1和2之间存在温差时,两者之间便产生电动势,因而在回路中形成一个大小的电流。
根据热电偶测温原理,热电偶的输出热电势不仅与测量端的温度有关,而且与冷端的温度有关,需要测量出冷端温度,从而才能准确地测量出真实的温度。下面将介绍集成冷端补偿的芯片MAX6675。
2、MAX6675工作原理
MAX6675是MAXIM公司的K型热电偶串行模数转换器,它能独立完成信号放大、冷端补偿、线性化、A/D转换及SPI串口数字化输出功能。
MAX6675内部集成有冷端补偿电路;带有简单的3位串行SPI接口;可将温度信号转换成12位数字量,温度分辨率达0.25℃;内含热电偶断线检测电路。冷端补偿的温度范围-20℃~80℃,可以测量0℃~1023.75℃的温度。
MAX6675为SO-8脚封装,工作电压为+5V直流电压,功耗为47.1mW,电流为50mA,适用于体积不大,不利散热的装置条件下使用,其引脚图如图1所示。其中SO为SPI串行输出端口引脚; CS为片选信号;SCK为串行时钟输入;T+、T-分别接热电偶的测量端和冷端。
3、Arduino程序
MAX6675的库文件自带的串口输出示例,将采样间隔改为2S。
#include "Max6675.h"
Max6675 ts(8, 9, 10);
// Max6675 module: SO on pin #8, SS on pin #9, CSK on pin #10 of Arduino UNO
// Other pins are capable to run this library, as long as digitalRead works on SO,
// and digitalWrite works on SS and CSK
void setup()
{
ts.setOffset(0);
// set offset for temperature measurement.
// 1 stannds for 0.25 Celsius
Serial.begin(9600);
}
void loop()
{
Serial.print(ts.getCelsius(), 2);
Serial.print(" C / ");
Serial.print(ts.getFahrenheit(), 2);
Serial.print(" F / ");
Serial.print(ts.getKelvin(), 2);
Serial.print(" K\n");
delay(2000);
}
4、实物实验演示
MAX6675模块实物图
MEGA+MAX6675的实物图
采用用串口助手接收温度数据,数据如下:
1、 放置在空气中,常温环境下
可以看出,温度还是很稳定的,还说明南京很热,都30℃了。
2、放置于一杯热水中,高温环境
水温稳定在57℃左右,看起来温度不是很高,但是我端水杯还是感觉很烫的。
附上MAX6675的库文件 ;P人体感受到烫的温度为50-60度,所以还是蛮准的 教程和我之前写的差不多,支持啊! 迷你强 发表于 2013-5-13 17:08 static/image/common/back.gif
人体感受到烫的温度为50-60度,所以还是蛮准的
南京的天气太热了~~~
如果要多用的话要如何操作? 无为 发表于 2013-7-15 13:59 static/image/common/back.gif
如果要多用的话要如何操作?
多路热电偶?
增加一个片选信号即可~ nust_奔跑 发表于 2013-7-15 14:56 static/image/common/back.gif
多路热电偶?
增加一个片选信号即可~
这个知道,但不知如何操作,因为多路用的时候,SO,CS都是连在一起的,不知库是否也要多次调用?用I2C总线为每个模块的片选,需要用到数据位的D2位,检测热电偶是否断线,楼主给的库好像不能检测,断开后显示1023. 无为 发表于 2013-7-16 08:08 static/image/common/back.gif
这个知道,但不知如何操作,因为多路用的时候,SO,CS都是连在一起的,不知库是否也要多次调用?用I2C总线 ...
你还可以通过多路开关,也就是断电和上电,实现多个MAX6675的切换。 nust_奔跑 发表于 2013-7-16 11:38 static/image/common/back.gif
你还可以通过多路开关,也就是断电和上电,实现多个MAX6675的切换。
这个……。要是我将两个模块连在板上,同时上电,如:SO连在一起,接至2脚,CSK连在一起,接至3脚,CS1接在4脚,CS2接在5脚,这个程序需要调用两次库吗?如不需要,则此项:Max6675 ts(8, 9, 10);需要做何更改? 已经搞定了,多谢楼主! 无为 发表于 2013-7-17 11:02 static/image/common/back.gif
已经搞定了,多谢楼主!
怎么搞定的?
给大家分享一下,谢谢~ 采用数组定义就OK了。
int MAX_MISO = 2;
int MAX_SCK= 3;
int MAX_CS[]= {30,31,32,33,34,35,36,37}; 无为 发表于 2013-7-19 10:23 static/image/common/back.gif
采用数组定义就OK了。
int MAX_MISO = 2;
int MAX_SCK= 3;
牛叉~学习了~~ nust_奔跑 发表于 2013-7-19 12:13 static/image/common/back.gif
牛叉~学习了~~
也是别人告诉我的……。哈哈 无为 发表于 2013-7-19 12:39 static/image/common/back.gif
也是别人告诉我的……。哈哈
用数组的话,会自动切换么?