数据采集系统.docx
《数据采集系统.docx》由会员分享,可在线阅读,更多相关《数据采集系统.docx(14页珍藏版)》请在冰点文库上搜索。
![数据采集系统.docx](https://file1.bingdoc.com/fileroot1/2023-7/24/8dad24c6-2e50-4b16-8f26-cdee8b0a39d3/8dad24c6-2e50-4b16-8f26-cdee8b0a39d31.gif)
数据采集系统
课程设计书
课程:
微机原理与接口技术
题目:
数据采集系统
专业:
计算机科学与技术
班级:
座号:
姓名:
2011年6月14日
一、设计任务书
(一)课题:
数据采集系统
(二)设计目的:
1、掌握数据采集系统的设计、实现基本方法,提高软、硬件综合设计、调试与应用能力;提高分析问题、解决问题的能力。
2、掌握I/O接口地址译码的原理。
3、掌握并行可编程接口芯片8255A、可编程定时/计数器芯片8253、中断控制器8259(可选)和模数转换器ADC0809的应用方法。
(三)设计内容:
1、采用定时中断(或延时方式)和软件控制的方法,实现每隔N秒(N可设置)实现对模拟量的采集。
2、根据预先设置的数值和采集的模拟量决定控制输出。
如假设控制中心值为2.0V,当输入值超过2.0±0.3(V)时,控制步进电机转:
正偏差时反转,负偏差时正转;当输入值超过2.0±0.8(V)时,进行上、下限报警。
3、对采集的值应进行数字滤波,如可一次采集10个值,去掉最大值、最小值,然后取平均值。
4、使用循环队列保存近期(如100个数据)数据值,并将其数据用波形的形式显示出来。
5、实现多路采集,不同路的中心值及上、下项等参数可灵活设置。
注:
其中1~3为基本要求,4~5可根据自己的能力选择实现。
二、设计的背景及意义
在一些工业控制领域往往需要通过传感器将外界各类模拟信号数值化,并根据不同的信号让控制系统中心自动做出相应的处理。
三、功能及实现方法简介
鉴于时间与设备条件的限制,在这里我们来不及用中断方法实现,固采用延时方式和软件控制的方法实现。
通过8253各计时器的组合使用实现每隔N秒(N可设置)发出一个信号(我们采用下降沿信号);8255的PB0每接收到一个下降沿信号时就让AD模块采集十次,再判断去掉最大值、最小值后的平均值,让8255的PA7~PA0输出相应的处理信号对LED小灯和步进机的状态进行控制。
四、系统的硬件组成及原理
使用Protel工具软件绘制的硬件图
实验板线路连接图
图说设计周进度:
五、软件组成、流程图及原理
六、调试过程说明
在设计过程中,我们采用模块化设计的方法一步步完成设计要求实现的功能。
之前我们刚做过8253和8255综合应用的实验,已经比较熟练,现在直接运用自如。
只是把下降沿跑马灯换成AD采集而已,这时就可以通过8个LED灯先调试观察采集到的AD值了,与电压表实测值对应的AD值比较还可以大致了解当前使用的AD的精度。
AD调试没问题后,我们通过对采集到的信号(ad十次均值)与临界值比较判断,确定其所属区间并做出相应的处理。
在实现步进机正反转的过程中,折腾了我们不少时间,通过测试(不用正转表和反转表,直接一个个输出)断定问题出现在数据段正转表和反转表的读取上,有读取不正常的情况,还有报错信息:
phaseerrorbetweenpasses(标号地址跑位)。
最后发现是数据段地址没有设好所致,改正段头问题得以解决:
codesegment
assumeCS:
code,DS:
code
start:
movax,8100h
movds,ax
在完成设计的基本要求后还剩一些时间,于是我们又添加了使用循环队列保存近期(如100个数据)数据值的功能。
七、系统使用说明
调节开发版左上角的电位器旋钮,输出0~5V的电压作为AD模块的模拟信号输入值。
控制中心值为2.0V,假设AD输入值为X,则
X<1.2V时L7亮,步进电机不转;
1.2<=X<1.7V时L6亮,步进机正转;
1.7V<=X<=2.3V时灯全灭,步进机不转;
2.3VX>=2.8V时L4亮,步进电机不转。
注:
以上为理论计算值,实测值误差在+0.1V左右,鉴于每天使用的不同实验板上的AD模块精度不一,我们觉得没必要加以调整。
实际问题中如需调整,只要稍微调整代码中的临界值即可。
以我们的设计为例,将临界比较值1.2V、1.7V、2.3V、2.8V调整为1.1V、1.6V、2.2V、2.7V左右所对应的AD值,然后再调试,不符合就继续微调临界比较值…
八、设计体会
通过这次课程设计,我进一步熟悉了汇编编程,也锻炼了自己在硬件系统设计、调试与应用、分析问题、解决问题等方面的综合能力。
同时也意识到了在学习过程中相互交流探讨的重要性,比如说在解决数据段的问题时就是在和同学进行交流时才恍然大悟的。
此外,一定要多留意老师讲到的重点,可以避免走弯路瞎折腾,还是以前面数据段的问题为例,据说陈老师就有提到过该实验板的数据段问题,我那么一不留神就亏大了。
确实,很多时候很多可贵的东西好比真知都是在各种瞎折腾的实践中点滴累积而来的。
九、软件清单
codesegment
assumeCS:
code,DS:
code;数据定义在代码段里
start:
movax,8100h;实验板的数据段地址已经被设定为8100h
movds,ax
;1.初始化8255,8253计数器1、计数器0*****************************************
;8255初始化:
moval,10000010b;A口:
方式0,输出。
B口:
方式0,输入。
C口没用。
movdx,20Bh
outdx,al;写入方式控制字
;8253初始化:
;计数器1初始化:
moval,01110110b;计数器1为方式3,采用二进制计数,先低后高写入计数值
Movdx,207h;控制寄存器地址
outdx,al;写入方式控制字
movax,10000;计数值为10000,f_out1=1M/10000=100Hz
movdx,205h;计数器1
outdx,al;写入低字节计数值
moval,ah
outdx,al;写入高字节计数值
;计数器0初始化:
moval,00110110b;计数器0为方式3,采用二进制计数,先低后高写入计数值
Movdx,207h;控制寄存器地址
outdx,al;写入方式控制字
movax,200;计数值为200,f_out0=100/200=0.5Hz,T=1/0.5=2s.
movdx,204h;计数器0
outdx,al;写入低字节计数值
moval,ah
outdx,al;写入高字节计数值
;2.AD采集、数字滤波********************************************************
wait1:
movdx,209h;8255-B口
inal,dx
testal,01h
jzwait1;8255-B0为低电平转继续等待高电平
wait0:
movdx,209h;8255-B口
inal,dx
testal,01h
jnzwait0;8255-B0为高电平转继续等待下降沿
;以一个下降沿作为十次AD采集的信号
movcl,10;十次采集前的变量初始化
movax,0
movsum,ax
;moval,0
movmax,al
moval,255
movmin,al
collect:
MOVAL,00H;AD通道0
MOVDX,210H
OUTDX,AL
calldelay1
MOVDX,210H
INAL,DX;读取AD值
movah,0
addsum,ax;累加和
cmpal,max
jachangemax;最大值
cmpmin:
cmpal,min
jbchangemin;最小值
aa:
deccl
jnzcollect
jmpbb
changemax:
movmax,al
jmpcmpmin
changemin:
movmin,al
jmpaa
;数字滤波:
bb:
moval,max
movah,0
subsum,ax;去掉最大值
moval,min
;movah,0
subsum,ax;去掉最小值
movax,sum
movbl,8
divbl;取平均值【被除数默认为ax,平均值(商)默认寄存于al】
;3.使用循环队列保存近期(如100个数据)数据值*********************************
movBX,adpoint
movadtable[BX],al
incBX
cmpBX,100
jzchangeBX
cc:
movadpoint,BX
jmpee
changeBX:
movBX,0
jmpcc
;4.临界值判断并作出相应处理************************************************
ee:
cmpal,61;(1.2V/5V)*255
jblim1;上限
cmpal,87;(1.7V/5V)*255
jbfpzz;负偏
cmpal,117;(2.3V/5V)*255
jagocmp
moval,0f0h;工作正常,没有超过2.0±0.3(V)(灯全灭,步进机不转)
movdx,208h;A口
outdx,al
jmpwait1
gocmp:
cmpal,143;(2.8V/5V)*255
jbzpfz;正偏
moval,11100000b;下限信号(L4亮,步进机不转)
movdx,208h;A口
outdx,al
jmpwait1
lim1:
moval,01110000b;上限信号(L7亮,步进机不转)
movdx,208h;A口
outdx,al
jmpwait1
fpzz:
movcl,4;负偏正转(L6亮,步进机正转)
movSI,0
zz:
moval,zztable[SI]
movdx,208h;A口
outdx,al
calldelay2
incSI
deccl
jnzzz
jmpwait1
zpfz:
movcl,4;正偏反转(L5亮,步进机反转)
movSI,0
fz:
moval,fztable[SI]
movdx,208h;A口
outdx,al
calldelay2
incSI
deccl
jnzfz
jmpwait1
movah,4ch
int21h
;5.延时子程序**************************************************************
delay1procnear
pushbx
movbx,5000;延时等待AD完成转换
d1:
decbx
jnzd1
popbx
ret
delay1endp
delay2procnear;步进机延时
pushbx
movbx,0ffffh
d2:
decbx
jnzd2
popbx
ret
delay2endp
;6.变量、数组数据定义区*****************************************************
sumdw0
maxdb0
mindb255
zztabledb10111100b,10110110b,10110011b,10111001b;步进机正转表
fztabledb11011001b,11010011b,11010110b,11011100b;步进机反转表
adpointdw0;最后十次采集的平均值的存储地址(指针)
adtabledb100dup(0);用来保存最近100个AD采集的数据(平均值)
codeends
endstart