基于arm的远程温度监测系统的设计(编辑修改稿)内容摘要:

而不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图3所示。 图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。 高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。 计数器1和温度寄存器被预置在-55℃所对应的一个基数值。 计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。 图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。 斜率累加器比较预置预置计数器1低温度系数晶振 LSB 置位/清除—0温度寄存器 加1=0高温度系数晶振计数器2图25:DS18B20测温原理框图DS18B20有4个主要的数据部件:(1)光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。 64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。 光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 (2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,℃/LSB形式表达,其中S为符号位。 图26:DS18B20温度值格式表这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,;如果温度小于0,这5位为1。 例如+125℃的数字输出为07D0H,+℃的数字输出为0191H,℃的数字输出为FF6FH,55℃的数字输出为FC90H。 图27:DS18B20温度数据表(3)DS18B20温度传感器的存储器 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 图28:配置寄存器结构:低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。 在DS18B20出厂时该位被设置为0,用户不要去改动。 R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位)图29:温度分辨率设置表您可以在web网页上设置温度的上下限的阈值,当温度不在这一范围内时,就会使蜂鸣器报警响铃,如果高于上限报警器每隔1秒响一次,低于下限则报警器响5秒钟,在区间内不响。 传感器如果测量的值恢复正常的话,就会关闭蜂鸣器,不然会一直响铃报警。 程序运行后,温度测量程序每隔十秒钟测一次,每次测量都会把时间,温度值存入数据库中,远程控制监测cgi页面,每次刷新,都会把入库的所有数据显示在页面上,你通过它可以清楚的看到每次的温度记录。 3开发流程:(1)本次开发环境为fedora9(2)编译器为armlinuxgcc (3)开发板为arm116410开发板(4)温度传感器为DS18B20:一、使用tar –zxvf 命令解压,这时会生成opt文件夹。 进入文件夹opt/FriendlyARM/toolschain/。 使用su 命令进入root用户,使用命令mkdir在/usr/local/目录下创建arm目录。 并使用cp –。 打开/etc/下的bashrc文件,在最后加上以下内容:export PATH=$PATH:/usr/local/arm/。 重启linux系统,此时交叉编译器安装完毕。 二、安装sqlite3数据库使用tar –zxvf 命令解压,进入root用户并进入解压出来的文件夹执行命令./configure host=armlinux perfix=/usr/local/sqlite3 makemake install此时嵌入式版本的sqllite3数据库安装完毕了。 三、数据库移植我们用的是ftp下载,也可以使用其他的方式下载到板子上:把刚安装好的数据库移植到开发板上,首先把串口线,网线等与开发板连接好,打开SecureCRT这个工具,打开串口,启动开发板。 在linux系统中进入root用户使用命令。 (1)service vsftpd restart启动ftp。 (2)service iptables stop关闭防火墙。 (3)ifconfig 查看PC 机linux系统的ip。 (4)cp /usr/local/sqlite3/bin/sqlite3 /var/ftp/这样把sqlite3复制到/var/ftp/目录下去,等待向板子上下载。 (5)cp /usr/local/sqlite3/lib/ /var/ftp/目录下。 在开发板上的终端创建目录/project/进入并执行:ftp +PC机的linux的ip地址,输入anonymous(表示匿名登录)回车,再输入回车(不需要密码)。 4,使用命令get sqlite3下载sqlite3,在使用命令get。 把sqlite3放在/usr/bin/目录下,,并在该目录下执行:ln –s ln –s 到现在板子上已经有了sqlite3数据库了,即移植数据库完成了。 四、驱动的编译及下载新建一个Makefile文件,用vi打开,在里面写上obj:=。 解压缩,使用命令:cp config_mini6410_h43 .config因为板子的液晶屏是h43的,所以必须使用这一个文件。 执行make zImage,如果没有错误,则可以进行下一步,此镜像可以下载到开发板上运行。 然后再执行命令:make –C /home/dell/C后边的是内核的路径,M后边是驱动程序的路径,modules表示编译成模块(此编译方法为内核外编译)。 并将其复制到/var/ftp/目录下,等待下载到板子上,用下载数据库的办法。 五、 驱动程序的加载及创建设备节点:(推荐)。 都放到一个目录下,易于操作管理。 使用命令insmod ,此时会出现一个主设备号251或者其他数字,在使用mknod /dev/DS18B20 c 251(主设备号) 0 回车创建设备节点,以后提供给用户的就是这个节点文件,他可以open,read,close,write等操作。 使用同样的办法,创建蜂鸣器的设备文件节点。 此时,你可以执行测试程序,查看一下效果。 六、应用程序及web页面程序的运行以及pthread程序下载到板子上。 在目录/lin/project/work/目录下创建date数据库sqlite3 date便可创建。 再执行pthread这个程序,这时,后台程序就已经开始运行了。 打开浏览器。 4软件设计 DS18B20驱动程序一 18b20驱动程序分为几个模块函数,l 寄存器的设置(输入) void tmp_input(void )l 寄存器的设置(输出) void tmp_output(void)l IO口的设置(高电平) void tmph(void)l IO口的设置(低电平) void tmpl(void)l 向18b20写一个位 void wrbt(uchar bite)l 从18b20读一个位 uchar rdbt(void)l 向18b20写一个字节 void wrbyte(uchar k)l 从18b20读一个字节 uchar rdbyte(void)l 复位初始化18b20 uchar reset(void)l 打开设备节点(向用户提供的)int DS18B20_open(struct inode *inode,struct file *file)l 关闭设备节点(向用户提供的)int DS18B20_release(struct inode *inode,struct file *file)l 对18b20进行ROM操作命令static ssize_t DS18B20_read(struct file *filp,unsigned char __user *buf,size_t count,loff_t *ppos)。 二 驱动的框架(1)驱动框架包括向内核注册驱动信息,从内核删除驱动信息(防止内核污染),设备的主次设备号的获取,static struct file_operations DS18B20_fops={.owner = THIS_MODULE, //拥有该结构模块的指针,避免在操作时被卸载,一般初始化为THIS_MODULE(2)对外操作 open = DS18B20_open, //对外提供打开操作.release = DS18B20_release,//当file结构指针释放时,调用次函数,即:当最后一个打开该设备文件的用户调用close时,将调用此函数//release 函数的主要任务是清理未结束的输入/输出操作、释放资源、用户自定义排他标志的复位等 .read = DS18B20_read, //对外提供读操作 .write = DS18B20_write, //对外提供写操作.unlocked_ioctl = DS18B20_ioctl,//该函数是特殊的控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,即为io控制函数}。 (3)设备号生成static struct cdev DS18B20_devs。 int major=0。 static void DS18B20_setup_cdev(struct cdev *dev,int minor,struct file_operations *fops){int err,devno=MKDEV(major,minor)。 //把0和原来生成的设备号再合并到一块去 ,再生成一个设备号,表示有一个设备 cdev_init(dev,fops)。 devowner=THIS_MODULE。 devops=fops。 //把dev的ops设置成为fopserr=cdev_add(dev,devno,1)。 //向内核注册新生成的devno信息,1表示和设备关联的的设备书目if(err) //判断设备是否存活,如果cdev_add()调用成功的话,设备就可以使用了,外部的应用程序对它的操作,内核就会允许了 { printk(Error %s adding DS18B20 %d\n,KERN_ALERT,minor)。 printk(Error %d adding DS18B20 %d\n,err,minor)。 }}(4)申请设备号static int DS18B20_init(void){ int result。 dev_t dev=MKDEV(major,0)。 //申请设备,major为主设备号,0为次设备号,表示自动分配设备号if(major) //表示如果已经有了主设备号,就直接注册设备号 { result=register_chrdev_region(dev,1,DS18B20_DEVICE_NAME)。 } else //如果没有主设备号, { result=。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。