中华机A/D、D/A转换的方法

🏠 首页 《无线电》杂志 1991年 🔗 第4期 🔗 第26页 分类:无线电技术自学经验交流 🔗 杨宪泽 🔗

(杨宪泽)图1(a)是中华机主机右侧9芯游戏杆接口的引脚图,图1(b)为主机板上的游戏杆插座引脚图。这些引脚的功能和在内存中的地址请参见表1。下面就介绍一下利用这些引脚进行数字量采集、发送,以及进行A/D、D/A转换的方法。

图1
图1 🔍原图 (737×318)

表1 游戏枉接口各引脚地址、功能表

名 称 16进制地址 功能 10进制地址

SW0 C061/C069 读取数字信号 -16287/-16279

SW1 C062/C06A 同上 -16286/-16278

SW2 C063/C06B 同上 -16285/-16277

PDL0 C064/C06C 接收模拟信号 -16284/-16276

PDL1 C065/C06D 同上 -16283/-16275

PDL2 C066/C06E 同上 -16282/-16274

PDL3 C067/C06F 同上 -16281/-16273

AN0 C058/C059 送出数字信号0/1 -16296/-16295

AN1 C05A/C05B 同上 -16294/-16293

AN2 C05C/C05D 同上 -16292/-16291

AN3 C05E/C05F 同上 -16290/-16289

数字量采集和发送

从表1中可以看到,利用SW0~SW2端可以读取数字信号,例如利用SW0端,该端在内存中的地址为$C061(-16287)。在SW0端输入数字信号,利用BASIC程序读取$C061地址中的内容,即可实现数字量的采集。程序如下:

10 LET TA=-16287;赋变量名

20 LET A=PEEK(TA);读取

30 PRINT A;显示

如果采集结果A≥128,则表示输入信号为高电平;A<128,则输入的数字信号为低电平。

同样道理,利用AN0~AN3端可以发送数字信号。下面用BASIC语言编制一个向AN1发送数字信号(可用作控制信号)的程序;

10 DA=-16294

20 POKE DA,0

执行此程序,AN1端呈低电平。

A/D转换方法

从表1中看到,PDL0~PDL3端可以用来接收模拟信号。工作时,主机首先把PDLn(n=0~3)端所接收模拟信号的电位转换成“A/D转换数”D。D从0~255对应模拟量5~0V。

虽然PDLn端可以直接输入模拟信号,但在实验中发现,若模拟信号直接加在这些端上,误差较大。尤其当模拟信号电压在1.5V以下时,误差更大。为了减小误差,在PDLn端之前加装一级电压—频率变换电路,如图2所示。图中D1用作积分器,D2用作比较器,它们与反馈回路中的VD1一起构成振荡环,输出一频率与输入模拟信号电压成正比的方波。

图2
图2 🔍原图 (766×305)

下面是PDL0端模拟信号的A/D转换程序。

10 D=PDL(0);读PDL0端的A/D转换数

20 VO=5-D*5/255;换算成实际电压值

30 PRINT VO

如果采集对象是电阻,可省去图2电路,而按图3所示方式连接。图3中的采集对象是热敏电阻。热敏电阻阻值0~150kΩ对应A/D转换数0~255。编程方法可参考上面程序。

图3
图3 🔍原图 (339×219)

D/A转换方法

D/A转换过程是:一、主机通过程序控制,将数字量转换为一定的时间信号从ANn端送出;该信号被图4所示的时间—电压转换电路转换成相应的模拟电压。

图4
图4 🔍原图 (1137×387)

图4电路中,从AN0送来1个控制信号时,该信号作用于D触发器(D1)的CP端,使Q端为低电平。此时VD1、VD2截止,积分器(D2及外围元件)开始工作,则V1=-\(\frac{1}{RC}\)∫\(^{T}\)\(_{0}\)(-VR)dt=VR;RC·T。由于Q端电平为0,VT1导通,由D3构成的电压跟随器输出有V2=V1。Q-端电平为1,VT2截止,D3与D4的通路断开。D4保持原值VO。从AN0端再来1个控制信号,Q端为高电平1,VD1、VD2导通。C迅速放电。同时VT1截止,D2与D3通路断开。VT2因Q-端为低电平而导通,D3与D4之间通路接通,由D4构成的电压跟随器输出VO=V2=V1。了解了图4电路原理,可以得到如下结论;输出电压与AN0端来的2次控制信号的间隔时间T成正比。

将数字量转换为一定的延迟时间并负责向AN0发送起始终止控制信号的D/A转换子程序如下;

图5
图5 🔍原图 (816×913)

延迟时间T1(385μs)的推算是根据上面公式、T=T1×D,以及当数据D为255时对应输出5V而得出的。

调用D/A转换子程序前,应将数据D送入$2000单元。也可以用BASIC语言编制一个置数据D、调用D/A转换子程序的主程序如下:

10 INPUT X;输入控制电压值

20 D=51*X;变换为数据D

30 M=57344;赋$2000地址变量名

40 POKE M,D;数据送$2000单元

50 Q=USR($“0E20”,0):调用D/A子程序

60 END