xzmabin 发表于 2008-7-1 13:24:20

转帖一个最低成本的测温电路,用普通IO口的

前阵子在论坛里看到过这个方法,今天找到了比较详细的说明。分享下。。

原文出自:http://www.eccn.com/xsj07/xsj082341w.asp

基于AVR单片机捕获中断和热敏电阻的温度测量
田开坤,徐海霞
(湖北师范学院 电工电子实验教学中心 湖北 黄石 435002)


温度测量常采用热敏电阻做传感器,测量的方法有R-V转换电压测量法和R-F转换频率测量法。这两种方法的电路复杂成本高,并且电路中很多元器件直接影响测量精度。本文介绍一种类R-F转换频率测量温度的方法。

1 负温热敏电阻

PSB型负温热敏电阻由Co,Mn,Ni等过渡金属元素的氧化物组成,经高温烧成半陶瓷,利用半导体毫微米的精密加工工艺,采用玻璃管封装,耐温性好,可靠性高,反应速度快、灵敏度高。他采用轴向型结构,便于安装,能承受更高温度,且玻璃封装耐高低温(-50~350℃)。PT-25E2热敏电阻温度阻值变化曲线图如图1所示。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332983.jpg
(原文件名:1.jpg)


2 AVR单片机测温原理

温度测量电路如图2所示,标准电阻Rp,热敏电阻Rt,电容C1与AVR单片机三个引脚相连。其中PC0,PC1为一般普通IO引脚,CP1为捕获触发输入引脚,可以设定上升沿触发捕获中断。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332984.jpg
(原文件名:2.jpg)

Rp为100 kΩ的精密电阻;Rt为100 kΩ精度为1%的热敏电阻;C1为0.1μF的瓷片电容。



其工作原理为:

先将PC0,PC1,CP1都设为低电平输出,使C1完全放电。

接着将PC1,CP1设置为输入状态,PC0设为高电平输出,通过Rp电阻对C1充电,同时启动内部定时器从零开始计时。电容实际充电曲线如图3所示,当C1上的电压逐步升高到Vh,CP1检测出电压达到单片机高电平输入门槛电压时,将定时器计数值捕获,从而测出从开始充电到CP1转变为高电平的时间Tp。

再次将PC0,PC1,CP1都设为低电平输出,使C1完全放电。

随后将PC0,CP1设置为输人状态,PC1设为高电平输出,通过Rt电阻对C1充电,过程同上,得到时间Tt。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332985.jpg
(原文件名:3.jpg)


通过单片机计算得到热敏电阻Rt的阻值,并通过查表法可以得到温度值。

从上述可以看出,该测温电路的误差来源于这几个方面:单片机的定时器精度,精密电阻Rp的精度,热敏电阻Rt的精度,而与单片机的输出电压值、门槛电压值、电容精度无关。因此,适当选取热敏电阻Rt和精密电阻Rp的精度,单片机的工作频率够高,就可以得到较好的测温精度。

3 AVR捕获

本文以AVR系列中高性价比的ATmage88为例,利用16位时钟单元T/C1的捕获中断来实现电容充电时间的测量,单片机时钟选择8 MHz。输入捕获单元方框图如图4所示。当引脚ICP1上的逻辑电平(事件)发生了变化,并且这个电平变化为边沿检测器所证实,输入捕捉被激发:16位的TCNT1数据被复制到输入捕捉寄存器ICR1,同时输入捕捉标志位ICF1置位。如果此时ICIE1为1,输入捕捉标志将产生输入捕获中断。

ATmega88在3.3 V供电时,当电容电压上升到1.84 V时,如图3所示,发生捕获中断。

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332986.jpg
(原文件名:4.jpg)


4 软件设计

基于ATmage88捕获中断测温程序流程图如图5所示,包括主程序流程图,捕获中断流程图和定时溢出中断流程图。

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332987.jpg
(原文件名:5.jpg)

ATmage88定时器初始化涉及TCCR1B,TIMSK1控制寄存器的配置,介绍如下:

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332988.jpg
(原文件名:6.jpg)

ICNC1:输入捕捉噪声抑制器,“1”启用;

ICES1:捕捉触发沿选择,“1”上升沿,“0”下降沿;

CS1:时钟选择,有多种预分频时钟可供选择;

ICIE1:T/C1输入捕捉中断使能;

TOIE1:T/C1溢出中断使能。

定时器T1初始化代码如下(AVR-GCC):

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332989.jpg
(原文件名:7.jpg)

其中宏定义Tp=0;Tt=1;需要定义数组:

uint16_t timeL,timeH,counter

当测量时间超过定时器最长计时时,定时器会溢出,定时器T1溢出中断函数代码如下:


http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332990.jpg
(原文件名:8.jpg)


最后通过查表法就可以得到测量的温度。查表温度间隔一般为1℃,如果忽略热敏电阻1℃以内的非线性误差,可以将两摄氏度之间取线性计算,这样可以得到0.1℃的分辨率。

5 结 语

笔者应用该方法已设计出一款温度计,在范围-10~80℃时,分辨率达到0.1℃,误差在0.5℃以内。本文充分利用了AVR的捕获功能,使得电路简洁,成本低廉。

thomasdu 发表于 2008-7-1 14:10:07

好详细,很多人要高兴了

baogmwiqpl 发表于 2008-7-1 15:15:12

记号

knight_avr 发表于 2008-7-1 15:30:47

收藏

ywl0409 发表于 2008-7-1 18:26:26

AVR已经有AD了,没有必要再用外部电路来模拟一个AD.

yjtks 发表于 2008-7-1 18:39:06

都21世纪了还用这种老掉牙的方法

TYMCU 发表于 2008-7-1 18:42:06

知道就行了,的确是老掉牙的方法

hml890919 发表于 2008-7-1 19:20:40

的确很古老……

our_avr 发表于 2008-7-1 19:23:52

不错,资料你整理的很详细.

guantingwei 发表于 2008-7-1 20:13:17

直接看microchip的应用笔记,讲得很详细

xzmabin 发表于 2008-7-2 09:53:47

AVR是有AD了,只是最近遇到一个应用,要求6路测温,有这么多AD口的单片机不?

gxlujd 发表于 2008-7-2 10:19:54

MEGA16有8个,够不?哈哈哈哈哈……

ywl0409 发表于 2008-7-2 11:02:16

还好LZ没有说要100个测温点,否则就需要100多个IO的单片机了.

xzmabin 发表于 2008-7-2 12:24:56

可能怪我说的不清楚,更正几点,希望不要再叫真

在1楼我就说了用普通IO口的,有需要的就拿去,没需要的看看就罢了。

我知道AVR是有AD的,不过我一直用PDIP封装的MEGA8,就只有6路AD的,一下用满了,当然你可以用别的封装或者换个更多AD口的MCU,只是我想再怎么AD口也是应该<=IO口吧。

这只是另一种方法而已

favr 发表于 2008-7-2 12:44:18

不怕你多路,要觉得AD口不够,可以用n多片Tiny26来做AD,每片11个通道,110路也就10片,然后多机通讯,还可以做成分布式的,比用模拟开关切换贵不了多少。

shaoshunda 发表于 2008-7-2 13:13:52

记号

xyqdoudou 发表于 2009-12-16 15:09:46

用AD是要基准的。。。。。

zhifeng 发表于 2009-12-16 15:19:15

有时使用ad会有很棘手的问题,做一些项目时宁愿转为频率再测,也不愿使用ad

luojiyin 发表于 2010-7-27 21:28:12

学习了

D.lovers 发表于 2010-7-27 21:40:19

学习

dulang99 发表于 2010-7-28 16:12:39

方法虽然古老,但电路简单。
如果用AD 是否需要放大电路呢?这个古老的方法好像不需要

master5888 发表于 2010-7-28 16:32:39

mark

lv998127 发表于 2010-7-28 16:37:19

mark

qinhya 发表于 2010-7-28 19:31:16

学习!!

jtj203 发表于 2010-12-23 08:11:27

mark

zoto 发表于 2010-12-23 08:13:05

定一个!

hero245 发表于 2010-12-23 08:15:28

mark.这个有用。

kazenoai 发表于 2010-12-23 08:35:24

有些产品的成本要求很高,只能选择没有AD功能的单片机,这个时候就有用了。

fsclub 发表于 2010-12-23 08:42:20

充电测时间嘛。

zengyi703 发表于 2010-12-23 08:42:35

mark

lixupeng 发表于 2010-12-25 20:38:22

支持!!!!

ljt8015 发表于 2010-12-25 21:40:42

mark!~

spence 发表于 2011-6-26 00:30:35

这种方法其实比AD好,不用基准源,甚至连单片机的电压变化都无影响

yzmkf 发表于 2011-6-26 08:01:10

学习~~~~~

jianjun42 发表于 2011-6-26 08:22:01

思路可以借鉴,但处理方式太麻烦了,有舍本逐末之嫌

szxszx 发表于 2011-6-26 09:33:08

低成本的方法

wangyj173 发表于 2011-6-26 10:47:38

消费电子至今还是用得很多啊

yanrz 发表于 2011-6-27 13:41:09

今天才发现这个东西,一直都用18B20做

ma_gaap_7 发表于 2011-9-20 16:23:41

mark 温度测量

lishan2000 发表于 2011-9-21 09:15:14

回复【楼主位】xzmabin
-----------------------------------------------------------------------

有没有红外测温的东西

lzkaka 发表于 2011-9-24 11:44:34

很好的学习材料谢谢分享

aleyn 发表于 2011-11-24 09:07:48

mark

atommann 发表于 2011-11-24 09:09:56

atmel 有个 appnote 专门讲这个。

hecm1225 发表于 2011-11-24 09:53:57

学习

huaxiling 发表于 2011-11-24 14:16:02

挺好用的东西,好多太阳能热水器都是这么干的,包括测温度和水位.

our2008 发表于 2011-11-24 16:02:55

MARK

sandao 发表于 2011-11-25 13:29:42

怎么确保电容已经放完呢,如果用门槛电压来判断,有可能电容还会有余点,会带来误差。

另外单片机电压发生变化时,是否影响充放电时间。

gmyu 发表于 2011-12-20 09:47:33

测温mark

烂泥桑 发表于 2012-12-8 13:55:03

记下再看{:shy:}

bxzyf 发表于 2012-12-9 19:25:24

不错,提供了一个思路。

ming1172848 发表于 2012-12-9 22:11:57

精髓在于低成本

AllEle 发表于 2012-12-9 22:20:40

这劲费的,直接用一个ADC不就解决了吗

jz701209李 发表于 2012-12-14 21:19:00

学习一下.......

xiaojun2019 发表于 2012-12-18 10:24:42

mark 普通IO测温

xiaoluo2009 发表于 2015-1-27 11:03:51

好的,每天学习一点点

desertsailor 发表于 2015-3-4 12:14:48

精度有限

whuer 发表于 2015-3-4 12:56:36

优势在于低成本,太阳能热水器测温一水的这个方案,单片机1毛多一个,装整个控制板做下来包括外壳不超过12元,狂拽酷炫掉渣天

upli 发表于 2015-3-5 21:03:13

zhifeng 发表于 2009-12-16 15:19
有时使用ad会有很棘手的问题,做一些项目时宁愿转为频率再测,也不愿使用ad ...

比如在什么场合需要转换为频率,怎样转换?
页: [1]
查看完整版本: 转帖一个最低成本的测温电路,用普通IO口的