通过8253各计时器的组合使用实现每隔N秒(N可设置)发出一个信号(我们采用下降沿信号);8255的PB0每接收到一个下降沿信号时就让AD模块采集十次,再判断去掉最大值、最小值后的平均值,让8255的PA7~PA0输出相应的处理信号对LED小灯和步进机的状态进行控制。
——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十次均值)与临界值比较判断,确定其所属区间并做出相应的处理。在实现步进机正反转的过程中,折腾了我们不少时间,通过测试(不用正转表和反转表,直接一个个输出)断定问题出现在数据段正转表和反转表的读取上,有读取不正常的情况,还有报错信息:phase error between passes(标号地址跑位)。最后发现是数据段地址没有设好所致,改正段头问题得以解决:
code segment
assume CS:code,DS:code
start: mov ax,8100h
mov ds,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.3V<X<2.8V 时 L5亮,步进机反转;
X>=2.8V 时 L4亮,步进电机不转。
注:以上为理论计算值,实测值误差在+0.1V左右,鉴于每天使用的不同实验板上的AD模块精度不一,我们觉得没必要加以调整。实际问题中如需调整,只要稍微调整代码中的临界值即可。以我们的设计为例,将临界比较值1.2V、1.7V、2.3V、2.8V调整为1.1V、1.6V、2.2V、2.7V左右所对应的AD值,然后再调试,不符合就继续微调临界比较值…
八、 软件清单
code segment
assume CS:code,DS:code ;数据定义在代码段里
start: mov ax,8100h ;实验板的数据段地址已经被设定为8100h
mov ds,ax
;1.初始化8255,8253计数器1、计数器0*****************************************
;8255初始化:
mov al,10000010b ;A口:方式0,输出。B口:方式0,输入。C口没用。
mov dx,20Bh
out dx,al ;写入方式控制字
;8253初始化:
;计数器1初始化:
mov al,01110110b ;计数器1为方式3,采用二进制计数,先低后高写入计数值
Mov dx,207h ;控制寄存器地址
out dx,al ;写入方式控制字
mov ax,10000 ;计数值为10000 ,f_out1=1M/10000=100Hz
mov dx,205h ;计数器1
out dx,al ;写入低字节计数值
mov al,ah
out dx,al ;写入高字节计数值
;计数器0初始化:
mov al,00110110b ;计数器0为方式3,采用二进制计数,先低后高写入计数值
Mov dx,207h ;控制寄存器地址
out dx,al ;写入方式控制字
mov ax,200 ;计数值为200 ,f_out0=100/200=0.5Hz, T=1/0.5=2s.
mov dx,204h ;计数器0
out dx,al ;写入低字节计数值
mov al,ah
out dx,al ;写入高字节计数值
;2.AD采集、数字滤波********************************************************
wait1:mov dx,209h ;8255-B口
in al,dx
test al,01h
jz wait1 ;8255-B0为低电平 转 继续等待高电平
wait0:mov dx,209h ;8255-B口
in al,dx
test al,01h
jnz wait0 ;8255-B0为高电平 转 继续等待下降沿
;以一个下降沿作为十次AD采集的信号
mov cl,10 ;十次采集前的变量初始化
mov ax,0
mov sum,ax
;mov al,0
mov max,al
mov al,255
mov min,al
collect:MOV AL,00H ;AD通道0
MOV DX,210H
OUT DX,AL
call delay1
MOV DX,210H
IN AL,DX ;读取AD值
mov ah,0
add sum,ax ;累加和
cmp al,max
ja changemax ;最大值
cmpmin:cmp al,min
jb changemin ;最小值
aa:dec cl
jnz collect
jmp bb
changemax:mov max,al
jmp cmpmin
changemin:mov min,al
jmp aa
;数字滤波:
bb:mov al,max
mov ah,0
sub sum,ax ;去掉最大值
mov al,min
;mov ah,0
sub sum,ax ;去掉最小值
mov ax,sum
mov bl,8
div bl ;取平均值【被除数默认为ax,平均值(商)默认寄存于al】
;3.使用循环队列保存近期(如100个数据)数据值*********************************
mov BX,adpoint
mov adtable[BX],al
inc BX
cmp BX,100
jz changeBX
cc:mov adpoint,BX
jmp ee
changeBX:mov BX,0
jmp cc
;4.临界值判断并作出相应处理************************************************
ee:cmp al,61 ;(1.2V/5V)*255
jb lim1 ;上限
cmp al,87 ;(1.7V/5V)*255
jb fpzz ;负偏
cmp al,117;(2.3V/5V)*255
ja gocmp
mov al,0f0h ;工作正常,没有超过2.0±0.3(V) (灯全灭,步进机不转)
mov dx,208h ;A口
out dx,al
jmp wait1
gocmp:cmp al,143;(2.8V/5V)*255
jb zpfz ;正偏
mov al,11100000b ;下限信号(L4亮,步进机不转)
mov dx,208h ;A口
out dx,al
jmp wait1
lim1:mov al,01110000b ;上限信号(L7亮,步进机不转)
mov dx,208h ;A口
out dx,al
jmp wait1
fpzz:mov cl,4 ;负偏正转(L6亮,步进机正转)
mov SI,0
zz:mov al,zztable[SI]
mov dx,208h ;A口
out dx,al
call delay2
inc SI
dec cl
jnz zz
jmp wait1
zpfz:mov cl,4 ;正偏反转(L5亮,步进机反转)
mov SI,0
fz:mov al,fztable[SI]
mov dx,208h ;A口
out dx,al
call delay2
inc SI
dec cl
jnz fz
jmp wait1
mov ah,4ch
int 21h
;5.延时子程序**************************************************************
delay1 proc near
push bx
mov bx,5000 ;延时等待AD完成转换
d1:dec bx
jnz d1
pop bx
ret
delay1 endp
delay2 proc near ;步进机延时
push bx
mov bx,0ffffh
d2:dec bx
jnz d2
pop bx
ret
delay2 endp
;6.变量、数组数据定义区*****************************************************
sum dw 0
max db 0
min db 255
zztable db 10111100b,10110110b,10110011b,10111001b ;步进机正转表
fztable db 11011001b,11010011b,11010110b,11011100b ;步进机反转表
adpoint dw 0 ;最后十次采集的平均值的存储地址(指针)
adtable db 100 dup(0) ;用来保存最近100个AD采集的数据(平均值)
code ends
end start