EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 前言
" S' y! v6 N' w$ K6 H6 h温度是表征环境的一个重要的参数。在工程领域,尤其像工程热力学等,温度检测非常普遍,对温度精确测量以便实时控制也显得尤为重要。
, [% y( N9 s8 B, G) z+ G# Y, r( ^在控制系统中,上位机与下位机之间实现通信的方法和应用平台很多。目前,以VB和VC开发的通信软件较多,然而,这类软件虽然功能完善,但是数据采集到计算机后要进行各种处理(例如滤波,系统辨识,曲线拟合等)就显得不方便,编程比较复杂。Matlab具有强大的数据处理能力及功能丰富的工具箱,被广泛的应用于信号处理、自动控制等领域[1]。它编程语言简单易学,利用简单的命令就可以代替复杂的代码,极大地提高了开发效率。 3 n/ _5 L9 m; L) `2 o1 N4 l
本实验基于Matlab环境下设计了一个小型温度检测系统,下位机使用AT89S51单片机和DS18B20完成温度数据采集,上位机在Matlab环境下,调用设备控制箱serial类操作RS-232串口,用串行通信方式交换数据,进而借助Matlab对数据进行分析和处理,得到了温度随时间变化的函数解析式,同时介绍了基于Matlab环境下PC机与单片机串行通信的实时数据处理的实现方法。 * s' A: F7 h5 F3 x7 O- F
2 系统总体设计
i& ^8 B6 t* w2 j5 Z) \1 f8 v
# M$ T: x+ n7 b5 n4 @! V% }! S7 r
% [; Z/ v8 l! M& ^
图1 系统结构图 ! p* x M+ u( J% m9 O6 o% ]. }
温度检测系统的整体结构如图1所示。PC机串口与单片机USART口通过MAX232电平转换芯片相连,构成一个主从式通信系统。系统工作时,单片机对串口和DS18B20初始化,在读取温度的同时等待中断。PC机通过调用Matlab设备控制工具箱中的serial类及相关函数来创建串口设备对象,并以读写文件的方式实现对PC机串行口的访问,PC机通过Matlab向串行口发送特殊指令从而触发单片机中断系统,单片机调用中断服务例程,读取即使温度并将采集的数据通过串行口回送给PC机。此时,Matlab通过查询的方式,实时接收单片机发送的数据,并完成对数据的分析处理及图形显示。 ! t4 h+ v4 I$ c8 v) r) r& N+ d2 P
3 下位机部分
6 W4 {. N! b* s" a下位机部分由AT89S51单片机和DS18B20温度传感器构成,主要负责温度数据的采集工作,并通过串行通信实时地将数据传送到上位机进行处理,PC机与MUC串口通信技术相对而言已经比较成熟。
% i& [4 `. p3 Y! @3.1串行通信协议
7 M+ ]6 W7 ?& q$ s+ \1 F3 l2 }8 {串口通信协议SPCP(Serial Port Communication Protocol)设计思想是基于帧传输方式,在本实验中,设定字符格式为1个起始位,8个数据位和一个停止位,无奇偶校验,中间8位即为有效数据,波特率设置为9600,为保证数据可靠传输,在传送数据前通过握手建立连接,软件握手协议规定如下:
3 P8 B1 R f- M: z/ W6 [' l上位机发送握手信号0xff给下位机,下位机如果接受到上位机的信号为握手信号,则回送数据包给上位机,其中第一个数据为握手信号,以二个数据为温度传感器采集到的温度数据,此时,上位机如果接受到的第一个数据不是握手信号,则丢弃该数据包,若是,则表示握手成功,直接存储第二个数据。
7 M( w8 ~9 } }8 s- |) }3.2温度数据采集(DS18B20)
" y8 |6 n1 ]9 O- T: M! f3 }' a( @本系统中采用DALLAS生产的“一线总线”可编程数字化温度传感器DS18B20,与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,在使用中不需要任何外围元件,设计可用数据线供电,简化系统的硬件,同时支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温,使用起来非常方便。尽管如此,DS18B20是以牺牲软件资源换取硬件资源的,由于采用单总线数据出数方式,DS18B20的数据I/O均由同一根线完成,因此,对读写的操作时序要求非常严格。 $ P( }( w8 V) v8 I- B
根据DTASHEET,对DS18B20的编程主要注意以下几个方面: 7 G, r9 D2 X+ [# F3 P
1,精确延时问题[2]:为了保证DS18B20的严格时序,可以将延时分为2种:10us以下的短延时和10us以上的长延时。短延时可以使用C51提供的内部函数_nop_()来实现,一个nop()函数相当于一条DJNZ汇编指令,约2us;长延时主要有15us,90us,270us,540us等,这些延时均为15us的整数倍,一次可以使用nop()函数编写一个延时15us的函数delay15(n)。
) a4 A- i9 m, Z2,基本操作:DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输。对DS18B20 进行所有的读写操作都是从初始化开始的,主要分为初始化操作,读操作和写操作。
& r3 K4 t1 R G ^/ s基于以上分析,对DS18B20的编程源码如下: * z% {+ O8 e# u7 o' u! J, f
Init_DS18B20(void) //初始化函数 ) s7 L' `2 f0 }* Z& D5 \0 z
{DQ = 1; //DQ复位
1 m* k% a: ]! K# Z- e. d' TDelay15(1); //稍做延时
" {9 I+ {1 c' i7 ?9 u' `- Q$ FDQ = 0; //单片机将DQ拉低
, a% O% J+ t0 }2 K3 lDelay15(32); //精确延时 大于 480us " @5 O$ d0 J n
DQ = 1; //拉高总线
; [! Z2 B8 a- w4 R" ]Delay15(6); //延时90us
8 e. z: ^& a$ G4 ?6 ?; w, ]x=DQ; //读存在脉冲
3 V: P/ l; B7 s5 L. G: t; ?% \delay15(20); //延时约270us : A1 f/ t w: r- A7 H, L: C3 J# U
}
; T6 j7 S5 m6 J# Z. I N7 WWrite_DS18B20(unsigned char dat)//写一个字节
, s2 h2 b( d) k) `7 Z6 J{
+ C4 S, P1 w- E8 ?& N, p3 z2 ]9 {$ Lunsigned char i="0";//定义循环变量
" ^$ N6 K; w1 Y" O( Wfor (i=0; i<8; i++) 0 K: N e2 j- o. u; F M
{ ; X, u8 B+ j7 |: ~; R; Y9 F
DQ = 0; //复位 ; Q: `+ O% b" K6 J e& A
DQ = dat&0x01;//取数据的第i位并送出 & Z3 ?2 f; `" c X
Delay15(1);//延时 . F4 }, e) H: T+ e9 e- r3 {
DQ = 1; //停止 5 e7 x9 n. u1 \4 V3 z
dat>>=1;//右移
, d, s2 v2 u, v}
" o/ \% S8 J% G- `: P4 i* t& ~0 J1 u}
- D$ t& J( I' YRead_DS18B20(void)//读一个字节 2 W7 N( o5 O1 K# ?/ o5 G' X
{ : n6 ]7 \6 |% f9 X2 q( f
unsigned char i="0";
! D4 T- ]3 z2 punsigned char dat = 0; 3 h4 f) s$ V! ]
for (i=8;i>0;i--)
4 [; v6 O" C7 R% {% v{ ; `$ Q/ @! R) n8 m, i' T
DQ = 0; // 复位
, t+ K8 r9 `7 U; y% ?* Mdat>>=1;
; D2 L# v) x4 j+ L* H. \/ z: fDQ = 1; // 给脉冲信号
9 p, r4 s) x" z4 I( nif(DQ) 3 N1 F: a2 U" V' U
dat|=0x80;//取位脉冲并存入dat
; R6 {$ C4 d4 edelay15(1);//延时
. j5 D8 x6 Y% d6 c}
3 I: m ?, b' O. f; dreturn(dat);
, K) }( C5 z$ W4 R}
& z" l( d) s" {+ [) ?0 p/ N4 上位机部分(PC) 2 ?$ b& t$ f" t) i$ h/ m
上位机通过串口向下位机发送命令实现对下位机的控制,并实时地接受下位机传送过来的数据,对其分析处理,将结果用图形显示并存储,完成人机交互过程。 3 t1 G) r3 ]7 P$ P1 h* \3 c9 E0 k
Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创建串口对象,对串口对象操作就是对串口操作,使用起非常方便。同时,Matlab封装的串口对象支持对串口的异步读写操作,使得计算机在读写串口时能同时进行其他处理工作,因而能大大提高计算机执行效率。Matlab用多线程技术实现这种异步操作,通过异步读写设置,计算机在执行读写串口函数时能立即返回不必等待串口把数据传输完毕, 当指定的数据传输结束时就触发事件,执行事件回调函数,可以在事件回调函数中编程,进行数据处理,这样就不会造成因等待串口传输数据引起的时间浪费。
* O" s2 M$ L! |7 e: _4.1 Matlab下串口编程 / j- M d- O5 h2 q
MATLAB的Instrument Control Toolbox提供了 MATLAB与仪器仪表通信的功能 ,它支持 GPIB 通用接口总线 、VISA、TCP/ IP、UDP、RS2232等多个协议 ,具有同步和异步读写功能以及事件处理和回调操作功能,可读写和记录二进制和ASCII文本数据。与串口有关的主要函数如下[3]: $ k% N) I( P$ l- ~* i
(1)建立串口对象函数:obj=seril(’port’,’property name’,propertyvalue……),其中主要的属性有:baudrate(波特率),databits(数据位),parity(校验方式),stopbits(终止位)等,可以在初始化时进行赋值或者使用set函数。 * J+ c) q$ _* h3 n. f, r
(2)打开串口设备对象:fopen(obj)
2 k4 q$ W: ]' E1 y(3) 串口读写操作:当matlab通信数据采用二进制格式时,读写串口设备的命令为fread()和fwrite();当通行数据采用文本(ASCII)格式时,读写串口设备的命令为fscanf()和fprintf()。
' F" w9 h* e$ R$ e; q(4)关闭并清除设备对象:
- O7 `! X, i$ zFclose(obj);%关闭串口设备对象 2 W+ S1 S* V/ r6 ], _& w
Delete(obj);%删除内存中的串口设备对象
1 H7 u9 Z" O% V& A+ j& B基于本系统串口通信协议,对串口对象的读写部分程序如下: 8 ^; T: c5 c, Y2 z! s1 h0 [
Obj=serial(’com1’,’baudrate’,9600,’parity’,’none’,’databits’,8,’stopbits’,1);%初始化串口 , z j& i# ~3 T7 x, _& |& Y% o- @
Fopen(obj);%打开串口对象
8 e5 e1 v# u- FFwrite(obj,256);%向串口发送握手信号0xff
, n6 c; g* `. v/ v- Z, r3 Y, u3 wTMP=fread(obj,3,’unit8’);%从串口读取3字节数据,后2个即是16bit温度数据 1 K( k; y4 a/ |
If TMP(1)= =256 %判断第一个字节受否是握手信号 - G/ I$ K/ G) |" c2 ^' D
For i = 1:3 7 v1 l6 e- Q/ K# Y& }, e, `! ?
Dat(i)=TMP(i+1);%剔除第一个握手信号字节 - U. L) M( l5 O9 H1 t
End
3 D3 m' t0 S/ oEnd
! f% R7 }* l( c$ m, S+ TFclose(obj);%关闭串口设备对象
( J) I4 M% \3 s: |0 H9 dDelete(obj);%删除内存中的串口设备对象 ) L7 C/ [9 U# G# ?0 D6 P
4.2 Matlab数据分析 $ K% w. R1 ]0 R# j5 ~$ D
单片机一般能处理简单的8位无符号数的四则运算,而DS18B20可以程序设定9~12位的分辨率,精度可达±0.5℃,温度以16bit带符号位扩展的二进制补码形式读出,如果使用单片机进行快速的实时处理则比较费力,同时单片机还要与DS18B20及上位机通信,系统资源也比较紧张。因而可以将读取的16bit温度数据直接送往PC机,由上位机来完成。Matlab强大的计算能力和绘图功能给数据分析带来了极大的方便,这不仅可以合理利用系统资源,也使得系统的通信过程更流畅。 ' O0 W% W+ r1 z/ Y& v
3 _; } [0 d, X6 n
! B- {& O7 m8 D; a& b# T![]()
: O6 \, m, B$ h+ M图2所示的是用DS18B20测得的连续10个温度数据的变化曲线图。使用max()和min()函数可以求出温度的极大极小值,调用polyfit()函数还可以进行最小二乘回归分析与曲线拟合,进而求出温度变化的解析式,本实验中使用二阶拟合后,得到的温度随时间变化的函数解析式为:F(T)= 0.0125*T2 - 0.0145T+27.3083.
* l; V5 G/ a4 @( I5 结语
6 `. z; @$ Z/ k% I0 A7 `' \Matlab是一款在控制领域应用十分广泛的软件,本实验基于Matlab环境下PC机与单片机实时通信及数据处理的方法,设计了一个小型温度检测系统,串口通信使用Matlab编程,极大的提高了开发效率,充分利用了Matlab的强大的数据分析能力,得到了温度随时间变化的函数解析式,取得了较好的效果,扩展了Matlab的使用范围,具有一定实用性。
& D) h" O3 G& r% }# @本文作者创新观点:使用DS18B20传感器简化了硬件结构,采用Matlab编程,充分利用其数据分析能力,合理利用系统资源,提高了开发效率,扩展了Matlab的使用范围。 ' ^$ E5 I4 a" `; |
' y2 h$ P7 R( |5 U& ? |