资源描述
温度检测系统的设计
作 者 姓 名:
学 科 专 业: 应用电子技术
指 导 老 师:
班 级 学 号: 2007154801
完 成 日 期: 2010-12-18
设 计 任 务 书
题 目: 智能温控风扇的设计
设 计 日 期:
发题日期: 2010年12月03日
完成日期: 2010年12月18日
设 计 者:
班 级 电气01
学 号 2007
姓 名
指导教师 李
诚信申明
本人申明:
本人所提交的毕业设计(论文)《智能温控风扇的设计》的所有材料是本人在指导教师指导下独立研究、写作、完成的成果,设计(论文)中所引用他人的无论以何种方式发布的文字、研究成果,均在设计(论文)中加以说明;有关教师、同学和其他人员对我的设计(论文)的写作、修订提出过并为我在设计(论文)中加以采纳的意见、建议,均已在我的致谢辞中加以说明并深致谢意。
本设计(论文)和资料若有不实之处,本人承担一切相关责任。
特此申明。
本人签名:
2010年06月12日
指导教师评语:
指导教师(签名):
年 月 日
评阅教师评语:
评阅教师(签名):
年 月 日
I
目 录
- 1 -第一章 绪论 1
1.1 课题的意义 1
1.2 系统概述 1
第二章 系统硬件介绍 3
2.1 主控单片机的选择 3
2.2 热电阻测量模块 4
2.3 A/D转换模块 5
2.4 实时时钟模块 6
2.5 通信部分 6
2.6 电源模块 7
2.7 显示模块 8
第三章 系统软件设计 9
3.1 仿真器介绍 9
3.2 开发平台介绍 10
3.3 主程序部分 11
3.4 温度采集程序部分 12
3.5 读时钟程序部分 16
3.6 显示程序部分 17
3.7 通信程序部分 19
3.7.1 时钟校准部分 19
3.7.2 温度数据上传部分 22
第四章 系统调试 24
4.1 温度采集部分出现的问题及解决方法 24
4.1.1 A/D值不准确的发现解决方法 24
4.1.2 温度值有0.1℃的漂移的问题和解决方法 24
4.2 时钟部分出现的问题及解决方法 25
4.3 通信部分出现的问题及解决方法 25
结 论 26
致 谢 26
摘 要
本课题设计了一种具有多个测点的高精度、宽量程的智能温度测量应用系统。该系统运用性能价格比较好的热电阻PT100 作为温度传感器,运用测量电桥作为信号的获取电路,信号调理电路的首级放大采用高性能通用放大器TLC27L4进行差分放大 ,信号的转换采用串行接口的12 位A/D 转换MCP3204,系统的CPU 采用目前低价位但技术十分成熟的SM8952 ,仪器的LED 数码管显示/驱动芯片采用接口简单但功能强大的74HC595 ,同时系统还设计了RS485 总线的通信接口电路,并提供了开放的协议,最后,运用最新的单片开关电源芯片设计了系统用电源。为克服2 线制带来的线路电阻误差,PT100 的对外接线采用3线制方式;为节约系统的硬件成本,对8 路的温度差分信号采用多路模拟开关的切换;为提高系统的抗干扰性能,温度的检测采用了数字滤波算法;为提高测量的精度并减少存储器的使用空间,软件算法上采用了分段拟合的方法,然后通过生成的温度——A/D值关系来计算温度值。
关键词:A/D转换器; 串行接口; 热电阻
第1章 绪论
1.1 课题的意义
随着电子技术、计算机技术、通信技术的迅速发展,工业测控领域采用先进的技术对现场的工业生产参数进行检测、监测是实现工业自动化的重要标志。据不完全统计,在工业生产中被监测最多的参数应该是压力、流量、温度这三大参数,无论在石油、化工、煤炭、水利等行业,还是电力、机械、航天、国防等部门,都离不开对这些参数的监测,当然除此之外,还有诸如液位、扭矩、密度、浓度、速度、位移、距离、电参量等众多物理参数的监测,但用的最多的恐怕还是温度的监测,可以说对温度的测量是个“永恒”的话题。
温度测量的领域十分广泛,其实,不仅在工业领域,而且在民用领域、军用领域,温度的测量随处可见。在工业领域,如电机的轴温,胶带滚筒的表面温度,工业冷却循环水温,加热设备的炉温,啤酒的麦芽发酵温度,各种化工原料在化学反应时控制的温度等等,在民用领域,超市的食品架内温度,人们生活空间环境的温度,空调的控制温度,人体的体温检测,冰箱、冰柜的温度测量等等。当然,不同的场合,对测温范围的要求不一,即使相同的测温范围,测量不同的对象,其测量的精度要求也不尽相同,这些是显而易见的,譬如,人体的体温测量,测量的精度应该要求比较高,达0 . 1 ℃ 左右,但在测量电机的轴温时,可能测量的允差达1 ℃ 以上。
当然,我们做任何一件物品,都是在满足要求的前提下,越简单越好,成本越低越好,作为工业、民用、军用等领域的测量,这个原则也不例外,但作为人类对客观事物的认识,从测量的角度,从误差的概念,从真值的理解来看,我们应该在一定的条件下尽量地将测量的精度提高。
尽管目前市场上针对温度测量的检测仪器不在少数,而且,其制作的水平无论在工艺还是在测量的精度上都不断的在提高,但要得到高精度、宽量程以及多通道的温度检测仪,价格都十分昂贵,本文的立足点是,运用比较常规的温度传感器以及价格低廉的电子元件构成低成本、高性能的智能系统。
1.2 系统概述
本系统是为北方的供暖锅炉设计的回水温度检测系统。在我国北方绝大部分地区冬天要靠供暖锅炉来解决供暖问题,在供暖锅炉车间需要知道从用户返回来的水的温度,从而对锅炉的运作进行相应的调整。本系统在锅炉车间安装了大的LED显示屏,用来给操作工人提供可以参考的信息。同时数据也可以传送给计算机,使得决策者可以不用到车间就能够知道锅炉的运作情况。
本设计软硬件均采用模块化结构设计,各个功能模块都独立设计,使系统的软硬件维护和调试非常便利。其系统结构框图如图1.1
图1.1 系统结构框图
新茂
SM8952
单片机
时钟系统
实时时钟
A/D转换部分
通信部分
传送温度值
显示部分
显示各路温度
和系统时间
热电阻检测
部分
电源部分
系统的功能为:用PT100与辅助测量电路将-40~100℃温度信号转换成0~5V的电压信号,12位A/D转换器将模拟信号转换成0~4095的数字信号,经过查表分段插值转换成温度,总计可以采集现场的8路温度,测得温度的精度可以达到0.1℃。通信模块部分将温度值通过RS485通信的方式上传给上位机。实时时钟模块能够为系统提供实时的时钟,并可以通过上位机对时钟进行校准。现场在LED显示屏模块可以显示实时时钟和8路温度值。
第2章 系统硬件介绍
2.1 主控单片机的选择
主控单片机我选用新茂的SM8952单片机。SM8952 单片机是内嵌8K 字节闪存的8 位单片微控制器它具有多达32 个I/O口,其8K的闪存既可作程序存储空间也可以作数据存储空间或程序数据混合空间这些硬件特征和其强大的指令系统使它应用于不同的场合因此是通用的和性能价格比高的控制器。该单片机还具有稳定性好,抗干扰等优点,非常适合本测温系统设计的使用。下面简单介绍一下该单片机的技术特性。如图2.1
· 工作电压4.5V 到5.5V
· 与通用80C51/80C52 家族完全兼容
· 每个机器周期为12 个时钟周期
· 8K 字节片上闪存
· 256 字节片上数据RAM
· 3 个16 位定时/计数器
· 具有4 个8 位I/O 口
· 全双工串口通道
· 位操作指令
· 页自由跳转
· 8 位无符号除运算
· 8 位无符合乘运算
· BCD 码运算
· 直接地址访问
· 间接地址访问
· 嵌套中断
· 两个中断优先级
· 1 个串行I/O 口
· 省电模式空闲模式和掉电模式 图2.1 SM8952单片机
· 工作时钟为25MHz
· 1 个看门狗定时器(WDT)
2.2 热电阻测量模块
我采用的是PT100作为温度传感器。铂电阻温度传感器的特点是:精度高,稳定性好,性能可靠。铂在氧化性环境中,甚至在高温下的物理和化学性质都非常稳定。因此铂被公认为是目前制造热电阻的最好材料。铂电阻主要作为标准电阻温度计使用,也常被用在工业测量中。此外,还被广泛地应用于温度的基准和标准的传递。铂电阻温度计是目前测温重复性最好的一种,它的长时间稳定的重复性可达K,优于其他所有温度计。目前铂电阻的纯度已经达到99.9995%。信号采集方式采用电桥。由于热电阻安装的地方距离测量模块比较远,当环境的温度变化时其连接导线电阻也要变化。因为它与热电阻Rt是串联的,也就是电桥臂的一部分,所以会造成测量误差。采用三线制接线方法就可以避免这种误差的产生。如图2.1。信号放大部分如图2.2。
C1
C2
2K
R2
2K
R1
D2
D1
120
R3
R4
RS1
RI1
RI2
图2.1 测量电桥电路
R7
R9
R10
Res2
R5
R6
R8
R3
R4
R1
C2
C3
C4
C1
R2
CH0
图2.2 信号放大电路
2.3 A/D转换模块
A/D转换我采用Microchip公司的MCP3204芯片。 Microchip公司推出的MCP3204芯片是带有采样保持电路的逐次逼近型(SRA)12位精度A/D转换器。MCP3204可以编程配置为2路伪差分输入偏置或4路单端输入。其差分非线性度(DNL)和整体非线性度(INL)为±1LSB。芯片的通信接口为SPI接口。MCP3204的最大转换速率为200ksps。芯片采用宽电压(2.7~5.5V)、低静态电流(500nA)设计,工作电流仅为320A。由于我们所要测量的温度为0~100℃,精度要求为0.1℃。所以MCP3204的12位精度足以满足系统的要求。该芯片的参考电压选择+5V。该芯片的外围电路如图2.3。
VDD
VREF
AGND
CLK
DOUT
DIN
CD/SHDN
CH0
CH1
CH2
CH3
NC
NC
DGND
MCP3204
R1
VCC
P25
P24
P23
P34
图2.3 MCP3204外围电路
2.4 实时时钟模块
系统的时钟模块我采用美国DALLAS公司的DS1302作为时钟芯片。DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个 31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。我在系统的设计上为DS1302设计了一个可充电的锂电池作为系统掉电时的时钟保持电源。时钟模块的电路设计如图2.4
VCC2
OSC
OSC
GND
VCC1
CLK
IO
RST
DS1302
DS1302
P25
P24
P33
VCC
1
2
32768
R1
BT
VCC
D1
1N4148
图2.4 DS1302外围电路
2.5 通信部分
本系统采用RS-485通信方式,接口芯片选择MAX487。MAX487是MAXIM公司生产的用于RS-485和RS—422通信的差分总线小功率收发器,它含有一个驱动器和一个接收器,具有驱动器/接收器使能功能,输入阻抗为1/4负载(≥48kW),节点数为128,即每个MAX487的驱动器可驱动128个标准负载。MAX487的驱动器设计成限斜率方式,使输出信号边沿不至于过陡,以避免在传输线产生过多的高频分量,从而有效扼制了干扰现象。MAX487的接收灵敏度为±200mV,即接收端的差分电压≥+200MV时,接收器输出为高电平,≤-200mV时接收器输出为低电平,介于±200MV之间时接收器输出为不确定状态,因此,一旦某个节点的接收器在总线空闲、传输线开路或短路时产生低电平,将使串行接收器找不到起始位,从而引起通信异常,为此,本系统在硬件上作了处理:将MAX487的A、B输出端加接上拉、下拉电阻,保证在发出有效数据时所有接收器能接收到完整的数据。
MAX487的数据传输速率为0.25Mbps,静态工作电流为120μA,5V单电源工作,在本系统中,MAX487采用半双工通信方式,各节点间的通信通过一对双绞线作为传输介质,因双绞线的特性阻抗为120Ω,因此系统在MAX487的始端和末端各接一个120Ω电阻以减少线路上传输信号的反射。由于主机与分机相隔较远,而分机系统上电或复位又常常不在同一时刻完成,如在此时某个MAX487处于发送状态,将占用通信总线而使其它分机无法与主机进行通信,本系统在SM8952的P3.5口与MAX487的DE端之间加接光耦TIL817,保证了系统上电复位时MAX487的DE端为“0”,有效解决了这个问题。 通信模块的电路设计如图2.5。
图2.5 通信模块的电路
2.6 电源模块
由于系统对电源的稳定性要求很高,所以我们在设计的时候把模拟和数字电源分开设计,这样模拟电源和数字电源之间就不存在干扰的问题了。系统输入为+12V的直流电源,而系统需要的工作电压为+5V和+6.2V的直流电压,稳压芯片我们选择LM7805和LM7806,对于6.2V的电压,我们用LM7806芯片,然后在其参考端反接一个1N4148来提升0.2V的电压。电源模块的电路设计如图2.6.
图2.6 电源部分电路
2.7 显示模块
本模块采用串入并出74HC595通过级联实现,本设计采用LED实现,其中8段数码管用了47个,16段彩色数码管14个。我利用彩色数码管显示单位,如:年,月,日,时,分,秒,被测点序号。这样就解决了8段数码管所存在显示信息量少的问题。同时,采用了47片74HC595级联,实现了8个数码管显示,采用74HC595,数据线通过SDAT输入时钟,通过一个SCLK信号,47片74HC95达到了时钟同步,同理,HOLD信号使47片74HC595同步锁存输出,采用74HC595,节省了CPU的口线,同时又避开了动态扫描带来的定时扫描问题。显示模块设计的原理如图2.7。
图2.7 显示原理图
第3章 系统软件设计
3.1 仿真器介绍
我选用南京万利公司的AE-52仿真器,该仿真器具备如下特点:
·支持多达64K 的仿真程序存储器和64K的仿真数据存储器
·程序和数据映像存储器支持程序和数据存储空间任意选择
·192K 的程序地址断点,完全实时在线仿真用户程序
·外部信号断点和子程序(函数)返回断点
·独有的实时程序运行轨迹功能
·仿真频率范围0-33MHz
·完美的仿真电路设计,不占用其它任何用户资源
·电源、通讯及所有I/O口均设有保护电路
·打印口并行高速通讯,能够打开更多的窗口
·AE-52支持80C51系列标准产品: 80C31/32,8XC51,8XC52,8XC54,8XC58
3.2 开发平台介绍
我采用南京万利公司的Medwin集成开发环境来开发本系统,由于Medwin没有C编译器,所以要外挂KEIL的C编译器。
KEIL51是德国KEIL公司开发的单片机C语言编译器,其前身是FRANKLIN C51,现在的最新版本V7功能已经相当不错,特别是兼容ANSI C后又增加很多与硬件密切相关的编译特性,使得在8051系列单片机上开发应用程序更为方便和快捷。u Vision2是一种集成化的文件管理编译环境,本设计使用的编译环境KEIL51,集成了文件编辑处理、编译链接、项目管理、窗口、工具管理和软件仿真调试等多种功能,是相当大的C51开发工具。在Medwin的仿真功能中,有两种仿真模式:软件模拟方式和目标板调试方式。在软件模拟方式下,不需要任何8051单片机硬件即可完成用户程序仿真调试,极大地提高了用户程序开发效率。在目标板调试方式下,用户可以将程序装到自己的8051单片机系统版上,利用8051的串口与PC机进行通信来实现用户程序的实时在线仿真。
Medwin是万利电子有限公司关于8051系列MCU的开发工具,可以用来编译C源码、汇编源程序、连接和重定位目标文件和库文件、创建HEX文件、调试目标程序等。Medwin提供了一个多功能的文件操作环境,它包含一个标准的Windows文件编辑器,具有十分强大的文件编辑功能,例如文件的移动、剪切、拷贝、查找、删除等。它支持鼠标操作,也有快捷键。编辑器中不仅有许多预定义热键,而且用户还可以根据自己的喜好对热键进行重定义。在Medwin中,用户可以同时打开多个窗口,对多个不同的文件进行处理,这一特性有利于使用C51进行结构化的多模块程序设计。在模块化编程时,如果同时打开多个不同文件,可以在Medwin中对他们分别进行编辑处理。文件编辑完成后,可以直接在环境下进行编译连接。如果编译连接过程中发现错误,将自动弹出错误窗口并显示出相应的错误信息。用鼠标左键双击错误信息,将自动跳转产生错误的文件位置,以便可以容易地修改程序文件中的错误。
3.3 主程序部分
本设计的主程序部分我主要分为四个部分,即温度采集部分、时钟部分、显示部分、以及通信部分。
温度采集部分,我们主要是将PT100采集上来的模拟信号通过A/D转换,滤波,查表,插值等方法转换成具体的温度值。我们采用MCP3204作为A/D转换芯片。该部分开始时,首先通过CD4051选择相应的采集通道,然后读出A/D值,0~5V对应0~4095。将A/D值滤波,最后取得一个满意的A/D值,通过处理得出具体温度,然后判断是否8路温度都已采集完毕,如果没完继续,将CD4051的通道切换到下一个,注意此时一定要有一定的延时,使CD4051有足够的时间进行通道切换,然后重复温度的采集。
时钟部分,主要包括读时钟和校准时钟两部分,当串口接收到上位机发送的校准数据以后,就将校准标志位置位( 为‘1’),然后在主程序中执行校准程序。读时种部分采用单字节读取模式,每次读出一个字节,由于读出的时间值是以BCD码的形式表示的,所以读出时间值以后将BCD码转换成十进制数,以方便后面的显示码转换程序。
显示部分,主要是将温度值和时间值在现场的LED显示屏上显示出来。由于硬件设计的原因,温度值显示码对照表和时间显示码对照表是单独建立的,所以要分开进行显示码的转换,把各个显示码保存在相应的存储单元。由于显示接口芯片采用74HC595,所以占用I/O线只有三根,一条数据线,一条时钟线,一条显示允许线。最后通过74HC595将所有的显示码送LED显示屏显示。
数据上传部分,主要是将测得的各个温度传送给上位机。我们采用RS485通信。首先将温度值编码,每一桢数据都包括起始字节、通道号字节、十位字节、个位字节、小数字节、校验字节及停止字节。校验字节我们采用和校验的方式。每测量出一路温度值就将温度发送给上位机。
主程序流程图如图3.1所示
Y
开始
系统初始化
时钟校准标志=1?
时钟校准
温度采集并上传
T0定时中断到
温度采集标志=1?
将温度转换成显示码
读DS1302时间
将时间转换成显示码
将所有显示码显示
改变运行灯状态
N
N
Y
图3.1 主程序流程图
3.4 温度采集程序部分
在温度采集程序部分我采用定时采集的方式,因为过快的采集频率会使采集的温度发生漂移,从而使系统的测量精度降低。我们设置T0工作在方式1,由于我采用11.0592MHz的晶体震荡器,所以其最大的定时时间约为71.1ms。这里我们设定每次定时溢出时间为最大71.1ms,所以其计数初值十进制为0。这样我只要在定时中断程序中置一个定时中断标志,然后在主程序中查询标志位的状态,如果标志位置位(为‘1’)则进行温度的采集并把定时器关闭,然后在采集结束的时候把定时器再打开,这样就可以保证在执行温度采集程序的时候不会有定时中断发生从而防止程序的跑飞。当进入温度采集程序后,首先通过CD4051进行采集通道的切换,CD4051的操作程序流程图如图3.2所示。然后再读出MCP3204中的A/D值,由于我们只用了一个MCP3204的通道所以就不进行MCP3204的通道切换。A/D转换结束我们采用加权滤波的方式,实践证明在本系统中这种滤波是最有效的。我们取8次A/D值进行加权。最后得出一个比较满意的A/D值。然后通过查表和线性插值转换成实际的温度值,采用这种温度转换方式的优点是:不用A/D值与电阻值对应,再用电阻值与温度对应的方法,可以减少运算时间大大提高程序执行的速度,另外分段线性化可以减少由于硬件电路的非线性带来的温度误差,当硬件的零点漂移的时候只需调整线性表就可以重新进行校准。A/D值与温度的对照如表3.1所示。其程序流程图如图3.3所示。
MCP3204的操作时序为:与MCP3204的通信可以利用标准的SPI兼容串行接口来实现。通过将CS线拉低可以启用与器件的通信。如果器件已上电而CS引脚为低,则要将其拉高再拉低以启动通信。接受到第一个时钟并且CS为低DIN高时,将构成一个开始位。开始位之后跟随的是/DIFF位,它决定转换是采用单端还是差分输入模式进行。接下来的三位(D0、D1、D2)用于选择输入通道的配置。在接收到开始位以后,器件将在时钟的第四个上升沿开始对模拟输入进行采样。采样周期在紧跟着开始位的第五个时钟的下降沿结束。一旦输入D0位,则还需要一个时钟来完成采样与保持周期(DIN不必考虑该时钟)。在下一个时钟的下降沿,器件将输出一个低空位(null bit).接下来的12个时钟将输出转换结果,从MSB开始如图3.4。数据总是在时钟的下降沿从器件输出。如果12个数据位全部被发送而且器件在CS保持低电平时继续接收时钟,则器件将从LSB开始输出转换结果如图。如果在CS仍为低时还有时钟输入器件(在LSB先行数据发送以后),器件则会无限制地按时钟输出零。如果有必要,可以在开始位之前将CS拉低并在DIN线上按时钟输入前导零。在一次必须发送8位的基于微控制器的SPI端口应用中常进行这样的操作。
开始
通道号
通道0
通道3
通道2
通道1
通道4
通道7
通道6
通道5
结束
0
1
2
3
6
7
5
4
图3.2 CD4051通道切换流程图
表3.1 PT100的A/D值与温度的对照表
A/D值
温度值
A/D值
温度值
A/D值
温度值
A/D值
温度值
360
-111
1275
-5
2232
35
3200
75
407
-40
1372
0
2356
40
3326
80
502
-35
1497
5
2475
45
3440
85
627
-30
1620
10
2600
50
3558
90
752
-25
1746
15
2720
55
3680
95
875
-20
1866
20
2842
60
3799
100
998
-15
1989
25
2960
65
4000
101
1123
-10
2112
30
3084
70
开始
4051选择相应的通道
mcp3204选择相应的通道
读一次A/D值
次数=9?
加权滤波
结束
Y
N
图3.3 温度采集程序流程图
图3.4 MCP3204的操作时序图
3.5 读时钟程序部分
读时钟部分采用单字节读取模式,每次读出一个字节,由于读出的时间值是以BCD码的形式表示的,所以读出时间值以后将BCD码转换成十进制数,并保存在时钟数组里。以方便后面的显示码转换程序。
DS1302的操作时序为:DS1302与CPU的连接仅需要三条线,即SCLK、I/O、RST。即采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。它共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。数据的输入输出:当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中置其为低电平,则会终止此次数据传送,并且I/O 引脚变为高阻态。上电运行时,在Vcc≥2.5V 之前, 必须保持低电平。只有在SCLK 为低电平时,才能将RST 置为高电。此时在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位至高位7,数据读写时序见图3.5。
读时钟程序的操作为:先将要读的寄存器的命令字写入到DS1302,然后读出DS1302数据口的数据,(注意,读出的时间是以BCD码的形式表示时间,所以要进行BCD到十进制的转换)流程如图3.6。
图3.5 DS1302的操作时序图
开始
Read_DS1302(0x81) 读秒
Read_DS1302(0x83) 读分
Read_DS1302(0x85) 读时
Read_DS1302(0x8b) 读星期
Read_DS1302(0x87) 读日
Read_DS1302(0x89) 读月
结束
Read_DS1302(0x8d) 读年
图3.6 读时钟的程序流程图
3.6 显示程序部分
显示部分我将在进行温度采集的函数结束后将采集的温度转换成相应的显示码存到温度显示码数组中,在读完DS1302中的时间后将读出的时间值转换成相应的显示码存到时间显示码数组中。74HC595显示一个字节的程序如图3.7,全部的显示程序如图3.8。
本设计用74HC595来进行串行输入并行输出的转换。这样,只用3个通用I/O口分别连接SCK、RCK、SER移位时钟输入,锁存时钟输入和移位寄存器数据串行输入就行了。由于要用多个数码管显示所以要利用74HC595级联来实现。级联时下一级的数据是连接到上一级的Q7引脚的而从74HC595的时序图不难发现Q7是在上升沿改变的而数据输入又要求上升沿的时候稳定。要求上升沿来前输入数据要求稳定表面上是矛盾的,但可以解释为,上升沿到达时,上一级的原始数据移入下一级,经过纳秒级的延迟,输出数据在下一级端口稳定,即上升沿结束后输出就稳定了。
74HC595是具有8位移位寄存器和一个寄存器,三态输出功能。移位寄存器和存储器是分别的时钟。下面将用具体引脚来具体说明其时钟的时序,数据在SCK(移位寄存器时钟输入)的上升沿输入,在RCK(存储寄存器时钟输入)的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(SDAT),和一个串行输出(SDAT’),和一个异步的低电平复位SCLK,存储寄存器有一个并行8位的,具备三态的总线输出,当使能G时(为低电平),存储寄存器的数据输出到总线。
开始
时钟线拉低
时钟线拉高
数据线=数据最高位
8位发送完毕?
数据右移一位
结束
Y
N
图3.7 74HC595显示一个字节的程序流程图
开始
发送一个字节
已显示字节=39?
结束
Y
N
显示允许
图3.8 全部的显示程序流程图
3.7 通信程序部分
数据上传部分采用MAX487作为通信接口芯片,该部分主要包括时钟校准和温度上传两部分。
3.7.1 时钟校准部分
时钟校准部分的程序设计流程为:当接收到上位机发送的数据的时候首先判断是否为其始字节,如果不是则跳出中断,如果为起始字节则关闭中断,并采用计时查询的方式等待接收其余的字节,当接收到停止字节以后开始判断校验和是否正确。如正确则就将校准标志位置位,然后在主程序中执行校准程序;如不正确则调跳出。具体的接收程序如图3.10。具体的通信协议的桢格式为:起始字节为0XFE,时间数据部分采用BCD编码,校验和为前面数据字节的代数和取最低的一个字节,停止字节为0XEF,如图3.9。时钟校准程序主要是按顺序将上位机的时间值校准到DS1302中,具体的程序如图3.11所示。
起始
年
月
日
时
分
秒
星期
校验和
停止
0XFE
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
0XEF
图3.9 时钟校准通信协议图
开始
串口接收中断产生
第一字节=起始字节?
RI0=0;
继续接收数据
数据数=5?
结束位?
校验和正确?
Y
Y
N
Y
Y
校准时间
Y
结束
N
N
图3.10 接收时钟校准程序流程图
开始
Write_DS1302(0x8e,0x00) WP=0
Write_DS1302(0x90,0xa5)
Write_DS1302(0x80,inbuf1[6]) 设定星期读时
Write_DS1302(0x80,inbuf1[3]) 设定时
Write_DS1302(0x80,inbuf1[5]) 设定秒
Write_DS1302(0x80,inbuf1[4]) 设定分
结束
Write_DS1302(0x80,inbuf1[2]) 设定日
Write_DS1302(0x80,inbuf1[1]) 设定月期
Write_DS1302(0x80,inbuf1[0]) 设定年
图3.11 时钟校准程序流程图
3.7.2 温度数据上传部分
温度数据上传部分我采用RS485的通信方式,该方式的优点是数据可传输的距离远,由于采用±200mV电势差来表示传输的逻辑,所以具有很强的抗干扰能力。在进行数据上传之前要将MAX487的读写信号线置成写,发送数据结束在将信号线置成读。 上传数据桢格式如图3.13。温度上传的桢格式为:起始字节为9F,通道字节用高四位表示通道号,符号字节用11表示正数,用12表示负数,温度值第一字节的低四位表示温度值的十位,温度值第二字节的低四位表示温度值的个位,温度值第三字节的低四位表示温度值的小数位,校验位为从通道号开始的五个字节的和的低字节,停止字节为6F。
串行口的通信波特率为9600bps,时钟发生器用定时器1的工作方式2,采用8位自动加载模式,计数初值为0XFD,波特率不增倍,SMOD=0;下面介绍发送一个字节的方法:先将MAX487置于写状态,然后把要发送的数据送到SBUF里,查询TI的状态,如果为“0“,则继续查询,直到TI为”1“,表示发送的一个字节已经结束,将MAX487置于读状态。串口发送一个字节的程序如图3.14,向上位几发送温度子程序如图3.15。
开始位
通道号
符号位
十位
个位
小数位
校验位
停止位
9F
XXXX0000
11,12
0000XXXX
0000XXXX
0000XXXX
SUM
6F
图3.13 温度值上传桢格式
开始
RS487WR=1
SBUF=BYTE
TI=0?
RS487WR=0
结束
Y
N
图3.14 串口发送一个字节程序的流程图
开始
发送一桢数据
桢数=4
N
发送校验和
Y
发送起始位
发送停止位
结束
图3.15 串口发送温度值程序流程图
第4章 系统调试
本系统在调试过程中遇到了各种各样的问题,下面就将从多个方面介绍在调试过程中出现的问题和解决方法。当然,有些解决方法也许不是最好的,还需要进一步的研究和实践。
4.1 温度采集部分出现的问题及解决方法
在温度采集部分主要出现的问题包括A/D值的不准确,温度显示的漂移抖动等问题,下面逐一介绍温度采集部分调试过程中出现的问题。
4.1.1 A/D值不准确的发现解决方法
在进行温度采集过程的第一步就是将模拟的温度信号转换成数字信号这个过程就是A/D转换过程。在A/D转换过程中出现了A/D值的不准确现象,具体表现为:读A/D值函数后设置断点,发现读出来的A/D值不是很规则,非周期性的出现例如满量程或值为100多的A/D值。我认为这个排除信号干扰的可能,应该是由于读取失败所造成的原因,在检查了读A/D值的程序后发现程序应该是没有问题的,最后发现原来是DS1302和MCP3204共用时钟线和数据线的原因。将DS1302的片选置为不片选就解决了这个问题。
在解决好这个问题以后在最后调试通信部分的时候发现A/D值又出现了有高频干扰的问题。由于以前已经确定软件是没有问题的了。考虑到在调试通信程序过程中的通信模块电源不是单独供电,估计可能是由于通信模块部分的高频信号返到了测量部分。于是将通信部分的电源拔掉,便解决了这个问题,在通信部分另用外部的电源供电。
由于最初调试的时候只调试的是1路温度的检测。当进行其它通道的温度检测的同时,发现读上来的A/D值也是不对的。由于老师的实践经验告诉我可能是CD4051需要一定的时间进行模拟通道切换,所以在CD4051进行通道切换的过程中要加一定的延时,实践证明老师的判断是准确的。
4.1.2 温度值有0.1℃的漂移的问题和解决方法
在调试过程中,发现在显示板上显示的温度值一直有0.1~0.2℃的漂移,而且速度很快,给人以一种测量不准确的感觉。于是继续以断点方是执行程序,发现A/D虽然没有高频的干扰也没有读取失败的情况,但是仍有不规则的较小的漂移,于是决定采用软件滤波的方式解决这个问题。由于A/D的漂移不是规则的周期分布,所以没有采用均值滤波的方式,而是采用加权滤波的方式。由于设计的经验不足并没有对A/D值滤波,而是对转换成的温度值进行了加权,结果
展开阅读全文