转帖一个最低成本的测温电路,用普通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的捕获功能,使得电路简洁,成本低廉。 好详细,很多人要高兴了 记号 收藏 AVR已经有AD了,没有必要再用外部电路来模拟一个AD. 都21世纪了还用这种老掉牙的方法 知道就行了,的确是老掉牙的方法 的确很古老…… 不错,资料你整理的很详细. 直接看microchip的应用笔记,讲得很详细 AVR是有AD了,只是最近遇到一个应用,要求6路测温,有这么多AD口的单片机不? MEGA16有8个,够不?哈哈哈哈哈…… 还好LZ没有说要100个测温点,否则就需要100多个IO的单片机了. 可能怪我说的不清楚,更正几点,希望不要再叫真
在1楼我就说了用普通IO口的,有需要的就拿去,没需要的看看就罢了。
我知道AVR是有AD的,不过我一直用PDIP封装的MEGA8,就只有6路AD的,一下用满了,当然你可以用别的封装或者换个更多AD口的MCU,只是我想再怎么AD口也是应该<=IO口吧。
这只是另一种方法而已 不怕你多路,要觉得AD口不够,可以用n多片Tiny26来做AD,每片11个通道,110路也就10片,然后多机通讯,还可以做成分布式的,比用模拟开关切换贵不了多少。 记号 用AD是要基准的。。。。。 有时使用ad会有很棘手的问题,做一些项目时宁愿转为频率再测,也不愿使用ad 学习了 学习 方法虽然古老,但电路简单。
如果用AD 是否需要放大电路呢?这个古老的方法好像不需要 mark mark 学习!! mark 定一个! mark.这个有用。 有些产品的成本要求很高,只能选择没有AD功能的单片机,这个时候就有用了。 充电测时间嘛。 mark 支持!!!! mark!~ 这种方法其实比AD好,不用基准源,甚至连单片机的电压变化都无影响 学习~~~~~ 思路可以借鉴,但处理方式太麻烦了,有舍本逐末之嫌 低成本的方法 消费电子至今还是用得很多啊 今天才发现这个东西,一直都用18B20做 mark 温度测量 回复【楼主位】xzmabin
-----------------------------------------------------------------------
有没有红外测温的东西 很好的学习材料谢谢分享 mark atmel 有个 appnote 专门讲这个。 学习 挺好用的东西,好多太阳能热水器都是这么干的,包括测温度和水位. MARK 怎么确保电容已经放完呢,如果用门槛电压来判断,有可能电容还会有余点,会带来误差。
另外单片机电压发生变化时,是否影响充放电时间。 测温mark 记下再看{:shy:} 不错,提供了一个思路。 精髓在于低成本 这劲费的,直接用一个ADC不就解决了吗 学习一下....... mark 普通IO测温 好的,每天学习一点点 精度有限 优势在于低成本,太阳能热水器测温一水的这个方案,单片机1毛多一个,装整个控制板做下来包括外壳不超过12元,狂拽酷炫掉渣天 zhifeng 发表于 2009-12-16 15:19
有时使用ad会有很棘手的问题,做一些项目时宁愿转为频率再测,也不愿使用ad ...
比如在什么场合需要转换为频率,怎样转换?
页:
[1]