用单片机如何实现交流量的A/D转换

时间:2022-10-19 10:55:04

单片机只能处理数字量而不能处理模拟量,而实际上模拟量随处可见,如电压、电流、温度、压力等等。它们都需要通过单片机进行测量和处理,这就需要将这些模拟量先通过A/D转换(模/数转换)后变为数字量后再由单片机进行处理。随着单片机的集成度及功能的增加,目前已有很多的单片机内集成有 A/D转换器,使用上很方便。在模拟量的测量中最常见的莫过于交流电压及交流电流的测量,而单片机内的A/D转换器通常是用来测量直流或脉动直流的,测量交流量并不方便,因输入脚不允许输入负电平。这需要增加一些电路方能实现对交流电的测量。下面介绍两种交流量的测量方法。

1. 半波交流量测量法

当我们认定交流量是正负对称的波形,那我们只需对其正半周的波形进行测量即可,这实际上就是将交流量的负半周削去,只剩下正半周,然后进行测量(也即前面所讲的脉动直流量测量)。半波交流量测量的电路如图1。

交流电压Vin通过电阻R2、R1分压后,获得A/D转换所需的输入电压,并由单片机A/D输入端AN0输入。通常该输入电压的峰值为+5V,通过R2、R1换算,Vin的峰值为100V,合有效值71V左右。当然也可以改变R2之值来获得不同的电压Vin。Vin通常是通过电压传感器(变压器)或电流传感器(变流器)与被测源耦合而得。

必须指出:AN0输入端的电压峰值(也即允许最大值)必须是+5V,这样才能充分地利用A/D转换中的所有位来达到我们预期的精度。另外一点是,在前面的分压电路中我们还没有考虑到AN0输入端所呈现的输入阻抗(A/D转换器输入端均有一定的输入阻抗,视单片机不同而异),所以最后我们还需用实测来确定R1的值。方法是在Vin端输入直流电压+100V,调整R1之值,使AN0端的直流电压值为+5V。半波测量法的工作原理并不复杂,当Vin为正半周时,二极管D不导通,故正半周的波形能全部保存下来;而负半周时,D导通短路,负半周被削去,此时测量值为零。在正半周时,我们用采样点的方法测量瞬时值,也即将正半周均分为若干等分,每一等分对应的时刻采用A/D变换测出其瞬时值,再代入有关公式中算出有效值或其它的值。

采样点的数量越多,测量的精度也越高,但计算也越复杂,因为这些计算都得通过软件来实现。在实际的测量中,因正半周的起点(0相位点)甄别比较麻烦,通常的办法是测量一个完整的周期,因负值均为0,在计算中不起作用,故其结果和只测量正半周时相同,但却可以从任一时刻开始测量,给测量提供方便。实际上,当波形为正弦波或接近正弦波时,采样点在24点就可以了,本例中采样点为32点。公式:

为计算交流电压有效值的公式,将一周期内各采样点值代入该式便可算出该交流电压的有效值。

内含A/D转换器的单片机种类很多,最常见的有8位A/D和10位A/D,均内带采样保持电路。8位的有51系列中的P87LPC767等,10位的有51系列中的C8051F019、C8051F018,96系列中的80C196KB、80C196KC等,PIC系列中的P16F87X等等。考虑到测量的精度,我们最好选用10位A/D的单片机。10位A/D转换器相对于二进制而言有1024个单位(LSB),当模拟输入的电平为+5V时,其分辨率为每 LSB = 4.88mV,相对误差K为0.1%左右。

在图1中我们选用的单片机为当前较为流行的PIC单片机P16F877,它有8路10位A/D的模拟输入端,且内带采样保持电路,可顺序对8路模拟量进行A/D转换。图中,我们仅用了第一路。A/D转换过程都是通过软件编程来实现的,不同类型的单片机除了编程语言不同外,其工作过程都雷同。图2给出了A/D转换过程的软件流程图。由图可知,A/D转换过程由主程序和中断子程序两部分构成。首先我们将被测交流量的一个周期均分为n等分,本例n取32。对于50Hz的交流信号,每等分的时间间隔约为625μs。

在主程序中先要给定时器T0置初值,开T0中断,使定时器T0在经过625μs后溢出产生T0中断,并进入中断子程序,由中断子程序来完成采样点的A/D转换过程。在中断子程序A/D变换之前还必须延时数μs作为采样保持,A/D转换完成后再将结果(10位数字量,分两个单元存放)存入规定的RAM缓冲区内,再返回主程序。由于n取32,故需中断32次后方能测量完一个周期的交流量。这32次的中断过程都是在主程序Ta~Tb循环等待的时间段内进行的。然后取出32个采样点值代入前面的公式中进行有效值的计算(由软件实施)。之后再进行下一次的测量。在本刊的网站上给出的源程序清单,提供了A/D转换的全过程,32个采样点的结果值如何处理,视要求的不同需再行编程。

2. 全波交流量测量法

当我们测量的交流量正负半周并不完全对称时,特别是电力系统中出故障时,正负波形将会严重失真。此时若用半波测量法显然不能真实地反映被测量的实际值,故必须采用全波交流量测量法。半波测量法是将被测量量削掉负半周,仅将正半周引入测量范围。全波测量法不存在削波,而是将正负半波全部纳入测量范围。要做到这一点,关键的问题是要在电路上设置一个电平移动电路,将被测量的零值锁定于转换范围的中点位置上。对于常用的单片机而言,A/D转换的电平输入范围通常是0~+5V,显然中点电平值是+2.5V。

图3给出了8路全波交流量测量的电路简图,单片机P16F877共有8路模拟量输入端AN0~AN7,因而可以对8路模拟量进行A/D变换。由R1、R2将+5V分压为+2.5V(要求电压+5V稳定),输入交流电压Vin由电压传感器W0~W7隔离而得,其零端接+2.5V,显然已将信号源的零点平移至+2.5V。Vin的电平范围为0~+5V。

A/D转换后的最大值对应于1024位(十六进制为400H),负的最大值对应于0位。零值电平对应于512位(200H),这在编程时应注意。8路A/D转换的过程比图2稍复杂一些,每次进入中断子程序都应按顺序对W0~W7的8路进行A/D转换,并将各路的结果依次存入规定的缓冲区域,才能退出子程序。应该注意的是:8路转换的时间(即子程序运行的时间)比一路要长,但必须小于两相邻采样点的时间间隔(625μs),在本例中,时间是有余的。在主程序中,应取出各路的采样值,分别进行计算与显示。采样点值可代入有关公式求出有效值,也可代入傅氏算法(请参考有关书籍)算出基波及各次谐波值。图3中W0是第一路,其它各路,情况与第一路相同。应该说明的是:图3中的P16F877的第4、第5脚有模拟基准电压(Vref-、Vref+)的功能,它是通过软件对片内的专用寄存器ADCON1进行设置而得(图中设定Vref- =Vss、Vref+ = Vdd,故4、5脚可拿出来做模拟输入端),有的人认为将Vref-(4脚)设置为单独引出接-5V, 使A/D的变换范围扩大到+5~-5V,于是不通过电平移动便可直接对交流量进行A/D变换。实际上这种方法是行不通的,因为4脚作为输入脚接有正、负电压的箝位二极管(作保护用),它的电压输入范围为:+5.7~-0.7V,不可能低到-5V。其实,单片机所有的输入脚(包括AN0~AN4)均接有箝位二极管,模拟输入电压值也不可能低于-0.7V,故而从这些脚输入负电压是无效的。图3的电路虽然简单,但有不足之处。因为Vin为某定值(+2.5V),故电压传感器T0初级的输入电压V由变压比确定而不能随意变动。另外一点是,Vin的零端和单片机的模拟地(Vss)不能相连,这样不利于抗干扰。

图4是一种采用运算放大器构成的电平移动电路,它是利用运算放大器构成的加法器,具有输入阻抗高、输出阻抗低等特点,能与输入电路及单片机很好地匹配。通过加法器可以方便地进行零值电平的设定。输入电压的范围可以通过反馈电阻Rf的大小灵活地进行调节。而且,输入电压的地端可以和单片机的模拟地(Vss)连接,增强其抗干扰性。

由图4可知,运算放大器IC构成一个强负反馈电路,其负输入端(-)Σ为虚地点,可以与地电平等同考虑,但它不消耗电流,并且各路因接虚地点,回路各自独立,计算起来很方便。它们有如下的关系式:

If = I1 + I2

Vo = - If Rf = -(Vin/R1 + V2/R2)Rf

即 Vo =-〔Vin/R1 + (-15V/R2)〕Rf

Rf与R1之比确定该电路的放大倍数,由图中的数据可知,放大倍数为1/2。该结论也可以由上述计算式中得出,当括号中第2项为0时,便可得出上述结果。当改变Rf与R1之比,即可改变Vin的数据,从而可以灵活地改变模拟电压的输入范围。电阻R2的作用是产生电平的平移。在上式中,当括号中的第一项为0时,即可求出R2的具体值。若我们想将零电平移到+2.5V,可求出R2 = 300kΩ。故图4的最后的结果是:当Vin的变化是由+5.0V、0V到-5.0V时,则Vo的相应变化是0V、+2.5V到+5.0V(因从负输入端输入,故输出相位相反)。这样就完全满足了我们的要求,对该电路的实测也证明了上述结论。

当我们要进行多路A/D转换(如8路转换)时,IC可以采用两片四运放芯片。为了满足测量的精度,一是IC采用开环增益尽可能大、精度尽可能高的运算放大器,二是采用稳压的+/-15V供电,电源电压范围宽、线性度好。■

上一篇:低功耗低成本数字时钟的设计与制作 下一篇:上海张江:突破的维度