本帖最后由 兰博 于 2019-7-19 14:30 编辑
摘 要
在水资源利用方面,对流量、水质等参数的测量非常重要,但很多水库资源在高山地区,难以对其进行实时监测。无线通讯技术的迅速发展和普及,为远程监控系统的实现提供了理想的平台,因此越来越多的水文站把基于无线通讯技术的监控系统作为水利系统自动化管理的新手段。而随着水利自动化技术不断发展,水利系统的自动化水平逐步提高,各水库都能通过远程监控系统逐渐实现少人、无人监管的管理模式,以提高生产效益。
本文主要探讨了基于无线通讯的模拟水库监测系统的设计问题。该系统要求对水库的水位,流量等参数进行远程实时监测,能控制阀门开/关,调节水位的高度,保证水库的安全。设计思路是在下位端利用单片机将传感器采集的水库信息进行处理,将处理好的数据通过CC1100无线模块传送到上位机端,在上位机上可以清楚地观察水库的实时情况。上位机对信息进行监测分析,并将分析后的信息反馈回到下位端,通过单片机控制步进电机正反转,模拟阀门开/关,来控制水库水位和流量,保证水库的安全。近年来,本课题在国内外已受到非常多的关注与研究,并且不断地得到改进,在实际应用中也取到了较好的效果,具有非常好的应用推广价值。
水库是我国防洪和蓄水广泛采用的工程措施之一。随着计算机及无线通信技术的发展,水库自动监测的信息采集、处理及发布已完成手工方式向自动方式的转变。通过建设水文站实时监控系统,利用先进的无线通讯监控手段对水库信息实施监测。采用CC1100无线网络实时网上传输水文数据,能实现对水库及其附属建筑物及管理区进行全面视频监控。
长期以来,水文工作者都是,靠手测、目测收集水文信息。直接影响到测报的精度和成果质量。利用无线监控系统采集数据,不但可提高精确度,还可以使水文工作者告别传统的工作方式。
在通常情况下,由于水文站点在地理位置上分布较广或位置较偏僻。并且与监控中心的距离较远,利用传统的有线连接方式,线路铺设成本高昂,而且施工周期长,同时,因为物理因素如河流山脉等障碍而难以架设线缆。而且水文信息安全防范要求高,采用有线通讯在遇到刮风、暴雨、决口等灾害时,线路一断,水文信息就无法及时传递上去,因此有线传输的抗灾性比较差,难以适应高可靠性要求,加之流域地形复杂、偏僻,铺设光纤成本也比较高。相比之下,无线通信布线简单、方便,抗灾性比较好,成本也比较低,可大量节省投资。
本文中提到的CC1100水文数据无线监控解决方案可很好地解决上述问题。用户采用无线水库监测系统,无需铺设网络电缆,可迅速方便地采集各种需要的实时数据资料,建立新的无线监控系统或对现有的无线监控系统进行扩展,具有很强的灵活性和可扩充性。可实现真正意义的实时水文信息的采集和监控、统一管理。
本课题所研究的水库监测系统采用了自动控制、计算机网络和无线通讯新技术,具有实时信息自动采集、传输、视频监控、远程数据和图像传输、信息、查询等功能。系统应用了单片机,传感器,CC1100无线模块,步进电机等元器件。可实时监控管理区水库的实时参数。该监控系统采用无线传送,传递速度快,系统结构简单。被监控点实时采集的数据文件通过无线网络通信线路及时地传输给监控中心,实时动态地报告被监测点的情,及时发现问题并进行处理,既方便又简捷。并可确保系统在各种恶劣天气情况下,都能正常运行,满足系统各种信号相互传输的准确性。可全面实现水文信息采集自动化、数字化和网络化。大大提高了水库了安全系数和水资源利用率。
当前,我国水资源的短缺已严重影响了经济的可持续发展,可以说已经成为社会经济稳定增长的瓶颈。水资源时空分布严重不均,人口众多和传统工业经济发展速度较快等因素加剧了缺水问题;严重的水污染又使缺水问题日益突出,随着流域内经济的快速增长和人口的增加,水资源的供需矛盾将越发急剧。因此,充分利用水资源,防治水污染已成当务之急!在大力加强节水、保护水质,实现水资源的可持续利用的前提下,如何提高现有水资源的管理水平就显得尤为重要,是一直困扰我们的难题。在很多偏远山区或河流的峡道口,都建立了各型的水库,它们的作用毋庸置疑。通过水库的作用,可以充分合理地利用水资源。
有了水库的蓄水功能,我们就可以充分地将水能转化为所需的能源,对社会经济的发展有着很深远的影响。但福兮祸所依,水库同时存在很严重的隐患。如若控制不当,其结果必导致巨大的灾难。因此,在大力加强节水、保护水质,实现水资源的可持续利用的前提下,如何提高现有水库的管理水平就显得尤为重要。长期以来,水文工作者都是靠手测、目测收集水文信息。直接影响到测报的精度和成果质量。利用无线监控系统采集数据,不但可提高精确度,还可以使水文工作者告别传统的工作方式。
在通常情况下,由于水文站点在地理位置上分布较广或位置较偏僻。并且与监控中心的距离较远,利用传统的有线连接方式,线路铺设成本高昂,而且施工周期长,同时,因为物理因素如河流山脉等障碍而难以架设线缆。而且水文信息安全防范要求高,采用有线通讯在遇到刮风、暴雨、决口等灾害时,线路一断,水文信息就无法及时传递上去,因此有线传输的抗灾性比较差,难以适应高可靠性要求,加之流域地形复杂、偏僻,铺设光纤成本也比较高。
CC1100模块的无线通讯性能非常好,可以高效稳定地完成信息传输任务,而且操作简单,能克服复杂的环境,传送的数据不容易受到外界的干扰,使得上位机能接收到水库完整的信息,以对其进行准确地监测分析。
随着我国社会经济的快速发展,对水资源的需求越来越大,换言之,水库的重要性越来越显著,对水库的管理力度必须加大。我国山区多,极易发生自然灾害,合理地控制水库的参数,可以减少很多损失。本课题所研究的模拟水库监测系统采用的是无线远程监测,它的实用性非常强,能有效地监测建在偏远山区人力难至的水库的实时参数,而且在原设备老化的情况下,能够轻松地进行更新和扩展,省却了大量的人力物力,工作效率也大大提高。
在要求全球自动一体化的现代社会,它是相当有研究价值的。因此,该系统有着很大的发展潜力,基于无线通讯的水库监测系统定会得到非常广泛的应用。
在通常情况下,由于水库在地理位置上分布较高或位置较偏僻。并且与监控中心的距离较远,利用传统的有线连接方式,线路铺设成本高昂,而且施工周期长,同时,因为物理因素如河流山脉等障碍而难以架设线缆。长期以来,水文工作者都是靠手测、目测收集水库水文信息,直接影响到测报的精度和成果质量。
利用模拟水库无线监控测系统采集数据,不但可提高精确度,还可以使水文工作者告别传统的工作方式。而且水文信息安全防范要求高,采用有线通讯在遇到刮风、暴雨、决口等灾害时,线路一断,水文信息就无法及时传递上去,因此有线传输的抗灾性比较差,难以适应高可靠性要求,加之水库区域地形复杂、偏僻,铺设光纤成本也比较高。相比之下,无线通信布线简单、方便,抗灾性比较好,成本也比较低,可大量节省投资。
用户采用无线监控解决方案,可迅速方便地在采集水库各种需要的实时数据,而且可以对现有的无线监控系统进行扩展升级,具有很强的灵活性和可扩充性。可实现真正意义的实时水文信息的采集和监控、统一管理。
本课题中,利用自动控制、计算机网络和无线通讯新技术来构成无线监测系统,采用CC1100无线模块来进行无线传送,具有实时信息自动采集、传输、无线监控、远程数据和图像传输、信息、查询等功能,可实时监控管理区水库的情况。该系统信息传递速度快,结构简单,全面实现了水文监测自动化。
本课题主要研究如何设计模拟水库监测系统的问题。由于关键在于数据的无线通讯传输上,所以必须对CC1100模块等硬件特性要有一定的研究,要设计好功能实现的过程,实际上,整个课题的难点就在于调试上。
各章内容安排:第一二章两章主要是基础理论知识的介绍。主要有本课题的研究意义、模拟水库监测系统的相关理论知识以及简要的分析了一下所用到芯片相关理论及应用;第三章主要从总体方面分析系统的设计思路以及用到的相关原理;第四章是本次系统设计的硬件电路设计部分,详细分析了每一模块的原理、功能、相关原理图以及元件和参数的选择;第五章阐述了系统的软件部分,介绍了各模块软件的编译流程图,并对部分程序进行了分析;第六章和第七章主要讲述了系统的干扰和调试情况;最后是主要是总结和参考的文献及附录,在附录中介绍采集部分程序,CC1100无线模块通讯代码, 步进电机控制程序,串口通讯程序及上位机的VC监测界面的编译程序。
图2.1 CC1100无线模块轮廓图
图2.2 CC1100无线模块的接口电路图
CC1100 单片无线收发器工作在433/868/915MHZ 的ISM 频段由一个完全集成的频率调制器一个带解调器的接收器一个功率放大器一个晶体震荡器和一个调节器组成。工作特点是自动产生前导码 和CRC 可以很容易通过SPI 接口进行编程配置,电流消耗低。
表2.1 CC1100接口电路的引脚特性
引脚编号
|
引脚名
|
引脚类型
|
描述
|
1,2
|
VCC
|
电源输入
|
1.9V-3.6V之间
|
3
|
SI
|
数字输入
|
连续配置接口,数据输入
|
4
|
SCLK
|
数字输入
|
连续配置接口,时钟输入
|
5
|
SO(GD01)
|
数字输出
|
连续配置接口,数据输出
当CSn为高时为可选的一般输出脚
|
6
|
GDO2
|
数字输出
|
一般用途的数字输出脚:
测试信号,FIFO状态信号,
时钟输出,从XOSC向下分割
连续输入TX数据
|
7
|
CSn
|
数字输入
|
连续配置接口,芯片选择
|
8
|
GDO0
|
|
一般用途的数字输出脚:
测试信号
FIFO状态信号
时钟输出,从OSC向下分割
连续输入TX数据
|
9,10
|
GND
|
地(模拟)
|
模拟接地
|
(1) CC1100无线模块的特性
① VCC脚接电压范围为 1.9V-3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。
② 除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。
③ 硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以了。
④ 9脚,10脚为接地脚,需要和母板的逻辑地连接起来
⑤ 排针间距为100mil,标准DIP插针,如果需要其他封装接口,比如密脚插针,或者其他形式的接口,可以联系我们定做。
⑥ 与52系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要.其他系列的单片机,如果是5V的,请参考该系列单片机IO口;输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块! 如果是3.3V的,可以直接和CC1100模块的IO口线连接。
(2) CC1100模块的应用
在本系统中,采用的CC1100无线模块的工作电压是3.3V,频率波段为300-348 MHz、400-464 MHz和800-928 MHz,有很高的灵敏度(1.2kbps,1%数据包误差率),可编程控制的数据传输率可达500kbps,有较低的电流消耗(RX中15.6mA,2.4kbps,433MHz),有可编程控制的输出功率,其所有的支持频率可达+10dBm,有优秀的接收器选择性和模块化性能。
① CC1100无线模块中有极少的外部元件:芯片内频率合成器,不需要外部滤波器或RF转换,可编程控制的基带调制解调器;有理想的多路操作特性,有可控的数据包处理硬件,可快速频率变动合成器带来的合适的频率跳跃系统,有可选的带交错的前向误差校正,有单独的64字节RX和TX数据FIFO高效的SPI接口:所有的寄存器能用一个“突发”转换器控制,有数字RSSI输出与遵照EN 300 220(欧洲)和FCC CFR47 Part 15 标准的系统相配,还有自动低功率RX拉电路的电磁波激活功能,并拥有许多强大的数字特征,使得使用廉价的微控制器就能得到高性能的RF系统。
② CC1100无线模块还包含集成模拟温度传感器,及能自由引导的绿色数据包,能对数据包导向系统的灵活支持:对同步词汇侦测的芯片支持,地址检查,灵活的数据包长度及自动CRC处理。还有可编程信道滤波带宽OOK和灵活的ASK整型支持2-FSK,GFSK和MSK支持自动频率补偿,可用来调整频率合成器到接收中间频率对数据的可选自动白化处理;对现存通信协议的向后兼容的异步透明接收/传输模式的支持可编程的载波感应指示器 ,可编程前导质量指示器及在随机噪声下改进的针对同步词汇侦测的保护,支持传输前自动清理信道访问(CCA),即载波侦听系统 ,支持每个数据包连接质量指示。
③ CC1100无线模块是一种低成本真正单片的UHF收发器,为低功耗无线应用而设计。电路主要设定为在315、433、868和915MHz的ISM和SRD(短距离设备)频率波段,也可以容易地设置为300-348 MHz、400-464 MHz和800-928 MHz的其他频率。RF收发器集成了一个高度可配置的调制解调器。这个调制解调器支持不同的调制格式,其数据传输率可达500kbps。通过开启集成在调制解调器上的前向误差校正选项,能使性能得到提升。
④ CC1100无线模块为数据包处理、数据缓冲、突发数据传输、清晰信道评估、连接质量指示和电磁波激发提供广泛的硬件支持。CC1100的主要操作参数和64位传输/接收FIFO(先进先出堆栈)可通过SPI接口控制。
本课题通过实验验证,系统中使用的CC1100无线模块的功效距离大约1.2公里,只要再对其进行一些技术上的改进,可以确定地说,在以后对水库无线远程监控的应用中,它会起到非常大的作用。
串行通信是指数据的各位是一位一位得按顺序传送的通讯方式。它的突出优点是只需要一根传输线,甚至可以利用电话线作为传输线,这样就大大降低了传输成本,特别使用于远距离通讯。其缺点是传送速度较低。假如并行传送N位数据所需要的时间为T,那么串行传送的时间至少为NT,而实际上总是大于NT。
(1) 串行通讯的两种基本方式
围绕着当两个设备进行串行通讯时,如何才能保证接受机接受到正确的字符这个问题,通常采用通讯双方都认可的两种传送方式(即通信方式)。
① 异步传送方式
在异步传送方式中,字符是按帧格式进行发送的。在帧格式中,先是一个起始位“0”,然后是5至8位数据。异步传送方式规定低位在前,高位在后;接下来是奇偶校验位(可略);最后一位是停止位“1”。异步通信的帧格式如图2.3所示。
n-1 第N个字符(一串行帧) n+1
P
|
1
|
0
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
P
|
1
|
0
|
D0
|
起始位 数 据 位 校验位 停止位
图2.3 异步通信的帧格式
这种传送方式利用每一顿的起、止信号来建立发送与接收之间的同步。其特点是:每一帧内部各位均采用固定的时间间隔,但帧与帧之间的时间间隔是随机的。接收机完全靠每一个帧的起始位与停止位来识别字符传送是正在进行还是已经结束,或是一个新的字符。这也就是“异步”的涵义所在。必须指出,在异步传送时,同步时钟脉冲并不传送到接收方,即双方各用自己的时钟源来控制发送和接收。本系统中所用到的串口通讯程序,就是采用了异步传送方式。
② 同步传送方式
同步传送方式是一种连续传送的方式,它不必像异步传送方式那样要在每个字符都加上起止位,而是在要传送的数据块前加上同步字符SYN,而且数据没有间隙,如图2.4所示,使用同步传送方式,可以实现高速度,大容量的数据传送。
开始 终止
同步字符
|
同步字符
|
数据段
|
CRC字符#1
|
CRC字符#2
|
图2.4 串行通讯的同步传送方式
在同步传送中,为了保证接收正确无误,发送方除了传送数据外,还要将时钟信号同时传送。
在串行通讯中有一个重要的指标叫做波特率。它定义为每秒钟传送的二进制数码的位数,以位/秒作为单位。波特率反映了串行通讯的速率,也反映了对传输通道的要求,波特率越高,要求传输通道的频带就越宽。在异步通讯中,波特率为每秒传送的字符数和每个字符位数的乘积。
(2) 串行口的工作方式
串行口控制寄存器SCON格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
SM0
|
SM1
|
SM2
|
REN
|
TB8
|
RB8
|
TI
|
RI
|
SCON
图2.5串行口控制寄存器SCON格式
SM0,SM1为串行口工作方式选择位。可选择四种工作方式,如表2.2所示。表中f为单片机时钟频率。
表2.2 串行口工作方式选择
SM0
|
SM1
|
方 式
|
功 能
|
波特率
|
0
|
0
|
0
|
同步移位寄存器
|
f/12
|
0
|
1
|
1
|
10位异步收发
|
可变
|
1
|
0
|
2
|
11位异步收发
|
F/64或 f/32
|
1
|
1
|
3
|
11位异步收发
|
可变
|
由于本设计中只用到方式1,故在此详细介绍工作方式1。
在方式1状态下,串行口为8位异步通信接口。一帧信息位10位:1位起始位(0),八位数据位(低位在前)和1位停止位(1)。TXD位发送端,RXD为接收端,波特率可变。
① 发送
串行口以方式1发送时,数据由TXD端输出,CPU执行一条写入SBUF的指令后,便启动串行口发送,发送完一帧信息时,将发送中断标志TI置1。
方式1发送时的定时信号,即发送移位脉冲,是由定时器1送来的溢出信号经过16或32分频(取决于SMOD的值)而取得的,因此其波特率是可变的。
② 接收
方式1接收是在REN位置1的前提下,从搜索到起始位而开始的,在无信号时,RXD的线的状态为1,当检测到存在由1到0的变化时,即认为收到个字符的起始位,接收过程随即开始,在接受移位脉冲的控制下,把接受到的数据一位一位地移入接收寄存器,直到9位数据(包括1位停止位)全部收齐。在9位数据收齐之后,还必须同时满足以下两个条件,这次接收才能被真正确认:
RI=0;SM2=0或接收到地停止位为1。
当满足这两个条件时,便将接收移位寄存器中的8位数据存入串行口数据缓存器SBUF,收到的停止位则进入RB8,并使接收中断标志RI置1。若这两个条件不满足,则所接收的数据无效,串行口接着又开始寻找下一个起始位,准备接收下一帧数据。
(1) 流量传感器的基本特性
流量范围是1-30L/MIN,工作电压范围是3.5-24VDC,脉冲特性F=(8.5Q-3)(Q=L/MIN),误差为5%,该水流量传感器与相关电路配合可监测实时流量或计算累计流量,输出信号为脉冲信号。
图2.6 流量传感器轮廓图
该水流量传感器是利用霍尔元件的霍尔效应来测量磁性物理量。在霍尔元件的正极串入负载电阻,同时通上5V的直流电压并使电流方向与磁场方向正交。当水通过涡轮开关壳推动磁性转子转动时,产生不同磁极的旋转磁场,切割磁感应线,产生高低脉冲电平。由于霍尔元件的输出脉冲信号频率与磁性转子的转速成正比,转子的转速又与水流量成正比。其脉冲信号频率的经验公式见式 (1)。
f=8.1q-3 (1)
式中:f—脉冲信号频率,H2;q—水流量,L/min
由水流量传感器的反馈信号通过控制器判断水流量的值。
(2) 水流量传感器的构造
水流量传感器主要由铜阀体、水流转子组件、稳流组件和霍尔元件组成。它装在模拟水库中,用来测量水流量。当水流过转子组件时,磁性转子转动,并且转速随着流量成线性变化。霍尔元件输出相应的脉冲信号反馈给控制器,由控制器判断水流量的大小,调节控制比例阀的电流。水流量传感器从根本上解决了压差式水气联动阀启动水压高以及翻板式水阀易误动作等缺点。它具有反映灵敏、安全可靠、连接方便利启动流量超低(1.5L/min)等优点。
水流转子组件主要由涡轮开关壳、磁性转子、制动环组成。使用水流开关方式时,其性能优于机械式压差盘结构,且尺寸明显缩小。当水流通过涡轮开关壳,推动磁性
子旋转,不同磁极靠近霍尔元件时霍尔元件导通,离开时霍尔元件断开。
(3) 水流量传感器的工作原理
在本系统中,利用水流量传感器的特性,设计了一个小型的模拟水库。用一般用于给金鱼供氧的小型抽水换氧机作为抽水机,抽动水流运动,使水流通过水流量传感器的涡轮,水流量传感器开始采集数据.通过调整连接在抽水机与水流量传感器间的导水管的高度来调整水流量大小;下位端数码管显示所测水流量值。测得的流量值相当好,可以精确到毫秒,误差几乎可以忽略不计。
图2.7 超声波传感器
本系统设计中,使用了一对超声波传感器,配置相应的电路,来实现对模拟水库水位的测量。
(1) 超声波传感器包括发送和接收两部分,电路图介绍如下:
图2.8 超声波发送电路
由三个NPN三极管构成差动放大电路,其放大倍数由电阻R7,R8和R9等电阻决定,所采集的信号波从J6口输入,经由NPN管级数放大,在消除共模干扰后,从J6口发送出去。
图2.9 超声波接收电路
超声波换接收电路所接收到的从发送端传来的微弱信号,要经过LM358芯片进行放大,使得所采集的信号足够大,然后通过J2口送到单片机上,信号经AT89S52单片机处理后,由数码管显示出来。
(2) 超声波的接收与处理
接收头采用与发射头配对的UCM40R,将超声波调制脉冲变为交变电压信号,经运算放大器放大后,作为中断请求信号,送至单片机处理。
(3) 测试中所遇到的干扰信号
超声波测量水位时,需要测的是开始发射到接收到信号的时间差,需要检测的有效信号为反射物反射的回波信号,故要尽量避免检测到余波信号,这就要求对接收头收到的波束进行处理,这也是超声波检测中存在最小测量盲区的主要原因。在软件中的处理方法就是,当反射头发出脉冲,计时器同时开始记时。我们在记时器开始记时后再开启检测回波信号,可以消除余波信号的干扰,等待的时间可以为1MS左右,更精确的等待时间可以大大地减少最小测量盲区。
(1) 步进电机的概念
步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。
(2) 步进电机的一些特点:
① 一般步进电机的精度为步进角的3-5%,且不累积;
② 步进电机外表允许的最高温度。步进电机温度过高首先会使电机的磁性材料退磁,从而导致力矩下降乃至于失步,因此电机外表允许的最高温度应取决于不同电机磁性材料的退磁点。
③ 步进电机的力矩会随转速的升高而下降。当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。
④ 步进电机低速时可以正常运转,但若高于一定速度就无法启动,并伴有啸叫声。
(3) 步进电机控制原理
① 步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。
② 步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
③ 步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。其基本原理作用如下:
通电换相这一过程称为脉冲分配。例如:三相步进电机的三拍工作方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断。
控制步进电机的转向。如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。
控制步进电机的速度
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。两个脉冲的间隔越短,步进电机就转得越快。调整单片机发出的脉冲频率,就可以对步进电机进行调速。但脉冲形式的电机控制,使控制端容易受到干扰,所以必须在电机驱动电路中加入光耦电路来减少干扰。
电机的正反转是由单片机来控制的。当单片机的一个口发出1或者0的时候来决定正反转,也可以两个口来决定。电机的启动我们选择用LM298。本文中,主要应用到步进电机的换相功能,通过单片机控制步进电机正反转动,来模拟实现阀门的开/关。
图2.10 AT89S52单片机
AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口和外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
表2.3 主要功能特性
· 兼容MCS-51指令系统
|
· 8k可反复擦写(>1000次)ISP Flash ROM
|
· 32个双向I/O口
|
· 4.5-5.5V工作电压
|
· 3个16位可编程定时/计数器
|
· 时钟频率0-33MHz
|
· 全双工UART串行中断口线
|
· 256x8bit内部RAM
|
· 2个外部中断源
|
· 低功耗空闲和省电模式
|
· 中断唤醒省电模式
|
· 3级加密位
|
· 看门狗(WDT)电路
|
· 软件设置空闲和省电功能
|
· 灵活的ISP字节和分页编程
|
· 双数据寄存器指针
|
AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入.当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。
P1口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能
P2口:P2口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2口:送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:P3口是一个具有内部上拉电阻的8 位双向I/O 口,p2口输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。
引脚号第二功能
RST: 复位输入。晶振工作时,RST脚持续2 个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。
ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过.如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:振荡器反相放大器的输出端。
AT89S52 特殊寄存器映象及复位值特殊功能寄存器特殊功能寄存器(SFR)的地址空间映象。并不是所有的地址都被定义了。片上没有定义的地址是不能用的。读这些地址,一般将得到一个随机数据;写入的数据将会无效。
(1) TLC549的原理
如图2.11,作为数据采集芯片,TLC549均有片内系统时钟,该时钟与I/O CLOCK是独立工作的,无须特殊的速度或相位匹配。当CS为高时,数据输出(DATA OUT)端处于高阻状态,此时I/O CLOCK不起作用。这种CS控制作用允许在同时使用多片TLC549时,共用I/O CLOCK,以减少多路(片)A/D并用时的I/O控制端口。TLC549可方便地与具有串行外围接口(SPI)的单片机或微处理器配合使用,应用接口及采样程序。
该芯片有一个模拟输入端口,3态的数据串行输出接口可以方便地和微处理器或外围设备连接。TLC549仅仅使用输入/输出时钟(I/CLOCK)和芯片选择(CS),就能够正常启动。
图2.11 TLC549 A/D转换器
(2) TLC549的特点
表2.4 TLC549基本特性
|
CMOS技术
|
|
低功耗数据采集系统
|
|
8位转换结果
|
|
电池供电系统
|
|
与微处理器或外围设备接口
|
|
工业控制
|
|
差分基准电压输入
|
|
工厂自动化系统等
|
|
转换时间:最大17us
|
|
|
|
每秒访问和转换次数:达到40000
|
|
|
|
片上软件控制采样和保持功能
|
|
|
|
全部非校准误差:±0.5LSB
|
|
宽电压供电:3~6V 封装及引脚
|
|
低功耗:最大15mW
|
|
5V供电时输入范围:0~5V
|
|
输入输出完全兼容TTL和CMOS电路
|
|
全部非校准误差:±1LSB
|
|
工作温度范围:0℃~70℃(TLC549); -40℃~85℃(TLC549I)
|
TLC549可方便地与具有串行外围接口(SPI)的单片机或微处理器配合使用,也可与52单片机连接使用,实际应用程序清单如下:
;初始化:
SETB P1.2 ;置CS为1。
CLR P1.0 ;置I/O CLOCK为零。
MOV R0,#00H ;移位计数为零。;A/D过程:
A/DP: CLR P1.2
NOP ;等待1.4μs,nop数根据晶振情况选择。
NXT: SETB P1.0
MOV C, P1.1
RLC A
CLR P1.0
INC R0
CJNE R0,#8,NXT
MOV R0,#00
SETB P1.2
MOV DTSVRM,A ;DTSVRM:DATA SAVE RAM.
RET
TLC549片型小,采样速度快,功耗低,控制简单。适用于低功耗的袖珍仪器上的单路A/D或多路并联采样。
2.5.3 MAX232 芯片
MAX232芯片是MAXIM 公司生产的低功耗、单电源双RS232发送/接收器。适用于各种EIA-232E 和V.28/V.24 的通信接口。MAX232芯片内部有一个电源电压变换器,可以把输入的+5V电源变换成RS-232C输出电平所需±10V电压,所以采用此芯片接口的串行通信系统只要单一的+5V电源就可以。
MAX232 外围需要4个电解电容C1 、C2 、C3 、C4 ,是内部电源转换所需电容。其取值均为1μF/25V。宜选用钽电容并且应尽量靠近芯片。C5为0.1μF的去耦电容。
MAX232的引脚T1IN、T2IN、R1OUT、R2OUT为接TTL/ CMOS 电平的引脚。引脚T1OUT、T2OUT、R1IN、R2IN 为接RS - 232C电平的引脚。因此TTL/ CMOS 电平的T1IN、T2IN引脚应接MCS- 51 的串行发送引脚TXD; R1OUT、R2OUT 应接MCS-51的串行接收引脚RXD。与之对应的RS -232C电平的T1OUT、T2OUT 应接PC 机的接收端RD; R1IN、R2IN应接PC机的发送端TD。
MAX232的用法如下:
(1) 在C1+和C1-两端、C2+和C2-两端、V+和地两端、V-和地两端分别接一个0.1μf(105)电容。
(2) 可以将两路RS-232C电平转换成两路TTL电平。分别从R1IN和R2IN输入,对应从T1OUT和T2OUT输出。注意,输入和输出的逻辑值保持一致,如输入-5V,即逻辑1,输出也是逻辑1,TTL电平为高电平,即3.6V左右。
(3) 可以将两路TTL电平转换成两路RS-232C电平,分别从T1IN和T2IN输入,对应从R1OUT和R2OUT输出。同样输入和输出的逻辑值保持一致。
图2.12 MAX232芯片
LED数码管多段发光二极管组成,其形状有7段8字形的、14段米字形等。根据接法不同又可分为共阴极和共阳极两类。每一段由一个引脚控制,根据要求,对各个引脚加上不同的电压,使其显示需要的数字或字符。如果是一个共阴极数码管,则要显示0时就要给a、b、c、d、e、f、g七只发光二极管加高电平,给g管加低电平,十六进制数为7E。从0~9的十六进制显示码分别为3F,06,5B,4F,66,6D,7D,07,7F,6F。
在该单片机系统中,使用了LED数码显示器来显示采集到的水库水位和流量。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
八段LED显示器由8个发光二极管组成。基中7个长条形的发光管排列成“日”字形,另一个点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器。如2.5.4图所示。本系统中使用了一块四位七段数码管。
图2.13 数码管原理图
LM298是四路输出的电机驱动芯片,每路大概500毫安,其本身有压降,随输出电流的变化而变化。它可以同时控制两个直流电机,可以驱动一个步进电机。LM298的管脚我们已经知道,它的作用是控制电机的正反转和驱动电机。下位端单片机与LM298连接(管脚如下图),但电机脉冲会对下位机产生很强的干扰,所以必须在单片机和LM298之间加上一个光耦电路来隔离,减少干扰影响。本系统只用到LM298的部分功能。
图2.14 LM298驱动芯片
本系统要求对水文站的雨量,流量进行监测,自动控制阀门开/关。利用超声波传感器和流量传感器采集水位、流量等信息,利用CC1100无线模块实现上位机与下位机之间无线通信。上位机存储数据,并通过编译VC界面实时显示水库的参数变化情况。
(1) 水位和流量的监测
能够对水库水位、流量等参数进行数据采集。并且精度需要达到0.5CM,数据用无线传送。采集到的水位、流量等数据需要从下位机传输到上位机。为了完成这一过程,本系统采用了CC1100无线传输模块,利用其无线通讯技术,把上位机与下位机联系起来,实现数据的无线传送。在传输的过程当中不能够出现误码,或者尽可能让误码降到最小。
(2) 闸门的控制
水文站的控制最重要的一点就是:让水位保持在一定的范围内。当水位过高时,需要放水。当水位过低时,则需要蓄水。这个过程中,由传感器传输的数据经A\D转换送入单片机处理,相应发出控制信号来控制闸门的开与关。这个过程可以由下位机单片机端直接控制。系统中通过单片机控制步进电机正反转,来模拟阀门开关的运转情况。所采集到的数据在PC机上采用图形或者例表的形式显示,来直观地监测水库的实时参数。
该水库监测系统结构主要由四部分组成:数据的采集、单片机运算控制、数据的无线收发、上位机端的监测分析。设计思路是将传感器所采集到的水库参数,经A/D转换送入单片机进行处理,然后将处理的结果,经CC1100无线模块传输到上位机端,再通过串口通讯技术,利用MX232芯片将数据传到上位机上,在上位机上通过编译的界面可以清楚地知道水库的情况,然后对所监测到的数据进行分析,将分析结果反馈到下位端,下位机端接收到反馈信息后,由单片机输出脉冲,来控制步进电机正反转(相当于控制阀门开/关),从而实现对水库的流量和水位的适时控制,保证水库的安全。
为了提高系统的可靠性,本方案中,进行的是双保险.系统分两个部分,一个是单片机独立控制,二是人为的远程控制。整个过程完全自动运行,不需要人为地实地监控,这样就保证了控制速度和精确度.采用远程控制,可以容易地对硬件设备进行更换扩展,这样就避免了因系统的老化而可能产生的系统损坏或无法正常工作等问题,从而使系统能持续地正常运转,减少了系统故障的发生。
利用AT89S52单片机和LM298驱动芯片构成步进电机的控制系统,控制电机正反转。在该电路设计中,加入了TLP521_4光耦电路,使单片机与步进电机的驱动电路完全隔离,以减少电机脉冲对单片机的干扰;电路图中还包括单片机外接的四个插槽,方便对单片机上的各个接口的使用,它们通过网络标志分别和各相关电路元件连接。步进电机接收的是脉冲信号,所以极容易受到干扰。
图4.1 步进电机的驱动电路
AT89S52单片机是模拟水库监测系统的核心部分,用它来控制整个系统的运行,下面是它的电路图及相应配备电路,本系统中,共用到两块AT89S52单片机,上下位端各一块,下位端即CC1100模块无线发送端,这一块单片机有三个作用,一是对传感器所采集的信息进行处理;二是将处理好的数据信息送入到CC1100模块中进行发送;三是根据信息处理结果,控制步进电机正反转。上位端的AT89S52单片机主要是用来承载CC1100模块所接收到的信息,实现串口通讯,将数据传到上位机上去。要对AT89S52单片机进行保护,在XTAL1和XTAL2间要加入晶振电路来保证单片机的正常运行。
图4.2 单片机工作电路
显示模式采用的是四位七段LED数码管显示,如同单片机的使用一样,该系统电路中也使用了两块数码管,它们的功能分别是:下位端的数码管是用来显示传感器所采集的信号,通过其显示的方波信号来计算时间差,求出水位,以及显示由流量传感器所采集的水流量的大小;上位端的数码管用来监测CC1100模块无线通讯是否成功,如果它显示的数字和下位端数码管一样,就证明无线发送/接收成功。
图4.3 数码管显示及其驱动电路
由于本系统中CC1100的工作电压是3.3V,为了给其提供稳定的电压,使用了LM1117电压调节器,它能产生3.3V的稳压;该电源模块中还包括上电显示,给步进电机和单片机供电的电压块。
图4.4 电源模块
在下面电路图中,只显示了上位端的CC1100接收模块,因为发送模块的连接方法是一样的,为了避免重复,所以没有给出。上位端接收从CC1100无线发射模块传来的信号,再将收集的信号传送到单片机上。由MX232串口通讯电路,把单片机中的数据信号传到上位机中去,通过上位机显示水库的实时参数,并对数据进行分析反馈。
图4.5 CC1100接收模块及串口通讯电路
在本系统中,程序流程图可分为上位机端和下位机端两部分。
在本系统中,程序流程图分为上位机端程序流程图和下位机端程序流程图两大部分。在上位机端,是编译程序来完成上下位机之间的串口通讯,以及实现数据在上下位机间的传送;而下位机端的程序流程图可以实现以下系统功能:一是实现传感器对模拟水库的实时参数的采集,如水位,流量等;二是实现CC1100无线模块的无线通讯;三是实现AT89S52单片机对步进电机的控制。
5.2 CC1100模块发送和接收部分程序分析
在这里介绍CC1100模块的部分通讯代码。由于CC1100无线模块的源代码非常多,下面只介绍CC1100无线模块发送/接收部分的程序代码。程序分析如下:
//函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
//输入:发送的缓冲区,发送数据个数
//输出:无
//功能描述:CC1100发送一组数据
void halRfSendPacket(INT8U *txBuffer, INT8U size)
{
halSpiWriteReg(CCxxx0_TXFIFO, size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);
//写入要发送的数据
halSpiStrobe(CCxxx0_STX);
//进入发送模式发送数据
// Wait for GDO0 to be set -> sync transmitted
while (!GDO0);
// Wait for GDO0 to be cleared -> end of packet
while (GDO0);
halSpiStrobe(CCxxx0_SFTX);
}
void setRxMode(void)
{
halSpiStrobe(CCxxx0_SRX);
//进入接收状态
}
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
{
INT8U status[2];
INT8U packetLength;
INT8U i=(*length)*4;
// 具体多少要根据datarate和length来决定
halSpiStrobe(CCxxx0_SRX);
//进入接收状态
delay(2);
while (GDO0)
{
delay(2);
--i;
if(i<1)
return 0;
}
if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO))
//如果接的字节数不为0
{
packetLength = halSpiReadReg(CCxxx0_RXFIFO);
//读出第一个字节,此字节为该帧数据长度
if (packetLength <= *length)
//如果所要的有效数据长度小于等于接收到的数据包的长度
{ halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength);
//读出所有接收到的数据
*length = packetLength;
//把接收数据长度的修改为当前数据的长度
// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);
//读出CRC校验位
halSpiStrobe(CCxxx0_SFRX);
//清洗接收缓冲区
return (status[1] & CRC_OK);
//如果校验成功返回接收成功
}
else
{
*length = packetLength;
halSpiStrobe(CCxxx0_SFRX);
//清洗接收缓冲区
return 0;
}
}
else
return 0;
}
在模拟水库监测系统的设计中,由于系统所涉及面广,需要解决的问题就相对比较多,自然会出现不少误差,干扰等情况,影响系统的操作。这些误差干扰主要来自一下几个方面。
(1) 环境和自身性能的影响
由于系统硬件设计中所用到的流量传感器,超声波传感器,CC1100模块等都是比较精密的器件,水流量过大,室内温度过高,或者外界电磁波的干扰等都会影响这些器件的正常工作。比如CC1100模块,假如在其工作的环境中有不协调的磁频电波,就会严重影响系统的无线通讯,使上位端收集的信号产生误码,导致所监测值与水库的实际情况不相符,会导致严重后果。所以在使用CC1100无线模块前,必须使用场强仪对现场环境进行电测,使无线发送信号避开外界的干扰频率。根据系统的实际要求,要选择适合CC1100无线模块无线收发的频率,以减少误差。还有部分元器件自身性能存在不足,如对步进电机的控制,步进电机计算步数时,由于不可避免的自身因素干扰,导致所测量的值往往出现偏差。
(2) 脉冲干扰
下位机端,将采集到的数据信号处理好,通过单片机编译分析后,控制步进电机运转。在这个过程中,步进电机接收到的控制信号是以脉冲形式发出的,很容易引起脉冲干扰。为此,必须在单片机和电机驱动芯片LM298间加入光耦电路,隔离驱动电路和单片机,来减少因脉冲而带来的干扰。
(3) 无线通讯距离的影响
本系统中,CC1100模块的作用距离可达1.2公里,但由于信号波在传播介质中受空气热对流扰动以及尘埃吸收的影响,接收回的幅值随传播距离的增加成指数规律的衰减,使得远距离回波检测误差较大。特别是对接收信号的起始阶段影响较大,增加了检测数据信号起始点的难度。由于基于CC1100无线模块的开发板是固定的,无发再加入运算放大器来缓解干扰,为了控制精度,该系统的无线传输距离实际上是非常有限的。
(4) 测量的随机性
干扰信号多呈毛刺状,作用时间短且具有随机性。对于一次监测的结果,其受到干扰信号影响的几率比较大,可能造成监测结果具有较大的误差。对于这些干扰所造成的影响,本文采用求平均值的方法解决:即连续监测多次,去掉监测结果中的最大值和最小值,再对其余监测结果求平均值,将其作为最终的监测结果,用于分析,这样就减少了随机干扰对监测结果造成的影响。
例如在本系统中,超声波采集水位时,需要测的是开始发射到接收到信号的时间差,测量方法是将测量所得的时间差,乘以314,再除以2,结果就是要检测的水位值。在这个过程中,需要检测的有效信号为反射物反射的回波信号,故要尽量避免检测到余波信号,这就要求对接收头收到的波束进行处理,这也是超声波检测中存在最小测量盲区的主要原因。除此之外,还可以通过软件来处理余波信号。当反射头发出脉冲,计时器同时开始记时;在记时器开始记时后再开启检测回波信号,来减少余波信号的干扰,等待的时间可以为1MS左右。等待时间越精确,最小测量盲区就越少,以此来得到更精确的水库水位信息。
电路板设计是从电路原理图变成一个具体产品的必经之路,电路板设计的合理性与产品的生产及质量密切相关。在本课题中,系统牵涉的硬件设计非常多,画图时,硬件布局和走线非常重要,图画的好,画的简便,硬件调试工作就能很容易地进行,系统性能也会提升。因此,必须解决抗干扰问题,在系统电路板的设计过程中,主要采用了以下的抗干扰措施。
(1) 电路板的抗干扰措施
为增加系统抗电磁干扰能力应该采取以下措施:
① 选用时钟频率低的微控制器。只要控制器性能能够满足要求,时钟频率越低越好,低的时钟可以有效降低噪声和提高系统的抗干扰能力。
② 减小信号传输中的畸变。当高速信号(信号频率高、上升沿和下降沿快的信号)在铜膜线上传输,由于铜膜线电感和电容的影响,会使信号发生畸变,当畸变过大时,就会使系统工作不可靠。一般要求,信号在电路板上传输的铜膜线越短越好,过孔数目越少越好。典型值:长度不超过25cm,过孔数不超过2个。
③ 减小来自电源的噪声。电源向系统提供能源的同时,也将其噪声加到所供电的系统中,系统中的复位、中断以及其它一些控制信号最易受外界噪声的干扰,所以,应该适当增加滤波电容来滤掉这些来自电源的噪声。
④ 元件布置要合理分区。元件在电路板上排列的位置要充分考虑抗电磁干扰问题。原则之一就是各个元器件之间的铜膜线要尽量的短,在布局上,要把模拟电路、数字电路和产生大噪声的电路(继电器、大电流开关等)合理分开,使它们相互间的信号耦合最小。
⑤ 处理好地线。将模拟地、数字地、大功率器件地分开连接,再汇集到电源的接地点。对噪声和干扰非常敏感的电路或高频噪声特别严重的电路应该用金属屏蔽罩屏蔽。
⑥ 去耦电容。去耦电容以瓷片电容或多层陶瓷电容的高频特性较好,设计电路板时,集成电路的电源和地线之间都要加一个去耦电容。去耦电容有两个作用,一方面是集成电路的蓄能电容,提供和吸收该集成电路开门和关门瞬间的充放电电能,另一方面旁路掉该器件产生的高频噪声,一般情况下,选择0.01uF-0.1uF 的电容都可以。一般要求每10 片左右的集成电路增加一个10uF 的充放电电容。另外在电源端、电路板的四角等位置应该跨接一个10-100uF 的电容。
(2) 应刷电路板的地线布置
合理接地是系统抑制干扰的重要方法之一。印刷线路板(PCB)的地线主要指TTL,CMOS 集成电路的接地线。印刷板中的地线应成网状,而且,其它布线不要形成环路,特别是外周若形成环路,将产生较大的噪声干扰。印刷电路板上的接地线,根据电流通路最好逐渐加宽。使用了大规模集成电路芯片的电路板,要让芯片跨越平行的地线和电源线,这样可以减少干扰。另外,在数字、模拟混合电路板中,同时存在数字地和模拟地。为了不产生相互串扰,在PCB制板布局时,要尽量将数字电路与模拟电路分开,最后选择一点连通。
因为该水库监测系统基本上是在高频环境下运行,所以设计PCB时,制作好的PCB图必须铺成网格形式,板的四周还需加上四个大焊孔,这样就可以避免一些来自板面的内在干扰,使硬件部分稳定。
首先,必须要将程序调试成功,这是关键的一步,没有内核的调用无法实现系统功能,单纯的硬件无法实现电路的录放。因此,程序的编译就变的特别重要,设计中注重软件的编译仿真,其中采用Keil C51 软件编辑、编译、仿真。对于各个模块,进行一个个子程序分别调试。采用单步运行方式和断点运行方式,通过检查用户系统CPU的现场、RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求。通过检测,可以发现程序中的死循环错误、机器码错误及转移地址的错误,同时也可以发现用户系统中的硬件故障、软件算法及硬件设计错误。在这阶段发生过的故障包括子程序在运行时破坏现场,缓冲单元发生冲突,零位的建立和清除在设计上有失误,堆栈区域有溢出等问题。
单步和断点调试后,再进行连续调试,这是因为单步运行只能验证程序的正确与否,而不能确定定时精度、CPU的实时响应等问题。待全部完成后,应反复运行多次观察。
Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编、PLM 语言和C 语言的程序设计。
程序编译、调试的基本过程如下:
(1) 建立一个新的工程文件New Project。
(2) 保存文件,选择保存路径,输入工程文件的名字。
(3) 选择设计使用的单片机的型号。
(4) 建立一个新的源程序文件。
(5) 在弹出的程序文本框中输入设计的程序,然后以后缀扩展名为.asm 保存。
(6) 回到编辑界面后,用右键单击Sourece Group 1,在弹出的快捷菜单中选择Add Files to Group’Sourece Group 1’选项,选择设计汇编文件。
(7) 然后对目标进行一些设置,在Options for Target’ Target 1’中进行相应参数的设置。
(8) 编译程序,选择【Project】/【Rebuild all target files 】选项,开始编译程序。
(9) 编译完毕后,选择【Debug】/【Start/Stop Debug Session】 选项,进入仿真环境。
在调试程序过程中,并不是一次性成功的,编辑中出现过好几次错误,经过修改、编译才最后调试成功的。最初调试时,出现采集部分的定义错误,即系统重复定义,经过认真仔细的查找,在程序中对其进行了两次定义,使得程序无法调试成功。
编译成功后,在上面的第(9)步的仿真也是非常重要的,进行检测编译好的程序能否实现硬件电路功能,是否能够实现数据的采集与传送等功能,如果不能实现要继续编写,检查什么地方的功能不能实现等等,反反复复地编辑、调试,直至功能得以实现。程序的编译、调试的工作量比较大,是设计的灵魂,所以在系统的设计中占用了很多时间,要对单片机语言进行深入而细致的学习与思考,它的中断/定时、上电、延时以及数据的写入等等软件设计调试,从而成为设计的重中之重。
其次,将编译调试好的程序下载到单片机中,进行硬件系统的调试,实现设计功能。由于CC1100无线模块占用的单片机存储量非常大,所以下载前需要检测,在CC1100模块中加入采集信号后的编译程序是否超过单片机的容量,AT89S52的容量是256K,如果超过,就难以生成工程文件。在该系统中,采集程序,步进电机控制程序,CC1100源代码,串口通讯程序等都用到了全局变量,占用空间很大,所以要特别注意。
在对系统采集部分进行调试时,要特别注意传感器的工作频段和电压。在模拟水库和传感器之间必须加入一个比较器,控制电压,使传感器能稳定地采集水库信息,减少误差。当接收到的采集数据经单片机处理后,能在数码管上稳定准确地显示时,证明采集部分已经调试成功。
(1) 脱机调试
在电路板加电之前,先用万用表等工具,根据硬件电路原理图仔细检查电路板线路的正确性,并核对元器件的型号、规格和安装是否符合要求。应特别注意电源的走线,防止电源之间的短路和极性错误,并重点检查扩展系统总线是否存在相互间的短路;或其它信号线的短路。
对于电路板所用的电源事先必须单独调试,调试好后,检查其电压值、负载能力、极性等均符合要求,才能加到电路系统上。在不插芯片的情况下,加电检查各插件上引脚的电位,仔细测量各地点电位是否正常,尤其应注意单片机插座上的各点电位是否正常。
(2) 联机调试
通过脱机调试可排除一些明显的硬件故障。有些硬件故障还是要通过联机调试才能发现和排除。
联机前先断电,检查一下电源、接地是否良好。一切正常,即可打开电源。通电后执行读写指令,对存储器、I/O端口进行读写操作、逻辑检查,若有故障,可用示波器观察波形(如输出波形、读写控制信号、地址数据波形以及有关控制电平)。通过对波形的观察分析,寻找故障原因,并进一步排除故障。可能的故障有:线路连接上有逻辑错误、有断路或短路现象、集成电路失效等。
在单片机电路板调试好后,再接上识别路径电路部分,再对这些部分进行初步调试。本系统中,主要是对水库采集部分的硬件调试,基于单片机控制的步进电机驱动电路的硬件调试,以及上位机端串口通讯部分的调试。
在硬件和软件调试完成后,再结合到一起,即把软件程序烧录到单片机,再将单片机放到系统板上,上电运行。对不完善的地方再进行进一步的修改处理,直到最后达到整个预期为至。在整体调试中,最难调的就是CC1100无线通讯和上下位机串口通讯的通讯。在调试CC1100无线模块时,接收到的信号常受到干扰,这可能与CC1100无线模块的性能有关。调试成功后,无线模块与单片机连接时,还需要编译源代码SPI模拟接口,因为AT89S52上没有SPI接口。之后耐心调试串口通讯程序,实现上下位机间的串口通讯,将数据传送到上位机上进行监测分析。
上图为本系统上位机端的出口调试结果图,从图中看出,系统实时跟踪监测出了模拟水库的水位、流量,达到了本课题的设计要求。数据用16进制的形式表现出来。
开发模拟水库自动远程监测系统,不仅能带来人力、物力的节约,更能及时、实时地了解水文数据,以利于对防洪、抗洪、抢险、救灾或供水供电工作的指挥决策,使水库在国民经济发展中发挥更重要的作用。
本系统对模拟水库的水位和流量的测量值基本达到课题设计要求,其所测量的技术参数和误差精度以表格形式表示出来,如下:
测量参数
|
设定值
|
第一次测量值
|
第二次测量值
|
第三次测量值
|
平均测量值
|
测量误差
|
水位
|
90.000mm
|
89.827mm
|
89.798mm
|
89.821mm
|
89.815mm
|
0.185mm
|
流量
|
6.000L/min
|
5.891L/min
|
5.894L/min
|
5.897L/min
|
5.894L/min
|
0.106L/min
|
从图表中可以看出,该系统测得的实际参数的误差非常小,精确度极高。若经过相应地改进,完全可以将其投入到实际应用当中去,很直观地证明了本系统潜在的巨大研究价值和实效性。因此,可以肯定,结合先进的无线网络监控管理系统的水文监测将会是未来水文监测控制管理的必然趋势。
(1) 该系统设计的主PCB图如下:
(2) 流量传感器的采集程序
#include "reg52.h"
float Flow =0;
unsigned char Counter1 =0;
////////////////////////////////////
void Flow_Cheack(void)
{
Counter1 =0;
Counter1 =(TH0*256 +TL0)/2;
TH0 =0x0;
TL0 =0x0;
TR0 =1;
ET0 =1;
//Flow =Counter1;
if(Counter1 <15) Flow =Counter1 *0.138;
else
{
if(Counter1 <32) Flow =Counter1 *0.129;
else
{
if(Counter1 <48) Flow =Counter1 *0.125;
else
{
if(Counter1 <65) Flow =Counter1 *0.123;
else
{
Flow =Counter1 *0.1234;}}}}}
(3) 数码管显示程序
#include <reg52.h> //包含51单片机的头文件
#define uint unsigned int
#define uchar unsigned char
#define DataPort P0
#define BitPort P2
unsigned char code LED7Code[]={
0xC0,// 0
0xF9,// 1
0xA4,// 2
0xB0,// 3
0x99,// 4
0x92,// 5
0x82,// 6
0xF8,// 7
0x80,// 8
0x90,// 9
0x88,// A
0x83,// B
0xC6,// C
0xA1,// D
0x86,// E
0x8E,// F
0x89,// H
0xc7,// L
0xc1// U}
uchar DisplayDatas[4] =0;
uchar KeyData =0;
void LedDisplay_Scan(uchar Kind);
void Display_Delay(uchar Delay);
///////////////////////////////////////动态扫描
void LedDisplay_Scan(uchar Kind)
{
P2 |=0xf0;
P2 &=0xef;
if(Kind) P0 = LED7Code[ DisplayDatas[3] ]; //扫描第一位
else P0 =LED7Code[KeyData%10];
Display_Delay(1);
P2 |=0x10;
P2 &=0xdf;
if(Kind) P0 = LED7Code[ DisplayDatas[2] ]&0x7f;
else P0 =LED7Code[(KeyData/10)% 10];//&0x7f;
Display_Delay(1);
P2 |=0x20;
P2 &=0xbf;
if(Kind) P0 = LED7Code[ DisplayDatas[1] ];//&0x7f;
else P0 =LED7Code[(KeyData/100)% 10];
Display_Delay(1);
P2 |=0x40;
P2 &=0x7f;
if(Kind) P0 = LED7Code[ DisplayDatas[0] ];
elseP0 =LED7Code[(KeyData/1000)% 10];
Display_Delay(1);
P2 |=0x80;
}
//////////////////////////////////////////
void Display_Delay(uchar Delay)
{
uchar i;
for(;Delay>0;Delay--)
{
for(i=100;i>0;i--);}}
(4) 步进电机控制程序
本系统中,通过AT89S52单片机控制步进电机运转,只需要利用步进电机的正反转功能来模拟阀门的开/关。程序如下:
#include<reg52.h>
#define uchar unsigned char
#define TURE 1
uchar code MOTO[4]={0x33,0xa6,0xcc,0x59};
uchar status=0;
void delay(void)
{unsigned int i;
for (i=0;i<=450;i++);}
//电机反转
void fanzhuan(void)
{status--;
if (status==255)
{ status=3;}
status%=4;
P0=MOTO[status];
delay(); }
//电机正转
void zhengzhuan(void)
{status++;
status%=4;
P0=MOTO[status];
delay();}
void main(void)
{uchar dp1;
P0=MOTO[status];
while(1){dp1=P1;
dp1=dp1&0x03; zhengzhuan();}}
(5) 串口通讯程序
通过MX232连接上位机实现串口通讯,利用串口通讯传送数据到上位机上,上位机能对由CC1100模块所发送过来的数据进行监测分析。串口通讯程序如下:
/********************************************************************
//功能描述 : 串口波特率为115200
//其他说明 : 22.1184MHz晶振
//芯片型号 : AT89S52
********************************************************************/
#include <reg52.h> //包含51单片机的头文件
#define uint unsigned int
#define uchar unsigned char
/* 串口通讯接口定义
RXD-------P3.0 数据接收端
TXD-------P3.1 数据发送端
*/
uchar SendBusy =0x00;
uchar ReceiveData[5] ={0x00};
uchar Receive_Number =0;
uchar Receive_Flag =0;
/////////////////////////////////
void InitUart(void);
/*========================================================================
//函 数 名: void InitUart(void)
//参 数: 无
//返 回 值: 无
//函数功能: 串口初始化函数
=======================================================================*/
void InitUart(void)
{ TMOD|=0x20;
SCON=0x50;
PCON|=0x80;
//TH1=0xff;//115200
//TL1=0xff;
TH1=0xf4;//9600
TL1=0xf4;
TR1=1;
ES=1;
EA=1;}
/*=======================================================================
//函 数 名: void Uart_Send_Byte(uchar Data)
//参 数: uchar Data
//返 回 值: 无
//函数功能: 串口发送一个字节函数
=======================================================================*/
void Uart_Send_Byte(uchar Data)
{ while(SendBusy !=0 );
SBUF = Data;
SendBusy =0xff;}
/*=====================================================================
//函 数 名: void uart(void) interrupt 4
//参 数: 无
//返 回 值: 无
//函数功能: 串口中断处理函数
======================================================================*/
//uart interrupt
void uart(void) interrupt 4
{ if(RI)
{ RI=0;
if(Receive_Number <5)
{ ReceiveData[Receive_Number++] =SBUF;
if(Receive_Number ==3)
{ if((ReceiveData[0] >0x05))
{ Receive_Number =0;}
else
{ Receive_Flag =1;
Receive_Number =0;}}}}
else
{ TI=0;SendBusy =0;}}
(6) VC界面和部分编译程序
VC界面如下,用来监视水库的水位和流量。
VC部分显示程序如下:
// UARTDrawDlg.cpp : implementation file
#include "stdafx.h"
#include "UARTDraw.h"
#include "UARTDrawDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUARTDrawDlg dialog
CUARTDrawDlg::CUARTDrawDlg(CWnd* pParent /*=NULL*/)
: CDialog(CUARTDrawDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CUARTDrawDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CUARTDrawDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUARTDrawDlg)
DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUARTDrawDlg, CDialog)
//{{AFX_MSG_MAP(CUARTDrawDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton_Start)
ON_BN_CLICKED(IDC_BUTTON2, OnButton_Pause)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUARTDrawDlg message handlers
BOOL CUARTDrawDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
// TODO: Add extra initialization here
//@@@+{
m_ctrlComm.SetCommPort(1);//选择COM1
m_ctrlComm.SetInputMode(1);//输入方式为二进制方式
//m_ctrlComm.SetInBufferCount(1024);//设置输入缓冲区大小
//m_ctrlComm.SetOutBufferCount(512);//设置输出缓冲区大小
m_ctrlComm.SetSettings("9600,n,8,1");//波特率115200,无校验,8位数据位,1位停止位
if(!m_ctrlComm.GetPortOpen())//判断串口是否已打开
m_ctrlComm.SetPortOpen(TRUE);//打开串口
m_ctrlComm.SetRThreshold(2);//串口接收到一个数据后引发事件
m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
//@@@+}
//@@@+{
RECT rect={10,20,452,355};
m_OScopeCtrl.Create(WS_VISIBLE | WS_CHILD, rect, this);//创建一个波形框
m_OScopeCtrl.SetRange(0, 255, 0);//设置纵坐标范围
m_OScopeCtrl.SetYUnits("水位");//设置纵坐标字符
m_OScopeCtrl.SetXUnits("时间");//设置横坐标字符
m_OScopeCtrl.SetBackgroundColor(RGB(7, 80, 133));//设置背景颜色
m_OScopeCtrl.SetGridColor(RGB(3, 172, 186));//设置格子颜色
m_OScopeCtrl.SetPlotColor(RGB(255, 255, 255));//设置波形颜色
UpdateData(FALSE);
//@@@+}
return TRUE; // return TRUE unless you set the focus to a control
}
void CUARTDrawDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CUARTDrawDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CUARTDrawDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BEGIN_EVENTSINK_MAP(CUARTDrawDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CUARTDrawDlg)
ON_EVENT(CUARTDrawDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
/*********************************************************************/
unsigned char g_ucRxFlag=1;//@@@+
/*********************************************************************/
//@@@+{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE bt;
BYTE rxdata[1024];//设置BYTE数组
CString strtemp;
void CUARTDrawDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
if(m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput();//读缓冲区
safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();//得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++)//将数组转换为Cstring型变量
{
bt=*(char*)(rxdata+k);//字符型
if(!g_ucRxFlag)
return ;
//在这里加入处理程序__yzhq
m_OScopeCtrl.AppendPoint(bt);}}}
/*********************************************************************/
void CUARTDrawDlg::OnButton_Start() //开始按钮
{
// TODO: Add your control notification handler code here
g_ucRxFlag=1;
}
void CUARTDrawDlg::OnButton_Pause() //暂停按钮
{
// TODO: Add your control notification handler code here
g_ucRxFlag=0;
}
//@@@+}
/********************************************************************/
|