原标题:基于Matlab小温度检测系统设计
1 前言
温度是表示环境的重要参数。在工程领域,尤其是工程热力学,温度检测非常普遍,对于实时控制温度的精确测量尤为重要。
在控制系统中,有许多方法和应用平台可以实现上下机之间的通信。目前,以VB和VC开发了更多的通信软件。然而,虽然这些软件功能完善,但在计算机后进行各种处理(如滤波器、系统识别、曲线拟合等)并不方便,编程也更加复杂。Matlab具有强大的数据处理能力及功能丰富的工具箱,被广泛的应用于信号处理、自动控制等领域[1]。它的编程语言简单易学,可以用简单的命令代替复杂的代码,大大提高了开发效率。
本实验基于Matlab小型温度检测系统设计在环境中,使用下位机AT89S并完成温度数据采集,上位机在Matlab在环境下,调用设备控制箱serial类操作RS-232串口,通过串行通信交换数据,然后借助Matlab分析和处理数据,得到温度随时间变化的函数分析,同时介绍了基础Matlab环境下PC实现机与串行通信实时数据处理的方法。
2 总体设计系统
图1 系统结构图
温度检测系统的整体结构如图1所示。PC与单片机串口USART口通过MAX连接232电平转换芯片,形成主从式通信系统。当系统工作时,单片机对串口和DS18B20初始化,在读取温度时等待中断。PC机通过调用Matlab在设备控制工具箱中serial类和相关函数创建对象,并通过读写文件实现对象PC机串行口的访问,PC机通过Matlab向串行口发送特殊指令,触发单片机。单片机调用中断服务例程,读取即使温度并通过串行口返回收集到的数据PC机。此时,Matlab单片机发送的数据通过查询实时接收,数据分析处理和图形显示完成。
3 下位机部分
下机部分由AT89S51单片机和DS18B20温度构成,主要负责采集温度数据,并通过串行通信将数据实时传输到上位机进行处理,PC机与MUC技术相对成熟。
3.1串行通信协议
串口通信协议SPCP(Serial Port Communication Protocol)设计理念是基于帧传输模式。在本实验中,将字符格式设置为一个起始位、八个数据位和一个停止位。无奇偶验证,中间8位为有效数据,波特率设置为9600。为了确保数据的可靠传输,在传输数据之前通过握手建立连接,软件握手协议如下:
上位机发送握手信号0xff对于下位机,如果下位机接收到上位机的信号为握手信号,则将数据包返回到上位机。第一个数据是握手信号,温度数据为两个数据。此时,如果上位机接收到的第一个数据不是握手信号,则丢弃数据包。如果是,则表示握手成功,并直接存储第二个数据。
3.2采集温度数据(DS18B20)
本系统采用DALLAS生产的一线数字温度传感器DS18B20微处理器与微处理器连接时,只需一条口线即可实现DS18B20双向通信设计可用数据线供电,简化系统硬件,支持多点功能和多个功能DS18B可并联于唯一的三线,实现多点测温,使用非常方便。尽管如此,DS18B以牺牲软件资源换取硬件资源为代价,采用单总线数据出数法,DS18B20的数据I/O都是同一条线完成的,所以对读写的操作时序要求很严格。
根据DTASHEET,对DS18B编程主要注意以下几个方面:
1.精确延迟问题[2]:确保DS18B延迟可分为2种:10us以下短延迟和10us上述长延迟。可使用短延时C51提供的内部函数_nop_()来实现,一个nop()函数相当于一个函数DJNZ,约2us;主要有15个延迟us,90us,270us,540us等等,这些延迟是15us整数倍可以一次使用nop()函数编写延迟15us的函数delay15(n)。
二、基本操作:DS18B20一线工作协议流程为:初始化→ROM操作指令→存储操作指令→数据传输DS18B20 所有的读写操作都是从初始化开始的,主要分为初始化操作、读写操作。
基于以上分析,是的DS18B编程源代码如下:
Init_DS18B20(void) ///初始化函数
{DQ = 1; //DQ复位
Delay15(1); //稍作延迟
DQ = 0; ///单片机将DQ拉低
Delay15(32); //精确延迟 大于 480us
DQ = 1; ///拉高总线
Delay15(6); //延时90us
x=DQ; ///读有脉冲
delay15(20); //延时约270us
}
Write_DS18B20(unsigned char dat)///写字节
{
unsigned char i="0";//定义循环变量
for (i=0; i<8; i )
{
DQ = 0; //复位
DQ = dat&0x01;///取数据并发位并发出
Delay15(1)
DQ = 1; //停止
dat>>=1;//右移
}
}
Read_DS18B20(void)///读一个字节
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 复位
dat>>=1;
DQ = 1; // 给
if(DQ)
dat|=0x80.//取位脉冲dat
delay15(1)
}
return(dat);
}
4 上位机部分(PC)
上位机通过串口向下位机发送命令,控制下位机,实时接受下位机传输的数据,分析处理,用图形显示和存储结果,完成人机交互过程。
Matlab不具备直接访问硬件的能力,但通过调用支持面向对象技术Instrument Control Toolbox中的serial类函数创建串口对象,串口对象操作是串口操作,使用非常方便。同时,Matlab串口对象支持串口的异步读写操作,使计算机在读写串口时能够同时进行其他处理,从而大大提高了计算机的执行效率。Matlab这种异步操作采用多线程技术实现。通过异步读写设置,计算机可以在执行读写串口函数时立即返回,无需等待串口传输数据。 当指定的数据传输结束时触发事件时,可以在事件回调函数中编程并处理数据,以免浪费等待串口传输数据造成的时间。
4.1 Matlab下串口编程
MATLAB的Instrument Control Toolbox提供了 MATLAB与仪器通信的功能 ,它支持 GPIB 通用接口总线 、VISA、TCP/ IP、UDP、RS2232等多个协议 ,具有同步和异步读写功能、事件处理和回调操作功能,可读写和记录二进制和ASCII文本数据。与串口相关的主要函数如下[3]:
(1)建立串口对象函数:obj=seril(’port’,’property name’,propertyvalue……),主要属性有:baudrate(波特率),databits(数据位),parity(验证方法),stopbits(终止位)等,可以在初始化时进行赋值或者使用set函数。
(2)打开串口设备对象:fopen(obj)
(3) 串口读写操作:当通信数据采用二进制格式时,串口读写设备的命令是fread()和fwrite()当通行数据使用文本时(ASCII)在格式上,读写串口设备的命令是fscanf()和fprintf()。
(4)关闭并清除设备对象:
Fclose(obj);%关闭串口设备对象
Delete(obj);在内存中删除串口设备对象%
基于系统串口通信协议,对串口对象的读写程序如下:
Obj=serial(’com1’,’baudrate’,9600,’parity’,’none’,’databits’,8,’stopbits1);%初始化串口
Fopen(obj);%打开串口对象
Fwrite(obj,256)xff
TMP=fread(obj,3,’unit8);%从串口读取3字节数据,后两个是16bit温度数据
If TMP(1)= =256 判断第一个字节是否有握手信号
For i = 1:3
Dat(i)=TMP(i 1);%去除第一个握手信号字节
End
End
Fclose(obj);%关闭串口设备对象
Delete(obj);在内存中删除串口设备对象%
4.2 Matlab数据分析
一般来说,单片机可以处理简单的八位无符号四个操作,而DS18B20可以程序设置9~12位的分辨率,精度可达±0.5℃,温度以16bit读取具有符号位扩展的二进制补码形式。如果使用单片机进行快速实时处理,则更加费力。同时,单片机还需要与DS18B20及上位机通信,系统资源也比较紧张。因此,可以读取16bit直接发送温度数据PC机,上位机来完成。Matlab强大的计算能力和绘图功能给数据分析带来了极大的方便,这不仅可以合理利用系统资源,也使得系统的通信过程更流畅。
图2所示的是用DS18B20测得的连续10个温度数据的变化曲线图。使用max()和min()函数可以求出温度的极大极小值,调用polyfit()函数还可以进行最小二乘回归分析与曲线拟合,进而求出温度变化的解析式,本实验中使用二阶拟合后,得到的温度随时间变化的函数解析式为:F(T)= 0.0125*T2 - 0.0145T+27.3083.
5 结语
Matlab是一款在控制领域应用十分广泛的软件,本实验基于Matlab环境下PC机与单片机实时通信及数据处理的方法,设计了一个小型温度检测系统,串口通信使用,极大的提高了开发效率,充分利用了Matlab的强大的数据分析能力,得到了温度随时间变化的函数解析式,取得了较好的效果,扩展了Matlab的使用范围,具有一定实用性。
本文作者创新观点:使用DS18B20传感器简化了硬件结构,采用Matlab编程,充分利用其数据分析能力,合理利用系统资源,提高了开发效率,扩展了Matlab的使用范围。
责任编辑: