原创 FPGA 温度计 (DS18B20方案)

2010-10-5 22:52 4044 2 3 分类: FPGA/CPLD

? ? ?考研复习模电,看二极管的温度特性,每升高一度压降减小2.1mv左右,于是产生了做电子温度计的想法。找了一堆1n4148串联起来,用万用表测了一下很灵敏。“传感器” 和AD芯片是有了,但考虑到电路复杂,温度不容易校准等问题,还是决定放弃此方案。

? ? 数字温度传感器最常见的就是DS18B20了,但看了一下PDF发现“1-wire”通信协议相当复杂。又到几家公司的网站上搜了一下,发现Ti的TMP121是SPI的只读型的,控制起来相当简单。于是就按TMP121开始写Verilog。由于通信协议很简单,最麻烦的就是二进制转BCD的问题了,下面引用一种常见的方法:

=======================================================================

用两个寄存器,一个10bit,一个16bit,分别存bin码和有待实现的bcd码。接下来,逐位将BIN的最高位移入BCD的最低位。
同时,将BCD的16位寄存器按每四位划成一块,我们称之为个十百千好了。但记住,个,十,百,千都有4个bit位。
1.将bin[9](bin是bin[9:0])移入bcd[0]。这样,bin[9]就变成了原来的bin[8],bin[0]=0。
2.分别检查个十百千里存的数是不是大于等于5(按二进制换十进制那样换算),如果是,加3。
3.重做1,2。直到全部移进去“

======================================================================

? ? ? 因为左移一位相当于×2所以要检查是否大于4,如果大于4的话再乘以2会超过9,所以要加3进行修正。

? ? ?但遗憾的是去电子城买芯片的时候没有买到TMP121,只好买了一片DS18B20回来。然后认真研究了一下数据手册。花了一下午时间写出了雏形,发现其实并没有想象的那么难。也许这就是所谓的世上无难事,只怕有心人吧。

? ? 主要部分就是:初始化、写数据、读数据三部分。然后通过状态机调度各部分的工作。

可怜的液晶屏被压坏了一半,只有一半亮了。室温27度,传感器的线留了很长,可以用来测体温。

1-wire总线上的5K上拉电阻。


体温36.75度。显示的温度根据体温表测的数据进行了加0.125度的修正。分辨率为0.0625度。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-6-28 17:19

求解答,您这个体温很精确,但不知是测的身体哪个部位的体温?还有,是接触测量还是非接触?非接触的话距离是多少?谢谢!
相关推荐阅读
用户1519616 2011-12-08 18:50
使用AVR内部ADC做的Touch Panel
好长时间没在EDN写博客了,上一次还是准备毕业找工作的时候,现在已经工作5个月了, 转眼就快一年了。中间好多东西都没有整理,留着慢慢整理吧,先来个最近的。   言归正传,这个是用AT...
用户1519616 2010-12-06 17:53
很简陋的“示波器”
? ? ? ? 最近学了几天单片机,开始时感觉这东西比FPGA笨多了,不灵活,驱动能力也弱,速度慢,最重要的是不能并行处理!后来慢慢熟悉了一点感觉也就好点了,发现在某些方面还是很方便的。最大的优点还是...
用户1519616 2010-07-16 16:34
十块钱买的OLED屏,暂且伪装成数码相框吧。。。。
昨天花十块钱买了块OLED屏,1.04寸,SSD1332控制器,下午焊在转接板上。边翻数据手册,边用Verilog写了个状态机,成功初始化,但显示图像有问题,是隔行扫描的,图片被拉长,本来显示一屏的,...
用户1519616 2010-06-29 16:26
quartus + modelsim 后仿傻瓜教程
用 quartus + modelsim 做后仿录像压缩包...
用户1519616 2010-05-31 21:09
如何指定管脚为INBUF而不是自动生成的CLKBUF
? ?用Verilog写了一个小东西:按一个键加一,按另一个键减一。用Synplify综合后,两个按键的属性都成了CLKBUF,分配管脚的时候就没法分了。? ?其实只要给综合器加上约束条件就行了,例如...
EE直播间
更多
我要评论
1
2
关闭 站长推荐上一条 /3 下一条