8098单片机原理介绍(续)

🏠 首页 《无线电》杂志 1992年 🔗 第8期 🔗 第28页 分类:无线电技术自学经验交流 🔗 陈尚品 🔗, 梁建国 🔗, 朱小华 🔗

三、模拟通道

1.模拟信号转换成数字信号(A/D转换)

①8098片内具有4路带取样保持电路的10位A/D通道,每路的转换时间为22μs(12MH晶振)。图6是A/D转换部件的原理框图。8098的A/D转换器是采用逐项比较来完成模拟量到数字量转换的,可得到10位的分辨率,即内部基准电压可分为1024个台阶与输入的模拟电压进行比较。

图1
图1 🔍原图 (895×665)

8098的A/D为转换器完成一次转换需要88个状态周期,当晶振为12MHz时,约需22μs的时间,其中采样占用4个状态周期(约1μs)。当输入电压在线性范围内变化时,即输入电压的最小值大于0伏,最大值小于参考电源的电压值,A/D转换器的输出结果可用下式表示:

转换结果=1024*(Vin-ANGND)/(Vref-ANGND)

②基准参考源:A/D转换器的基准参考源是否稳定对转换结果的精度有很大的影响,在使用8098片内A/D转换器时,应采用精密基准参考源作为基准,如TL431,LM3999,ICL6809都是很好的基准参考源。Vref的电压值应尽量选择在4.5~5.5V之间,而且还要能提供5mA的供电电源,这是因为外部提供的基准参考电压不但要作为基准,而且还要供给A/D转换部件的模拟器件使用。目前生产的许多种芯片,Vref电压也可采用2.5V的电压。此外8098的ANGND引脚应接到线路的无干扰的地线上,并尽可能靠近供电电源线,以避免数字信号通过地线对A/D部分进行干扰。Vref与ANGND引脚之间还应加接滤波电容。

当不使用内部A/D转换器时,可将Vref引脚直接与VCC引脚相连接,ANGND引脚与VSS相连接。

③模拟信号的缓冲:输入的模拟信号最好经过缓冲之后再接到8098的模拟输入引脚,这样做有两方面的好处:一是可避免因输入的模拟信号电压过高而造成8098损坏,另一方面可提高模拟信号的输入阻抗,降低对模拟信号源的要求。几种典型的输入缓冲电路见图7~10。

图2
图2 🔍原图 (638×301)
图3
图3 🔍原图 (734×302)
图4
图4 🔍原图 (612×269)
图5
图5 🔍原图 (798×309)

图7所示是一种简单的模拟接口电路,电路中的两只限位二极管,使输入到模拟输入口的电流限制在2.6mA之下。如果对A/D转换精度要求较高的话,可采用图8或图9所示缓冲电路,注意图中电阻最好使用精密电阻,电容应采用低吸附效应的电容。当然为了调节方便也可采用图10所示的缓冲电路,采用这个电路,不仅可以将外部元件引起的误差消除,而且还可将A/D转换器的偏差和满度误差调至最小。

④A/D命令寄存器:A/D命令寄存器用来选择转换器的通道和启动方式,它的地址是02H,它的各位为0~2用于选择通道;3(GO)为1时转换立即开始,为0时等到HSO规定的时刻启动;4~7是保留位。A/D命令寄存器具有双缓冲能力,当由第一个命令启动A/D转换器时,第二个由HSO触发的命令照样能写入到该寄存器之中。如果一个新的转换命令写入时,而由原命令启动的A/D部件正在转换,那么新的命令不但启动了A/D部件,而且取消了正在进行的转换。启动一个转换,就会将结果寄存器清零,因此,在启动一次新的转换之前,应将前次转换的结果读出,否则前次转换的结果就丢失了。

每进行一次A/D转换都应写一次命令到命令寄存器,每写一次命令到A/D命令寄存器,只能选择一个通道进行转换。

⑤A/D结果寄存器;A/D结果寄存器是一个16位的寄存器,A/D转换的结果存放在其中,它不能按字读出,只能分别按字节读出,它们的地址单元是02H和03H。A/D结果寄存器中除了存放所转换的结果数据外,还存有通道号和A/D转换器的状态。

启动A/D转换器之后,要经过88个状态周期才能得到转换结果。可以通过查询A/D结果寄存器的第3位了解是否转换完。注意:当发出启动A/D命令之后,要等8个状态周期才能对A/D结果寄存器查询,否则可能会得出错误结论。也可以采用中断的方法来了解A/D是否转换结束,如果置位PSW9和中断屏蔽寄存器的第1位的话,当A/D转换结束时A/D部件就会发出中断请求,其中断向量单元为2002H。

⑥A/D转换示例:这个例子是在显示数码管上轮流显示4个通道的模拟星大小,并给出AD提示符和对应的通道号。具体程序见实验程序1。

温度控制示例:假设温度传感器已将温度转换成了模拟电压,温度对应的模拟电压送到A/D转换器的第4通道。当温度正常时8098不动作,如果温度超出上限值,便将P2.0置1(打开鼓风机)。当温度低于下限温度时,将P2.5置1(接通加热器),使温度回升,当温度再次超过设定的下限值时,再关闭加热器。具体程序见实验程序2。

2.PWM信号和数字信号转换成模拟信号

①PWM:PWM称之为脉冲宽度调制器,它能输出占空比不同的方波信号。8098能通过两个部件输出PWM信号,一是由PWM部件输出分辨率为1/256(8位)的PWM信号,另一个是由HSO部件输出分辨率为1/65536(16位)的PWM信号。这两个部件输出的PWM信号,经过平滑滤波后,均可作为模拟信号,也就是说8098具有D/A的能力。

图6
图6 🔍原图 (890×328)

②PWM部件原理:图11是8098内部的PWM部件原理框图。它由暂存器、脉宽调制寄存器、脉宽调制计数器、比较器、内部时钟、RS触发逻辑选择器等部分组成。它的8位计数器的值每一个状态周期加1,当计数器的计数值为00H时,PWM引脚输出高电平,并一直保持这种状态,直到PWM寄存器中预置的值与计数器中的值相等时,PWM引脚才由高转为低电平。当PWM计数器溢出时,PWM引脚又重新转变为高电平。注意如果将PWM寄存器设置为00H的话,PWM引脚总是保持为低电平。

PWM部件开始工作时,PWM引脚是高电平,当计数器的值与PWM寄存器的值相同时,PWM引脚输出为低电平。也就是说PWM寄存器(16H单元)的值,决定了PWM引脚高电平的占空比。由于PWM寄存器是8位的,故PWM引脚可输出256种不同的占空比。由于计数器的计数值是每个状态周期增1,故PWM部件的输出频率固定为15.625kHz(采用12MHz晶振,周期为64μs),这与电视行扫描频率一样。

PWM的计数器只有溢出后,才又从暂存器中将计数值读入PWM寄存器,故当一个计数周期(256个状态周期)还没有结束时,送入的新的计数预置值不起决定作用,只有在一个计数周期,送入的值才然有效。也就是说计数器才会与新置入的值进行比较。

PWM部件的输出端与P2.5共用一个引脚,由IOC1.0控制,当IOC1.0为1时,引脚就为PWM引脚,否则就作为P2.5口使用。

③利用HSO产生PWM信号:实际上利用HSO引脚也可产生PWM信号,只要将引脚变高的时间作事件1送入CAM之中,然后再将引脚变低的时间作为另一个事件送入CAM之中。这样在一个PWM脉冲周期内,只要利用两次HSO中断和送两次事件命令,就能不断地产生PWM信号。当然利用HSO部件输出PWM信号,就要求在每个周期内都送两次事件命令到HSO部件中,这比利用PWM部件要麻烦些,但由于HSO部件中使用的定时器是16位的,故利用HSO部件输出的PWM信号要比PWM部件输出的精确得多。利用HSO部件可输出分辨率为16位的占空比信号,不过由于外部元器件的精度等原因,如果作D/A用的话,实际精度是达不到16位的,但还是比8位高得多。

④PWM信号作为D/A信号:PWM信号经过滤波后是可以作为模拟信号使用的,由于8098输出的PWM信号是TTL电平兼容的,为了获得D/A信号,应在滤波电路之前加缓冲器,PWM信号通过滤波电路滤波后,可获得较为平滑的模拟信号。

⑤例:利用PWM部件产生锯齿波。从0逐步增大PWM信号的占空比,经过滤波后就能得到线性良好的锯齿波信号。具体程序见实验程序3。

实验程序1:

AD∶LD CD6,#2E0AH;在数码管上显PAD*-□□□

LD CD4,#0D46H;*表示通道号

LDB CD4,#04H;□□□表示AD的结果

ADL1:ANDB CD4,#07H;

ADDB 02H,CD4,#08H;启动A/D转换器

NOP

NOP

HERE:JBS 02H,3,HERE;判A/D是否转换完

LDB 20H,02H;将A/D的结果送CD0~CD2

LDB 21H,03H

SHR 20H,06H

ANDB 21H,#03H

LD 24H,20H

LCALL RAM-D

LDB CD0,26H

LDB CD1,27H

LDB CD2,28H

LDB CD3,#46H;将显示符一送CD3

SCALL DLO;调延时子程序

INCB CD4;转换另一个模拟通道

CMPB CD4,#08H

JNE ADL2

LDB CD4,#04H

ADL2:SJMP ADL1

DLO:LD 60H,#0FFFH

DL01:LCALL DIRD;调显示子程序

DJNZ 60H,DL01

DJNZ 61H,DL01

RET

实验程序2:

LD SP,#00C0H

STAR:ANDB PORT2,#1101110B;将P2.5和P2.0清零

LOOP:LDB AD-COMMAND,#0CH;启动A/D转换器的通道

NOP

NOP

HERE:JBS AD-RESULT-LO,3,HERE;检测A/D转换是否完成

LDB AH,AD-RESULT-HI;将A/D转换的结果读入A寄存器之中

LDB AL,AD-RESULT-LO

SHR A,#06H;将AD结果的有效位保留

LDB BL,4500H[A];将AD结果数据查表转成对应的温度值

CMP BL,CL;与温度下限值相比较

JNH LOW;若低于下限值;则转到LOW

CMP BL,CL;与温度的上限值相比较

JH HIGH;若高于上限值,则转到HIGH

SJMP STAR;若温度在设定范围内,则转到STAR

LOW: ANDB PORT2,#11111110B;关鼓风机

ORB PORT2,#00100000B

SJMP LOOP

HIGH:ANDB PORT2,#11011111B;关加热器

ORB PORT2,#00000001B;开鼓风机

SJMP LOOP

实验程序3:

ORG 2080H

LDB 30H, #00H;PWM信号暂存器

LDB 40H, #00H

LD SP, #00C0H;将栈指针设定为00C0H

LDB IOC1,#01H;将引脚对选定为PWM输出引脚

LPWM:LDB PWM-CONTROL,30H;将暂存器30H中的内容送PWM寄存器

SCALL DELAY-P

INCB 30H; 将PWM信号占空比增大

SJMP LPWM;循环执行程序

DELAY-P:NOP;延时

LOOPP:DJNZ 40H,

RET

(未完待续)(朱小华 陈尚品 梁建国)