绍兴市第二届大学生电子设计竞赛Word格式文档下载.docx
《绍兴市第二届大学生电子设计竞赛Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《绍兴市第二届大学生电子设计竞赛Word格式文档下载.docx(53页珍藏版)》请在冰豆网上搜索。
(3)支持8路采集器上限报警功能,上限数据可以任意设定,要求数据存储在非易失数据存储器中,掉电不丢失,要求显示界面能够清晰显示报警状态。
(4)、其他功能的改进。
多路数据采集系统
摘要
本设计是一个主从系统,采用单片机控制,从机负责采集八路数据,采集精度可以达到0.1%以上,同时应答主机发送的命令,将采集的数据上传;
主机进行数据处理,数据显示,键盘输入,系统报警。
在主机与从机的通讯中,采用国际标准的RS485差分方式接口,使通讯的速率和传输距离均大于RS232的标准接口方式,并且用线最少(只要两根)。
本设计通讯距离可达100米。
关键词数据采集系统;
单片机;
RS485
Multi-channeldataacquisitionsystem
ABSTRACT
Thisdesignisamasterandslavesystem,usingSCMcontrol,eight-wayfromtheplaneresponsibleforcollectingdata,thegatheringprecisionmayachieveabove0.1%,simultaneouslyrepliestheorderwhichthemainenginetransmits,willgatherdataupload;
mainframedataprocessing,datashow,Keyboardinput,alarmsystem.Andfromthehostmachinecommunication,usinginternationalstandardsRS485differentialwayinterface,sothatcommunicationandtherateoftransmissiondistancewasgreaterthanthestandardRS232interfaces,andtheuseofatleast(aslongastwo).Thedesignofcommunicationsrangeofupto100meters.
KeywordsDataAcquisitionSystem;
SCM;
1、系统方案
1.1系统概述
本系统可模拟远距离多路采集的现场,实现多路模拟信号同时采样,A/D采集、主从CPU通信与数据处理、键盘控制与数据显示。
系统结构框图如图1-1-1所示:
图1-1-1系统结构框图[1]
1.2方案论证
1.2.1信号源产生电路
方案一、制作一个稳压直流电源,在输出端通过电位器分压获得0~2V连续可调的直流信号,此方法简便易行,缺点是通过电位器分压输出,输出阻抗较大,带负载能力弱,并且不能得到0V电压。
方案二、通过基准源获得稳定的电压,再经运算放大器反相,最后再在输出端采用运放跟随输出,这样经反相既可以获得0V电压输出,采用运放跟随输出又保证了低输出阻抗的特点。
考虑到设计任务中要求信号源低输出阻抗,并且要求包括0~2V可调输出,故本设计采用方案二。
1.2.2A/D转换器
方案一、采用MC14433(国产5G14433)
位(BCD码)单片双积分式A/D转换器,模拟输入电压范围为0~
1.999V或0~
199.9mV,因为它有一个超量程标志,所以可以认为当显示超量程标志位时为2.000V。
缺点是不能测量超过1.999V的电压[2]。
方案二、采用
位A/D,ICL7135,测量精度可达0.005%,可以轻松满足测量精度0.1%以上的要求,具有精度高和价格低的特点。
本设计采用方案二。
1.2.3温度采集
方案一、采用一线式数字温度传感器DS18B20,由于只有一根线控制,可节省大量的引线和逻辑电路,但也正是由于只有一根线控制,对它进行操作不允许被打断,同时占用的机时较长。
方案二、采用LM71集成温度传感器,功耗低,具有三线串行接口SPI总线,在操作过程中不受中断影响,因此使用更为方便。
故本设计采用方案二。
1.2.4通信
方案一、采用RS232通信,但RS232的可靠通信距离仅为15米。
方案二、采用RS485总线,它采用平衡发送和差分接收,因此具有抑制共模干扰的能力。
加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。
由于本设计要求主控器能对100米以外的数据采集器的数据进行采集和控制,故本设计采用RS485总线。
1.2.5键盘与显示
由于本设计要显示的内容较多,LED已不能胜任,故采用图形液晶显示模块12864,显示分辨率为128×
64点。
由于功能按键数量较少,故直接使用I/O口控制。
1.2.6监控
方案一、对MCU采用手动复位,此方法电路简单,但需要操作者每时每刻注意MCU的工作状态,很不方便。
方案二、采用监控电路MAX813L,可以对电源电压及MCU工作状态进行监控,当电源电压降低或工作状态不正常时,便会输出一个复位信号,使MCU复位,此方法大大增加系统可靠性。
1.2.7存储器
方案一、采用EEPROM24C256,存储空间有256K,足以满足每路每10S存一点,一共存20点的要求,但是读写速度较慢。
方案二、使用X5045,看门狗芯片X5045内部有512字节的存储空间,每一路存20点,一共8路,需要存储160点,每一点需要2个字节,所需内存为320字节。
所以本设计采用方案二,并且X5045的读写速度较快。
2、理论分析与计算
2.1测量与控制方法
2.1.1信号源
信号源要求能够产生稳定可调的0~2V直流信号,并保证输出低阻抗特性。
首先信号源必须涵盖0V和2V这两个临界值,所以可以用运放将信号反相,得到负值,再将输出信号通过一级运放跟随,便可以得到0~2V的低输出阻抗的信号源。
由于电源的电压波动较大,故不能直接用来作为运放的输入,这时就需要用到基准源芯片。
它能在负载电流、温度和时间变化时电压保持稳定不变。
2.1.2信号采集
信号采集主要通过ICL7135将输入模拟量转换成数字量,芯片的积分过程包括了对测量信号的积分阶段及对基准电压的放电阶段,对测量信号积分时间固定为10000个时钟周期,而对基准放电的时间计数就是A/D转换结果。
只要对BUSY信号的高电平进行时钟同步计数,再减掉10000就能够得到A/D结果。
具体的设计是使用单片机T0计数,INT0接BUSY做门控,同时使用INT0的后沿中断获得A/D转换结果。
接口及BUSY信号波形参见图2-1-1:
图2-1-1ICL7135管脚排列、接口及积分波形图
2.1.3通信
RS-485是一种应用十分广泛的通信协议。
其显著特点是信号采用“差分”的方式传输,因此抗干扰能力很强,通信距离也比RS-232远得多。
RS-485通信一般是半双工的,仅需要2根信号线,也可以是全双工的,需要4根信号线。
在RS-485通信中,发送过程主要采取了总线仲裁机制:
在向485总线写数据时,主设备先写一字节的地址请求,所有的从设备均会收到,只有地址与之相等的从设备端口打开,其他设备全部关闭。
这样,主设备与从设备之间的通信就是点对点的。
每一个从设备均有一根请求线与主设备相连,若从设备需要与主设备通信时,先通过请求线进行请求,当请求成功后,从设备应能检测到总线上的地址与自身地址相同,从设备才能打开发送中断,才能发送消息,发送完之后必须关闭发送中断,释放总线,以保证其他从设备这段时间能与主设备正常通信,提高通信效率。
数据接收时,采用中断方式,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。
接收方判断开始485通信帧的条件是,设备不报告接收错误的情况下,接收到结束标志之后的第一个非结束标志。
判断帧结束的条件是,帧接收已经开始,遇到第一个尾标志字符。
当链路层的通信帧接收已经开始的情况下,设备报告字符接收错误,此时应当丢弃本帧,结束帧的接收,重新开始搜索下一帧。
长度字段后面的字节个数不等于长度字段指示,并且也不等于长度字段加2时,指示长度错误,作无效帧。
帧长度小于帧头的长度的帧视为无效帧。
当接收的字符个数超过最大的485通信帧字节数——262时,也认为接收错误,重新开始搜索头标志,检出下一帧数据。
超时保护:
如果接收收方在接收一帧数据时,在未接收完一帧时,超过20ms(2个Ticks)仍未有数据到达,则认为本帧数据接收结束,并将其丢弃。
2.2理论计算
2.2.1信号源制作
信号源输出要求0~2V稳定的电压,所以不能用电源直接提供基准电压,应该使用基准源芯片。
要求信号源输出包括0V,便需要用到运放反相来获得负电压,从而保证信号源能够输出0V。
故要采用双电源对运放供电,这里采用双5V电源。
考虑到最大输出电压为2V,应留有一定的余量,故采用2.5V的基准源。
选用LM338-2.5,基准源只要流过1mA的电流便能稳定工作。
由于采用5V电源供电,在基准源上的压降为2.5V,所以为保证基准源能够稳定工作,应该串一个2.2K
的限流电阻。
2.2.2数据采集器
ICL7135基准电压的大小与满度值的关系是:
为了留出一定的余量这里选用基准电压为1.23V,则输入电压最大值可以达到2.46V。
ICL7135要求每秒钟至少进行3次A/D转换,每次转换需要40000个时钟脉冲,因此晶振频率应大于120KHz,这里取250KHz,可以有2MHz的晶振经过8分频得到。
以输入电压Vx为例,“BUSY”输出端(ICL7135的21脚)高电平的宽度等于积分和反积分时间之和,如图2-1-1所示。
ICL7135内部规定积分时间固定为10001个时钟脉冲时间,反积分时间长度与被测电压的大小成比例。
如果利用单片机内部的计数器对ICL7135的时钟脉冲计数,利用“BUSY”作为计数器门控信号,控制计数器只能在BUSY为高电平时计数,将这段BUSY高电平时间内计数器的内容减去10001,其余数便等于被测电压的数值。
3、电路与程序设计
3.1电路设计
3.1.1信号源
信号源电路如图3-1-1所示:
图3-1-1直流信号源电路图
图中D1为基准源,只要有1mA的电流流过D1,在D1的输出端便会输出稳定的2.5V电压。
经过U1反相,在R6的下端输出-2.5V的电压,在R2的上端输出+2.5V的电压,这样通过调节R4便可以得到
V的输出电压,再经过一级电压跟随,便得到了低输出阻抗的信号源。
3.1.2数据采集器
图3-1-2数据采集器电路图
图中U8为
位A/D,ICL7135,它只有三根线控制,其中sclk为时钟输入端,POL为输出数据的符号位,BUSY为数据输出端。
sclk信号是由2MHz晶振经过8分频而得到的250KHz的方波信号。
LM71是温度传感器,测温范围为-40℃~150℃,温度分辨率为0.03125℃,测温精度在-40℃~150℃范围内为±
1.5℃,电源电压为2.65V~5.5V,具有三线串行接口SPI/MICROWIRE兼容接口,容易和微处理器连接。
图3-1-2中U11的串行时钟SC、串行输入输出SI/O、片选CS分别与单片机的P2.5,P2.6,P2.7相连,用来监测机箱内温度。
U15,MAX813L是MAXIM公司推出的低成本微处理器监控芯片,它用来监测单片机的电源电压,当电源电压降到+4.65V以下时,RESET输出高电平,对单片机进行复位,从而保证单片机正常工作。
S1为拨码开关,可以设定子机的地址,当开关导通时I/O口为低电平,四位拨码开关可以设定16个地址。
U10是RS485通信芯片75LBC784。
3.1.3主机
图3-1-3主机电路图
主机能对8路子机进行巡呼,能够将子机发送上来的数据进行显示。
图中U14为X5045,在本设计中当作存储器使用。
MAX813L为看门狗电路,用来监测电源电压,当电源电压下降时,给P3.2一个信号,单片机便进入掉电保护程序,将当前数据写入X5045中。
S2~S5为设置用的功能按键。
D6为超限报警指示灯,当某一路或某几路的值超过设定值时,便会闪烁。
DS1302用来提供实时时钟。
3.1.4总体电路图
图3-1-4总体电路图
本系统的所有设计电路如图3-1-4所示,其中共有四个模块,信号源、主机和两个子机,每个模块都是一个独立的整体,都自带电源。
3.2程序设计
3.2.1程序流程图
图3-2-1为子机的程序流程图,图3-2-2为主机的程序流程图。
图3-2-1子机程序流程框图
图3-1-2主机程序流程框图
3.2.2主要程序分析
4、结果分析
参考文献
[1]冯涛,秦永左,赵巍.实用多路数据采集系统[J].长春理工大学学报.2003,26
(2):
83
[2]赵茂泰.智能仪器原理及应用[M].2004年7月第1版.7-121-00017-2.北京:
电子工业出版社,2004.23~28
[3]张萌,和湘,姜斌.单片机应用系统开发综合实例[M].2008年7月第1版.978-7-302-15458-7.北京:
清华大学出版社,2007.94~117
附录
1、主机源程序
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineWriteDeviceAddress0xa0//写驱动地址指令
#defineReadDeviceAddress0xa1//读驱动地址指令
//变量说明:
//I循环发送时存放的通道数
//td用于循环显示电压的变量值
//time show_timetime为128ms扫描一次的时间标志位屏幕刷新的频率,大约是=16时累计时间为1秒
//temp为属性变量寄存器,即页面属性的变量寄存器
//sel_flag,show_flag为为sel的菜单状态寄存器和显示结果的状态标志位,根据不同的情况调出不同的菜单
//x_sw,x_gw,x_time分别代表的是十位,个位,即计数的个数
//x_dat=0,x_add=0;
x_sz=0,代表的是X5045的双字节读写时数据和地址。
以及读取出数字数据暂存变量
uchare=0,sec=1,select;
//sec为秒的十位
ucharat_add=0;
unsignedintsec_page;
ucharidatax_rdat[40];
//at_add为在AT24C02中所存的数值(掉电)
bitw=0;
//调时标志位
ucharat_i=0;
//用于作为通道的标志位
ucharidatat[10]={0,0,0,0,0,0,0,0};
//作为温度显示
ucharalarm[8]={0,0,0,0,0,0,0,0},alarm_td,alarm_flag,alarm_stop=0,x_j,alarm_i;
ucharidatax_tdat[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsignedintr_dat;
unsignedchartime,show_time;
unsignedchartemp,sel_flag,show_flag;
unsignedcharfs_td,td;
//td用于循环显示的通道数目
//键盘引脚定义
sbitdog=P2^0;
sbitalarm_led=P2^1;
sbite_485=P2^4;
//485数据传输和接收使能端。
sbitKEY_1=P1^6;
//左上功能:
退出 显示数据功能
sbitKEY_2=P1^7;
//左下功能:
加一
sbitKEY_3=P1^5;
//右上功能:
设置时间
sbitKEY_4=P1^4;
//右下功能:
减一
sbitep_sck=P2^2;
sbitep_si=P2^3;
sbitep_so=P3^5;
sbitep_cs=P3^4;
//向5045中写入数据
voidxinput(unsignedcharv)
{unsignedchardatav1;
for(v1=0;
v1<
8;
v1++)
{ep_sck=0;
//拉低时钟
ep_si=v&
0x80;
//送出一位数据
ep_sck=1;
//拉高时钟触发移位寄存器
v=v<
<
1;
}//准备输出下一位
ep_si=1;
}
//数据的读出
//辅助函数:
从5045输入一个字节8位数据,首先输出高位。
unsignedcharxout()
{unsignedchardatav1,x,y;
ep_sck=0;
//拉低时钟
{ep_sck=1;
//拉高时钟
x=x<
//输出字节先左移
y=ep_so;
//获得一位输出
x=x|y;
//组装输出结果
ep_sck=0;
returnx;
写结束测试
voidwip_poll()
{unsignedchardatav;
do
{ep_cs=1;
ep_cs=0;
xinput(0x05);
//准备读状态寄存器
v=xout();
ep_cs=1;
v=v&
0x01;
while(v==1);
}//测试寄存器低位,为零则写结束。
打开写开关,所有写操作前必须运行本程序,命令字为06H
voidwren()
{ep_cs=1;
ep_cs=0;
xinput(0x06);
//发出打开开关命令
ep_cs=1;
关闭写开关,所有写操作后必须运行本程序,以防止误写,命令字为04H
voidwrdi()
xinput(0x04);
写状态寄存器,包含WREN_CMD命令。
//功能:
改变块锁定控制位BL1,BL0(D3,D2)及看门狗超时控制位WD1,WD0(D5,D4)
voidwrsr(unsignedcharx)
{wren();
//打开写开关
xinput(0x01);
//送入命令
xinput(x);
wip_poll();
//测试写结束
wrdi();
}//关闭写开关
读状态寄存器。
unsignedcharrdsr()
{unsignedchardatax;
xinput(0x05);
x=xout();
returnx;
}
//单字节写子程序,使用中调用wren()。
如果使用了块锁定,还需要先写状态寄存器解除锁定。
//函数带有形参wrdat和wradd,前者为写入的字符型数据,后者为整形地址。
voidbyte_write(unsignedcharwrdat,unsignedintwradd)
{unsignedchardatax;
wren();
if(wradd<
256)//据输入地址决定写前256地址块或者后256块
xinput(0x02);
//02表示使用低256区块
else
xinput(0x0a);
//0a表示使用高256区块
x=wradd%256;
//高位地址已经输入,此处只需要输入低8位地址
xinput(wrdat);
wip_poll();
wrdi();
//单字节读子程序,本函数返回字符型结果
unsignedcharbyte_read(unsignedintrdadd)
if(rdadd<
256)//根据要读取的地址写入命令字
xinput(0x03);
xinput(0x0b);
x=rdadd%256;
return(x);
//双字节写子程序。
使用中调用wren()。
如果使用了块锁定,还需要先解除锁定。
//函数带有形参wrdat1和wradd1,前者为写入的整型数据,后者为整形地址。
voidword_write(unsignedintwrdat1,unsignedintwradd1)
if(wradd1<
256)
xinput(0x02);
//根据地址写入命令字
x=wradd1%256;
x=wrdat1>
>
//写入高字节
x=wrdat1%2