数据采集系统说明介绍研究意义和应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据采集系统说明介绍研究意义和应⽤
⼀前⾔
1.1 数据采集系统简介
数据采集,是指从传感器和其它待测设备等模拟和数字被测单元中⾃动采集信息的过程。
数据采集系统是结合基于计算机(或微处理器)的测量软硬件产品来实现灵活的、⽤户⾃定义的测量系统。
该数据采集系统是⼀种基于TLC549模数转换芯⽚和单⽚机的设备,可以把ADC采集的电压信号转换为数字信号,经过微处理器的简单处理⽽交予数码管实现电压显⽰功能,并且通过与PC的连接可以实现计算机更加直观化显⽰。
1.2 数据采集系统的研究意义和应⽤
在计算机⼴泛应⽤的今天,数据采集的在多个领域有着⼗分重要的应⽤。
它是计算机与外部物理世界连接的桥梁。
利⽤串⾏或红外通信⽅式,实现对移动数据采集器的应⽤软件升级,通过制订上位机(PC)与移动数据采集器的通信协议,实现两者之间阻塞式通信交互过程。
在⼯业、⼯程、⽣产车间等部门,尤其是在对信息实时性能要求较⾼或者恶劣的数据采集环境中更突出其应⽤的必要性。
例如:在⼯业⽣产和科学技术研究的各⾏业中,常常利⽤PC或⼯控机对各种数据进⾏采集。
这其中有很多地⽅需要对各种数据进⾏采集,如液位、温度、压⼒、频率等。
现在常⽤的采集⽅式是通过数据采集板卡,常⽤的有A/D 卡以及422、485等总线板卡。
卫星数据采集系统是利⽤航天遥测、遥控、遥监等技术,对航天器远地点进⾏各种监测,并根据需求进⾏⾃动采集,经过卫星传输到数据中⼼处理后,送给⽤户使⽤的应⽤系统。
1.3 系统的主要研究内容和⽬的
本课题研究内容主要包括:TLC549的⼯作时序控制,常⽤的单⽚机编辑C语⾔,VB 串⼝通信COMM控件、VB画图控件的运⽤等。
本课题研究⽬的主要是设计⼀个把TLC549(ADC)采集的模拟电压转换成⼋位⼆进
制数字数据,并把该数据传给单⽚机,在单⽚机的控制下在实验板的数码管上实时显⽰电压值并且与计算机上运⾏的软件⽰波器连接,实现电压数据的发送和接收功能。
⼆数据采集系统开发相关技术介绍
2.1 TLC549结构及⼯作原理
2.1.1 TLC549的概述
TLC549 是以8 位开关电容逐次逼近A/D 转换器为基础⽽构造的CMOS A/D 转换器。
它们设计成能通过3 态数据输出和模拟输⼊与微处理器或外围设备串⾏接⼝。
TLC549 仅⽤输⼊/输出时钟(I/O CLOCK )和芯⽚选择(CS )输⼊作数据控制。
TLC549 的I/O CLOCK 输⼊频率最⾼可达1.1MHz 。
TLC549 提供了⽚内系统时钟,它通常⼯作在4MHz 且不需要外部元件。
⽚内系统时钟使内部器件的操作独⽴于串⾏输⼊/输出的时序并允许TLC549像许多软件和硬件所
要求的那样⼯作。
I/O CLOCK 和内部系统时钟⼀起可以实现⾼速数据传送以及对于TLC549 为每秒40,000 次转换的转换速度。
TLC549的其他特点包括通⽤控制逻辑,可⾃动⼯作或在微处理器控制下⼯作的⽚内采样-保持电路,具有差分⾼阻抗基准电压输⼊端、易于实现⽐率转换(ratiometric conversion)的⾼速转换器,定标(scaling)以及与逻辑和电源噪声隔离的电路。
整个开关电容逐次逼近转换器电路的设计允许在⼩于17µs的时间内以最⼤总误差为±0.5 最低有效位(LSB)的精度实现转换。
TLC549C 的⼯作温度范围为0 ℃⾄70 ℃。
2.1.2 TLC549的⼯作原理
TLC548、TLC549均有⽚内系统时钟,该时钟与I/ O CLOCK是独⽴⼯作的,⽆须特殊的速度或相位匹配。
其⼯作时序如图2所⽰。
当CS为⾼时,数据输出(DATA OUT)端处于⾼阻状态,此时I/O CLOCK不起作⽤。
这种CS控制作⽤允许在同时使⽤多⽚TLC548、TLC549时共⽤I/O CLOCK,以减少多路(⽚)A/D并⽤时的I/O控制端⼝。
⼀组通常的控制时序为:
(1)将CS置低。
内部电路在测得CS下降沿后再等待两个内部时钟上升沿和⼀个下降沿后,然后确认这⼀变化,最后⾃动将前⼀次转换结果的最⾼位(D7)位输出到DATA OUT端上。
(2)前四个I/ O CLOCK周期的下降沿依次移出第2、3、4和第5个位(D6、D5、D4、D3),⽚上采样保持电路在第4个I/O CLOCK 下降沿开始采样模拟输⼊。
(3)接下来的3个I/O CLOCK周期的下降沿将移出第6、7、8(D2、D1、D0)个转换位,
(4)最后,⽚上采样保持电路在第8个I/ OCLOCK周期的下降沿将移出第6、7、8(D2、
D1、D0)个转换位。
保持功能将持续4个内部时钟周期,然后开始进⾏32个内部时钟周期的A/D转换。
第8个I/O CLOCK后,CS必须为⾼,或I/O CLOCK保持低电平,这种状态需要维持36个内部系统时钟周期以等待保持和转换⼯作的完成。
如果CS为低时I/ O CLOCK 上出现⼀个有效⼲扰脉冲,则微处理器/控制器将与器件的I/ O时序失去同步;若CS为⾼时出现⼀次有效低电平,则将使引脚重新初始化,从⽽脱离原转换过程。
在36个内部系统时钟周期结束之前,实施步骤(1)-(4),可重新启动⼀次新的A/D转换,与此同时,正在进⾏的转换终⽌,此时的输出是前⼀次的转换结果⽽不是正在进⾏的转换结果。
若要在特定的时刻采样模拟信号,应使第8个I/OCLOCK时钟的下降沿与该时刻对应,因为芯⽚虽在第4个I/ O CLOCK时钟下降沿开始采样,却在第8个I/O CLOCK的下降沿开始保存。
2.2 VB通信控件MSCOMM
2.2.1 通讯⽅式
MSComm 控件通过串⾏端⼝传输和接收数据,为应⽤程序提供串⾏通讯功能。
MSComm控件在串⼝编程时⾮常⽅便,程序员不必去花时间去了解较为复杂的API函数,⽽且在VC、VB、Delphi等语⾔中均可使⽤。
Microsoft Communications
Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串⾏通信编程的ActiveX 控件,它为应⽤程序提供了通过串⾏接⼝收发数据的简便⽅法。
具体的来说,它提供了两种处理通信问题的⽅法:⼀是事件驱动(Event-driven)⽅法,⼀是查询法。
MSComm 控件两种处理通讯的⽅式:事件驱动⽅式和查询⽅式。
(1) 事件驱动⽅式
事件驱动通讯是处理串⾏端⼝交互作⽤的⼀种⾮常有效的⽅法。
在许多情况下,在事
件发⽣时需要得到通知,例如,在串⼝接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上⼀个字符到达或⼀个变化发⽣时。
在这些情况下,可以利⽤MSComm 控件的OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅CommEvent 属性。
在编程过程中,就可以在OnComm 事件处理函数中加⼊⾃⼰的处理代码。
这种⽅法的优点是程序响应及时,可靠性⾼。
每个MSComm 控件对应着⼀个串⾏端⼝。
如果应⽤程序需要访问多个串⾏端⼝,必须使⽤多个MSComm 控件。
(2) 查询⽅式
查询⽅式实质上还是事件驱动,但在有些情况下,这种⽅式显得更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。
如果应⽤程序较⼩,并且是⾃保持的,这种⽅法可能是更可取的。
例如,如果写⼀个简单的电话拨号程序,则没有必要对每接收⼀个字符都产⽣事件,因为唯⼀等待接收的字符是调制解调器的“确定”响应。
2.2.2 MSComm控件的常⽤属性
MSComm控件有很多重要的属性,但⾸先必须熟悉⼏个属性:
CommPort 设置并返回通讯端⼝号
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停⽌位
PortOpen 设置并返回通讯端⼝的状态。
也可以打开和关闭端⼝
Input 从接收缓冲区返回和删除字符
Output 向传输缓冲区写⼀个字符
三硬件电路及程序的设计
3.1硬件电路组成框图
3.2C程序设计思想
3.2.1TLC549正常⼯作控制
sbit Clock = P1.2; //时钟⼝线
sbit DataOut = P1.1; //数据输出⼝线
sbit CS = P1.0; //⽚选⼝线
3.2.1读取AD转换结果
CS=1;
Clock=0;
CS=0;
Wait4us;
for (i = 0; i < 8; i ++) //输⼊采样转换时钟{ Clock = 1; Clock = 0;
}
CS=1;
Wait10us; //等待转换结束
CS=0;
Wait4us;
for(i=0;i<=8;i++)
{ Clock=1;
if (DataOut)
ConvertValue +=1;
ConvertValue <<=1;
Clock = 0;
}
CS = 1;
da=ConvertValue;
3.2.3串⾏通信与PC机的数据传输
SCON= 0x40; //串⼝⽅式1
PCON=0; //SMOD=0
REN=1; //允许接收
TMOD= 0x20; //定时器1定时⽅式2 TH1= 0xe6; //12MHz 1200波特率TL1= 0xe6;
TR1= 1; //启动定时器
3.3 VB程序设计思想
3.3.1 VB窗体界⾯的设计
本程序⽤⼀个窗体分别为Form1仿照⽰波器显⽰,如下图:
四结语
本设计基于VB平台的串⼝通信控件设计实现了单⽚机和PC的串⼝通信,通过PC的软件⽰波器显⽰数据采集器采集的电压数据。
本程序可以通过对话框对要连接的串⼝和其参数进⾏设置。
初步实现了电压数据的硬件显⽰和软件实时显⽰。
本设计还存在着很多不⾜和可改进之处:
(1) 需要提⾼VB语⾔代码的效率,要⼒求⽤最简洁的程序实现多种功能。
(2) 实时性有待提⾼,本程序在滤波和抗⼲扰部分没有做进⼀步处理,显⽰的电压图线会有⽑刺。
谢辞
本设计是在庞娇⽼师的悉⼼指导和严格要求下完成的。
⽼师渊博的知识、丰富的经验、踏实认真的⼯作作风、严谨的治学态度给我留下了深刻的印象。
在我设计的过程中,每当遇到问题时,⽼师总是认真地讲解,直到我听明⽩为⽌,正是有了⽼师悉⼼指导,我的设计才能顺利地完成。
在论⽂即将完成之际,向我的导师⽼师致以诚挚的谢意和感激之情!谨向所有关⼼我的⽼师、同学和朋友表⽰衷⼼的感谢!
附录(Ⅰ)
带串⾏控制8 位模数转换器
⼀、概述
1.1 ⼀般说明
TLC548 和TLC549 是以8 位开关电容逐次逼近A/D 转换器为基础⽽构造的CMOS A/D 转换器。
它们设计成能通过3 态数据输出和模拟输⼊与微处理器或外围设备串⾏接⼝。
TLC548 和TLC549 仅⽤输⼊/输出时钟(I/O CLOCK )和芯⽚选择(CS )输⼊作数据控制。
TLC548 的最⾼I/O CLOCK 输⼊频率为 2.048MHz ,⽽TLC549 的I/O CLOCK 输⼊频率最⾼可达1.1MHz 。
有关与⼤多数通⽤微处理器接⼝的详细资料已由⼯⼚准备好,可供使⽤。
TLC548 和TLC549 的运⽤与较复杂的TLC540 和TLC541 的运⽤⾮常相似;不过,TLC548 和TLC549 提供了⽚内系统时钟,它通常⼯作在4MHz 且不需要外部元件。
⽚内系统时钟使内部器件的操作独⽴于串⾏输⼊/输出的时序并允许TLC548 和
TLC549 象许多软件和硬件所要求的那样⼯作。
I/O CLOCK 和内部系统时钟⼀起可以实现⾼速数据传送以及对于TLC548 为每秒45,500 次转换、对于TLC549 为每秒40,000 次转换的转换速度。
TLC548和TLC549的其他特点包括通⽤控制逻辑,可⾃动⼯作或在微处理器控制下⼯作的⽚内采样-保持电路,具有差分⾼阻抗基准电压输⼊端、易于实现⽐率转换(ratiometric conversion)的⾼速转换器,定标(scaling)以及与逻辑和电源噪声隔离的电路。
整个开关电容逐次逼近转换器电路的设计允许在⼩于17µs的时间内以最⼤总误差为±0.5 最低有效位(LSB)的精度实现转换。
TLC548C 和TLC549C 的⼯作温度范围为0 ℃⾄70 ℃。
TLC548I和TLC549I的⼯作温度范围为-40 ℃⾄85℃。
可选项
1.2 特点
·8位分辨率A/D转换器
·微处理器外设或独⽴⼯作
·差分基准输⼊电压
·转换时间17µs Max
·每次总存取与转换周期数
TLC548 ⾼达45,500
TLC549 ⾼达40,000
·⽚内软件可控采样!!保持
·总不可调整误差(Total Unadjusted Error)±0.5LSB Max
·4MHz典型内部系统时钟
·宽电源范围3V⾄6V
·低功耗15mW Max
·能理想地⽤于包括电池供电便携式仪表的低成本、⾼性能应⽤
·引脚和控制信号与TLC540、TLC545 8位A/D转换器以及TLC154 ·CMOS⼯艺
1.3 功能⽅框图
TLC548,TLC549的功能⽅框图如下图所⽰。
1.4 典型等效输⼊
TLC548、TLC549在采样⽅式期间和保持⽅式期间的输⼊电路阻抗分别如下⾯两图所⽰。
1.5 引脚排列
D或P封装的TLC548、TLC549的引脚排列分别如下⾯两图所⽰。
1.6 ⼯作时序
TLC548、TLC549的⼯作时序如下图所⽰。
注释:A. 转换周期需要36个系统时钟周期(最⼤为17µs),它开始于CS变为低电平之后I/O CLOCK的第8个下降沿,这适⽤于该时刻其地址存
在于存储器中的通道。
B. 在CS变为低电平之后,最⾼有效位(A7)⾃动被放置在DATA OUT
总线上。
其余的7位(A6-A0)在前7个I/O CLOCK下降沿由时钟同
步输出。
B7-B0以同样的⽅式跟在其后
⼆、特性
2.1 ⼯作温度范围内(⾃然通风)的极限参数(除⾮另有说明)
电源电压,V CC (见注释1) 6.5V
任何输⼊端输⼊电压范围—0.3V⾄Vcc+0.3V
输出电压范围—0.3V⾄Vcc+0.3V
峰值输⼊电流范围(任何输⼊端)±10mA
峰值总输⼊电流范围(所有输⼊端)±30mA
⼯作温度范围(⾃然通风),Ta :
TLC548C,TLC549C -0℃⾄70℃
TLC548I,TLC549I -40℃⾄85℃
储存温度范围,Tstg -65℃⾄150℃
引线温度,离外壳1.6mm(1/16英⼨),10秒260℃
强度超出所列极限参数可能导致器件的永久性损坏,这些仅仅是极限参数,并不意味着在极限参数条件下或在任何其它超出推荐⼯作条件所⽰参数的情况下器件能有效地⼯作,延长在极限参数条件下的⼯作时间会影响器件的可靠性。
注释1:在REF 与GND连接在⼀起的情况下所有电压值均相对于⽹络地端2:温度低于-40℃时,不推荐D封装。
3. ⼤于加⾄REF 电压的模拟输⼊电压转换为全“1 ”(11111111 ),⼩于加⾄REF电压的模拟输⼊电压转换为
全“0”(00000000)。
为了⼯作良好,REF 电压⾼于REF电压⾄少1V。
⽽且,当此差分基准电压降⾄
4.75V以下时,
总失调误差可能增加。
4. 这是时钟输⼊信号从V IHmin 降⾄V ILmax 或从V ILmax 升⾄VIHmin 所需的时间。
在正常室温附近,对于远程数据采集应⽤(在这些应⽤中,传感器和A/D转换器放在离控制微处理器⼏英尺远处),在输⼊时钟跳变时间慢⾄2µs的情况下器件可保持其功能。
5. 为了使CS端噪声所引起的误差为最⼩。
在响应控制输⼊信号以前,内部电路在CS↓之后等待内部系统时钟两个上升沿和1个下降沿。
CS建⽴时间由t en 和t SU(CS) 这两个指标给出。
6. 线性度误差是在整个A/D转移特性范围内离开最佳直线的最⼤偏离量。
7. 零度(zero-scale)误差是00000000和零输⼊电压的转换输出之间的差值;满度(full-scale)误差是11111111与满度输⼊电压的转换输出之间的差值。
8. 总失调误差(toal unadjusted error)是线性度,零度(zero-scale)和满度(full-scale)误差之和。
2.2推荐⼯作条件
附录(Ⅱ)
单⽚机C程序#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar code
tab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f,0x40}; uchar disdat[6]; uchar ConvertValue = 0;
uchar da,i;
float xs;
ulong bb;
sbit Clock = P1 ^ 2; //时钟⼝线
sbit DataOut = P1 ^ 1; //数据输出⼝线
sbit CS = P1 ^ 0; //⽚选⼝线
/*延时*/
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
#define Wait20us {Wait10us;Wait10us;}
#define Wait30us {Wait10us;Wait8us;Wait4us;Wait2us;} void delay(uint t)
{ uint i;
while(t--)
{ for(i=0;i<=125;i++);
}
}
/*显⽰函数*/
void display(void) //六位数码管显⽰程序,disdat[]是要显⽰的内容{ uchar i,disa,disb,disc;//(是0~9的数字),xsd是该位显⽰⼩数点
disb = 0x03; //显⽰第n位
for (i=3;i<6;i++) //共显⽰6个数据
{ disa = disdat[i]; //显⽰数据
if (disa <10)
{ P2 = disb; //送位选信号
disc = tab[disa]; //显⽰段码
if (i==3)
disc = disc | 0x80; //增加⼩数点显⽰
P0 = disc; //P0⼝送显⽰
delay (1); //延时
P0 = 0x0; //将P0⼝置为0,为下次做准备
disb++; //下⼀个要显⽰的位置
}
}
P2 = 0xff; //将P2⼝置为⾼电平
}
/*采集转换函数*/
unsigned char ADCSelChannel(void)
{ CS=1;
Clock=0;
CS=0;
Wait4us;
for (i = 0; i < 8; i ++) //输⼊采样转换时钟{ Clock = 1;
Clock = 0;
}
CS=1;
Wait10us; //等待转换结束
CS=0;
Wait4us;
for(i=0;i<=8;i++)
{ Clock=1;
if (DataOut)。