串行A/D转换器通讯编码原理与应用

来源:互联网 发布:自学python要多久 编辑:程序博客网 时间:2024/05/20 05:26
本节以16位计算机和12位A/D串行转换器为对象讨论数据采集通讯原理和软件编程方法。假设A/D共有16个数据通道,且各通道寄存器当前采集到12位二进制数据:{b11b10...b1b0}Channel number = 0,1,2,...,15。寄存器数据向计算机内存的通讯传递是实现数据采集的关键技术。
F5107是北京众人精密测控技术公司生产的串行十二位16通道A/D板,它可以通过计算机LPT并行口外接笔记本电脑,广泛用于野外便携测试。该A/D板占PC机的两个端口:并行口在PC中的端口H378(IBM为H3BC)和H379(H3BD),前者通过写OUT向A/D发送操作指令,后者通过INP从A/D读取数据。
Ms1215是北京计算机配件5厂生产的串行十二位16通道A/D板,它安装在PC机的八位插槽中。该型号A/D板在整个八十年代和九十年代初有大批量生产,目前在许多科研、生产单位仍然在发挥积极作用。该A/D板占PC机的四个端口:&H710、&H711、&H712和&H713,通过端口&H710和&H711向A/D发送OUT"写"操作指令,通过端口H712和H713向A/D发送 INP"读"数据通讯操作命令。
无论是外接式还是内插式串行A/D转换器,其采数思路是:按一定编码规则,通过写命令OUT将地址指针直接指向A/D板某通道的数据寄存器的特征位置,通过INP函数分两次以上读回数据,然后对其提取所含A/D数据寄存器中某些位的数据,最后将分段取回数据还原为A/D寄存器数据。下面说明A/D转换器的操作与读数编码原理,并以Qbasic和VB编程环境为例说明其在采数中的编程应用方法。
6-5-1 A/D转换器的寄存器地址编码原理
在QB中,向端口发送指令的OUT命令格式为:
OUT port,data
PORT为A/D设备在PC总线中的端口地址(有些A/D板,如F5107采用LPT接口,故PORT为&H378或&H3BC,而有些A/D板采用其它16位I/O地址,如MS1215 A/D板采用地址H710)。Data是一个0~255的十进制数,对应着八位二进制数据,其二进制格式为:
D7 D6 D5 D4 D3 D2 D1 D0
该二进制可以表为D7D6D5D40000与D3D2D1D0之和。D3D2D1D0编码为0000、0001、...、1111分别对应了A/D转换器序号为0,1,...,15的通道(共16个通道),例如,语句"OUT port,14"表示A/D的14通道就位。D7D6D5D4编码为0010表示启动通道为D3D2D1D0的A/D转换,如启动A/D的14通道采用语句"OUT port,&H2E",或"OUT port,32+14"。
对于外插式A/D板,厂家提供了D7D6D5D4的编码方案。data按如下方式编码:

D7 D6 D5 D4 1 1 1 0


如F5107,其D7D6D5D4编码为0100、0110、1000(4、6、8),它们表示对当前选定的A/D通道发送读A/D寄存器数据b11b10...b1b0的高、中、低四位数据(b11b10b9b8、b7b6b5b4、b3b2b1b0)指令,即通过OUT将地址指针指向A/D寄存器的高、中、低四位。这三个编码分别对应十进制码为64(读高四位)、96(读中四位)、128(读低四位)。指令"OUT &H378,&H40"或"OUT &H378,64"表示地址指针指向A/D当前通道数据寄存器的高四位。对于MS1215内插式A/D板,D7D6D5D4的编码为0000。
按上述方法设定地址指针后立即通过语句:
d=INP(PORT1)
向A/D寄存器读回包含A/D采数寄存器的12个二进制位中若干位的16位二进制数据。换句话说,返回数据d对应了16位二进制数据,其中只有若干位是所需的A/D数据寄存器数据段。如果采用LPT接口的外插式A/D板,语句中地址PORT1=PORT+&H1,即读数地址PORT1为&H379或&H3BD(IBM)。有些PC内插式A/D板可能有两个读数端口,如MS1215A/D板读数端口为&H710(对应高四位)和&H712(对应低八位)。
下面程序段是实现A/D指令的示意方法:

'F5107 A/D采数方法例子
ADPort=&H378 '=&H3BC for IBM
for j=0 to 15
OUT ADPort,j
'送通道,j意味着编码0000,0001,...
'1110,1111
If ADPort=&H378 or &H3bc then
'启动A/D的第j通道
OUT ADPort,&H20+j
for i=4 to 8
Data1=i*16 ' data1=&H40,&H60,&H80
Out ADPort,Data1
'向端口ADPort写data1,使地址指针指向A/D通道'数据寄存器的高、中、低四位数据
a=INP(ADPORT+1)
...
next i
else
Out ADPORT+1,j: a=INP(ADPORT+1)
...
end if
next j
6-5-2 A/D数据通讯编码与模拟转换
(1) F5107通讯编码原理与模拟转换方法
F5107 A/D的 12位寄存器中二进制数据为b11b10...b1b0,它分为高、中、低四位(b11b10b9b8、b7b6b5b4、b3b2b1b0)按以下格式对应着PC计算机总线的16位二进制数据线路:
高四位数对应a:
x x x x x x X x b11 b10 b9 b8 x x x x
中四位数对应b:
x x x x x x X x b7 b6 b5 b4 x x x x
低四位数对应c:
x x x x x x X x b3 b2 b1 b0 x x x x
以上数据通过读命令,如a=INP(H379),或a=INP(H3BD),将A/D板数据寄存器的高、中、低四位二进制数按上述格式送入PC计算机的16位二进制数据寄存器a、b、c中;再通过二进制的并操作命令,如a=a and HF0即可提取有关A/D板采数寄存器中高中低四位数据的数据信息,即a=b11b10b9b80000, b=b7b6b5b40000、c=b3b2b1b00000。于是,A/D所采数据由以下方法获得:
a= b11b10b9b80000=(b1123+ b1022+ b921+ b820)24, 即 =a/16
b= b7b6b5b40000=(b723+ b622+ b521+ b420)24 =b/16
c=b3b2b1b00000=(b323+ b222+ b121+ b020)24 =c/16
则对应A/D某通道寄存器中所采集到的二进制数据b11b10...b1b0的十进制数值为:
d=( )28+( )24+( )20
=(a/16)*256+(b/16)*16+(c/16)
=a*16+b+c/16
由于12位A/D电压量程-Kv~Kv对应的二进制数为0~111111111111(212-1=4095),则模拟电压的数值计算公式为:
dv=d*2Kv/4095-Kv
≈(a*16+b+c/16)*2Kv/4096-Kv
(2) MS1215板的编码与模拟转换方法
MS1215A/D的12位寄存器中二进制数据为b11b10...b1b0,它分为高四、低八位(b11b10b9b8、b7b6b5b4b3b2b1b0),按以下格式对应着PC计算机总线的16位二进制数据线路:
高四位数对应a:
x x x x x x x x x x x x b11 b10 b9 b8
低八位数对应b:
x x x x x x x x b7 b6 b5 b4 b3 b2 b1 b0
以上两个数据通过读命令a=INP(&H712)和b=INP(&H713),将A/D板数据寄存器的高四位、低八位二进制数按上述格式送入PC计算机的16位二进制数据寄存器a、b中;再通过二进制的并操作命令,如a=a and &HF和b=b and &HFF即可提取有关A/D板采数寄存器中高低位数据的数据信息,即a=b11b10b9b8, b=b7b6b5b4b3b2b1b0。于是,按前面相似方法可得A/D所采数据的公式:
d=a*256+b
其模拟电压的数值计算公式为:
dv=d*2Kv/4095-Kv
≈(a*256+b)*2Kv/4096-Kv
kv的定义同前。
(3) 串行A/D板数据采集子例程
以下是两种串行A/D板的BASICA或Quick Basic环境采数子例程。
F5107 A/D板的采数子例程:
sub acq (a1, i1, j)
a1 = 0
for m = 1 to 20
out &H378, j
for i = 1 to I1: next i
out &H378, &H20 + j
for i = 1 to 8: next i
out &H378, &H40
a = inp(&H379)
a = a and &HF0
out &H378, &H60
b = inp(&H379)
b = b and &HF0
out &H378, &H80
c = inp(&H379)
c = c and &HF0
a1 = a * 16 + b + c / 16 + a1
next m
a1 = a1 / 20
end sub
M1215 A/D板的采数子例程:
...
FOR JJ=1 TO N0
FOR J = 0 TO CH
OUT &H710, J
FOR I = 1 TO 10: NEXT I
OUT &H711, J
For i=1 to 10:next i
A(J) = INP(&H712):A(J)=A(J) and &HF
B(J) = INP(&H713): B(J)=B(J) and &HFF
A1(JJ,J)=10 * (A(J) *256+ B(J)) / 4096! - 5
NEXT J
NEXT JJ
...
(4) 在VB中的I/O动态连接库与调用
已有I/O动态连接库VBIOX.DLL,调用前必须对VBIOX.DLL(置于window/system目录中)进行调用声明:
Private Declare Function TopInPortW Lib "vbiox.dll" (ByVal Idx As Integer) As Integer
Private Declare Sub TopOutPortW Lib "vbiox.dll" (ByVal Idx As Integer, ByVal Data As Integer)
VB中I/O指令TopOutPortW 和TopInPortW在用法上对等于QB中的OUT指令和INP指令。
例子
Option Explicit
Private Declare Function TopInPortB Lib "vbiox.dll" (ByVal Idx As Integer) As Byte
Private Declare Sub TopOutPortB Lib "vbiox.dll" (ByVal Idx As Integer, ByVal Data As Byte)
Private Sub Command3_Click()
End
End Sub
Private Sub Command4_Click()
Dim a, b, c, i, k, a1
a = TopInPortB(&H379)
a = a And &HF0
Call TopOutPortB(&H378, &H60)
b = TopInPortB(&H379)
b = b And &HF0
Call TopOutPortB(&H378, &H80)
c = TopInPortB(&H379)
c = c And &HF0
a1 = a * 16 + b + c / 16
a1 = Fix((10 * a1 / 4096# - 5) * 100000) / 100000
Text1.Text = Str$(a1)
End Sub

 
原创粉丝点击