登录站点

用户名

密码

电力参数测量

已有 142 次阅读  2012-09-28 15:44   标签测量  电力 

精密整流电路在自动测量

 

1.2 电流信号的电路变换

一般的供电现场电流往往较大,可达到百安数量级,检测方案往往是采用在供电回路中串联一个电流互感器,如100A:5A或20A:5A的。而这里的电流较小,所以我们直接用1A:1A的电流互感器,注意,电流互感器次级不能开路,否则易产生击穿现象。见图1-6所示,图中,与电流互感器并联的电阻就是起防击穿作用,另外也起到将次级电流转换成电压的作用。其后仍然再进行精密整流电路的整流和LC滤波电路的滤波,该部分电路同图S1-3与S1-5相同。

 

 MOV 71H,A;暂存到数据缓冲区

 

JNBADDC A,7BH

MOV 7BH,A

 

;71H*72H  +  —〉7BH、7AH、79H

MOV A,71H

MOV B,72H

MUL AB

ADD A,79H

MOV 79H,A

MOV A,7AH

ADDC A,B

MOV 7AH,A

CLR A

ADDC A,7BH

MOV 7BH,A

由程序可知,其视在功率的计算结果保存在7BH、7AH、79H、78H中。该结果还不是最终结果,仅仅是用于得到有功功率和无功功率的过度结果或称中间结果,不用于显示。

由于1999*1999两者乘积有3个字节便可保存,因此在7BH、7AH、79H、78H中的视在功率值,其最高位7BH中肯定是0。

实际的最大值为19.99*1.999=39.96001,而实际使用39.960精度就很高了,因此可以将结果除以100变为39960(9C18H),这样做既不影响测量和计算的精度,同时又可以将结果控制在两个字节以内,以便于后续的计算程序编制。

除以100不是目的,将较大的数变为两个字节以内才是目的,所以我们可不除以100,而是除以64(2的6次方),以方便用移位指令做除法运算。不过后续使用过视在功率的数其结果还要乘以64。

将7BH(=0)、7AH、79H、78H除以64的的程序思路是右移6次,也可左移两次扔掉最低字节也是一样的。

程序如下:

CHIYI64:

;第一次左移

CLR C

MOV A,78H

RRC A

MOV 78H,A

MOV A,79H

RRC A

MOV 78H,A

MOV A,7AH

RRC A

MOV 7AH,A

;第二次左移

CLR C

MOV A,78H

RRC A

MOV 78H,A

MOV A,79H

RRC A

MOV 78H,A

MOV A,7AH

RRC A

MOV 7AH,A

;高字节传到低字节,实现扔掉低字节。

MOV 78H,79H

MOV 79H,7AH

MOV 7AH,#0

RET

现在79H78H中为有效视在功率1/64数据,最大值为1999*1999/64=62437(F3E5H)

训练项目6  单片机软件系统的设计—频率和相位的测量

1、测量频率参数

测量频率参数只需要一个通道(电压或电流)的脉冲信号,设选用电压通道,由于是低频50Hz左右,因此要采用测周期的方案来换算出频率参数(低频测周期比较精确,高频测频率比较精确)。

由于电压通道接到单片机的外部中断INT0,只要计数两次INT0中断的间隔时间便可换算出频率。间隔时间采用定时器1统计,设晶体振荡器为12MHz,则一个机器周期为1μS,测量的结果保存在75H、74H中,程序如下:

测频准备阶段的程序:

SETB EX0;允许外部中断0中断,以便于测频

MOV TH1,#0

MOV TL1,#0

MOV TMOD,#10H

 

外部中断0中断服务程序:

SETB TR1

JNB P3.2,$

JB P3.2,$

CLR TR1

MOV 74H,TL1

MOV 75H,TH1

RETI

 

2、 测量相位参数

在测频的基础上,利用另外一个通道即电流通道产生的外部中断1中断信号,我们只要统计两个通道的中断间隔时间即得到两个通道相位之间的误差时间,再除以一个周期(测频率时已经测出)的时间,再乘以360,即为相位差。设测量结果报存在77H、76H中,程序如下:

测相准备阶段的程序:

SETB EX0;允许外部中断0中断

SETB EX1;允许外部中断0中断

 

MOV TH1,#0

MOV TL1,#0

MOV TMOD,#10H

 

外部中断0中断服务程序:

SETB TR1

RETI

外部中断1中断服务程序:

CLR TR1

MOV 76H,TL1

MOV 77H,TH1

RETI

测频用到了外部中断0,测相也用到了外部中断0,要区别两个含义不同的外部中断0,需要用一个标志位加以区别。以上检测程序就基本完成了,下面的就是关于这批数据的计算和换算程序了。

现在从70H~77H中均保存了有效数据,这些数据还都没有经过计算和换算,还都是“半成品”,但是我们要清除这里边都是什么数据。复述一遍:

71H、70H中为电压的A/D转换结果

73H、72H中为电流的A/D转换结果

75H、74H中为频率参数的机器周期数

77H、76H中为相位参数的机器周期数(实际上是电压和电流脉冲的时间差)

 

3、频率的计算

频率参数的原始数据被保存在75H、74H中,他还仅仅是一个机器周期数或微秒数(对应于12MHz的晶振),但由它便可获得频率值,因为它是在一个正弦波周期中取得的微秒数,只要求其倒数便可。但是我们选择的AT89C52型号的单片机内部没有求倒数的硬件支持,必须用程序运算,考虑到我们要获得4位数的结果(即XX.XX  Hz),由于75H、74H中的数约为2 0 0 0 0左右,则用100000000这么大的数去除以75H、74H中的数即可。而1 0 0 0 0 0 0 0 0这么大的数需要4个字节来保存,并为05 F5 E1 00H,我们定义7FH7EH7DH7CH中保存该常熟,即:

PINLVJISUAN:

MOV 7FH,#05H

MOV 7EH,#0F5H

MOV 7DH,#0E1H

MOV 7CH,#00H;则被除数7FH7EH7DH7CH中的值为1 0 0 0 0 0 0 0 0。

;除法运算:(7FH7EH7DH7CH)÷(75H74H)à(61H60H)

调用以下DIVm_n子程序,做除法运算,由于该子程序要求将被除数存放于50H以上单元,除数存放于40H以上单元,商被保存在54H以上单元,所以先要将被除数(7FH7EH7DH7CH)和除数(75H74H)存放到相应单元去,调用完子程序后再将商传出到(61H60H)中。

MOV 53H,7FH

MOV 52H,7EH

MOV 51H,7DH

MOV 50H,7CH;被除数

 

MOV 43H,#00H

MOV 42H,#00H

MOV 41H,75H

MOV 40H,74H;除数

LCALL DIVm_n;调用除法运算子程序

MOV 61H,55H;传送商到目标单元

MOV 60H,54H

RET

其结果便为频率值,在61H60H中

;以下为多字节除法子程序

DIVm_n:;可多字节除,仅需修改CHANG(字节)

;n字节除n字节快速运算

;入口参数:被除数_BCS以上N字节,BCS是最低字节

;          除数_CS以上N字节,CS最低字节

;出口参数:商_沿着被除数的最高字节往上继续存

;放其最低字节,共n字节,余数_则覆盖被除数n字节

;使用寄存器:A,C,R0,R1,R2,R3,R6,R7,位F0

 

 

 

BCS EQU 50H;被除数首地址

CS  EQU 40H;  除数首地址

CHANG EQU 4;除数或被除数字节数长度

WEISH EQU CHANG*8;除数或被除数位数

MOV R0,#CS;

MOV R7,#CHANG-1;4-1次相或操作

LOP1:  MOV A,@R0

INC R0

ORL A,@R0

JNZ LOP0

DJNZ R7,LOP1

LJMP DIVRET

LOP0:  CLR A

MOV R0,#BCS+CHANG

MOV R7,#CHANG

LOP3:

  MOV @R0,A

INC R0

DJNZ R7,LOP3

MOV R6,#WEISH;4Byte共32bit

LOP8:

  MOV R0,#BCS

MOV R7,#CHANG*2;被除数连商共8Bbyte

LOP4:

  MOV A,@R0

RLC A

MOV @R0,A

INC R0

DJNZ R7,LOP4

CLR C

MOV R0,#BCS+CHANG

MOV R1,#CS

MOV R7,#CHANG

LOP5:

  MOV A,@R0

SUBB A,@R1

MOV @R0,A

INC R0

INC R1

DJNZ R7,LOP5

JNC LOP6

MOV F0,C

MOV R0,#BCS+CHANG

MOV R1,#CS

MOV R7,#CHANG

CLR C

LOP7:

  MOV A,@R0

ADDC A,@R1

MOV @R0,A

INC R0

INC R1

DJNZ R7,LOP7

MOV C,F0

LOP6:

  CPL C

DJNZ R6,LOP8

MOV R0,#BCS

MOV R1,#BCS+CHANG

MOV R7,#CHANG

LOP9:

  MOV A,@R0

RLC A

MOV R3,A

MOV A,@R1

MOV @R0,A

MOV A,R3

MOV @R1,A

INC R0

INC R1

DJNZ R7,LOP9

DIVRET:

RET

 

 

4、相位的计算

对于功率因素cosφ,必须先求出相位差值φ,然后对φ求余弦即可得出。

首先求φ,由电流和电压脉冲的时间差,被保存在77H、76H中,先求与频率的比值,再乘以360,就是相位差值φ了。

该运算法则为(x/y)*360,由于x总小于y,其做除法的结果小于1,结果以0来体现,这不是我们希望的。经验告诉我们,在设计单片机应用程序的乘除混合运算时,要先做乘法后做除法,这样才能获得较高的准确度。除非我们采用编制浮点运算程序。这里我们用的是定点运算。

我们先做x*360的程序,将360(即十六进制数0168H)先保存在某两个字节中,编制象视在功率计算的程序那样的那个子程序(SZGL: ),这里不再重复,设乘法运算结果保存在63H62H61H60H中,再除以75H、74H中的频率参数的机器周期数,其方法是:先传递好被除数和除数参数,再调用除法子程序,然后将结果传送到目的地即可,这里也不再重复,设目的地地址为63H62H。其值为0~359。

训练项目7  单片机软件系统的设计—功率因素的计算

相位差φ求出来了,我们要做余弦运算,才能获得功率因素cosφ。单片机不支持硬件的余弦运算,软件运算也相当的复杂,而采用查表的方法便简单的多。

设表格在程序存储器某区域,用指令DB或DW便很容易定义一个余弦表,然后用查表指令MOVC就可获得余弦值,即功率因素cosφ。

为查表方便,我们需要对63H62H中的0~359进行变换,将0~90作为基数,大于90的可换算为0~90,设换算结果保存在寄存器B中,换算思路为:

if(63h62h>=360)then{ERROR};出错

else

if((63h62h>=270)&(63h62h<360))then{xiangxia4};第四象限

else

if(63h62h>=180)then{xiangxian3};第三象限

else

If(63h62h>=90)then{xiangxian2};第二象限

else

{xiangxian1};第一象限

;调用相应的象限子程序都换算为第一象限进行计算即可。

 

判断象限子程序如下:

;PD_XIANGXIAN:

MOV A,63H

JZ XIAOYU_4;如果(63H)=0则小于不可能为第四象限

CJNE A,#1,ERROR;如果(63H)<>1则出错了

MOV A,62H; 如果(63H)=1则判断62H,

CJNE A,#14,N_N;256+14=270,62H>=14为第四象限, <14为第三象限

N_N:

JC XIANGXIAN3;A-14<0,表示62H<14,为第三象限,转

LCALL XIANGXIAN_4;否则62H>=14, 为第四象限,调用第四象限子程序

RET

XIANGXIAN3:

LCALL XIANGXIAN_3;调用第三象限子程序

RET

XIAOYU_4: ;(63H)=0的情况,只要检查62H就可以了,62H的最大值为255,如果>=180则第三象限

MOV A,62H

CJNE A,#180,N_180;A-180

N_180:

JC DI2_DOWN;减的结果<0表示179以下,即第二象限以下

LCALL XIANGXIAN_3;否则就为第三象限,调用

RET

DI2_DOWN:

CJNE A,#90,N_90;A-90

N_90:

JC DI1;减的结果<0表示89以下,即第一象限

LCALL XIANGXIAN_2;否则就为第二象限,调用

RET

DI1:

LCALL XIANGXIAN_1;调用第一象限子程序

RET

ERROR:

;出错处理,如直接返回,或加些灯泡指示报警

RET

;对于第四象限转换为第一象限的思路是,由于

;359度和1度的绝对值对应,

;358度和2度的绝对值对应,

;。。。。。。。。。。。。。

;。。。。。。。。。。。。。

;271度和89度的绝对值对应,

所以,我们判断第四象限置一个标志,用于显示时显示负数,其计算为用360(度)-63h62h(度)即对应到第一象限,仅仅是绝对值误差一个负号而已。

 

;对于第三象限转换为第一象限的思路是,由于

;181度和1度的绝对值对应,

;182度和2度的绝对值对应,

;。。。。。。。。。。。。。

;。。。。。。。。。。。。。

;189度和89度的绝对值对应,

所以,我们判断第三象限置一个标志,用于显示时显示正数,其计算为用63h62h(度)-180(度)即对应到第一象限,而绝对值与第一象限相同,为正。

 

;对于第二象限转换为第一象限的思路是,由于

;179度和1度的绝对值对应,

;178度和2度的绝对值对应,

;。。。。。。。。。。。。。

;。。。。。。。。。。。。。

;91度和89度的绝对值对应,

所以,我们判断第二象限置一个标志,用于显示时显示负数,其计算为用180(度)-63h62h(度)即对应到第一象限,仅仅是绝对值误差一个负号而已。

 

第四象限转换为第一象限子程序为

XIANGXIAN_4:

BIT_XX1=0;

BIT_XX2=0;

BIT_XX3=0;

BIT_XX4=1;置第四象限标志

;调用减法程序,用360-(63H62H)并传到B寄存器中推出,360=0168H

MOV A,#68H

CLR C

SUBB A,62H

MOV B,A

MOV A,#01H

SUBB A,63H

CLR ERR

JC ERROR_4

RET

ERROR_4:

SETB ERR

RET

 

 

第三象限转换为第一象限子程序为

XIANGXIAN_3:

 

BIT_XX1=0;

BIT_XX2=0;

BIT_XX3=1; ;置第三象限标志

BIT_XX4=0;置第四象限标志

;调用减法程序,用(63H62H)-180并传到B寄存器中推出,180=0B4H

MOV A,62H

CLR C

SUBB A,#0B4H

MOV B,A

MOV A,63H

SUBB A,#0

CLR ERR

JC ERROR_3

RET

ERROR_3:

SETB ERR

RET

 

第二象限转换为第一象限子程序为

XIANGXIAN_2:

BIT_XX1=0;

BIT_XX2=1;置第二象限标志

BIT_XX3=0;

BIT_XX4=0

;调用减法程序,用180-(63H62H)并传到B寄存器中推出,180=0B4H

MOV A,#0B4H

CLR C

SUBB A,62H

MOV B,A

RET

 

第一象限子程序为

XIANGXIAN_1:

BIT_XX1=1; 置第二象限标志

BIT_XX2=0;

BIT_XX3=0;

BIT_XX4=0

MOV B,62H

RET

 

这样我们只要建立0~90的余弦表即可。

下面编制的是求余弦即功率因素cosφ程序,指令如下:

;先定义一个表格为余弦表

YUXIAN_TAB:;(每度占两个字节)

DB 99H,99H,99H,98H,99H,94H,99H,86H,99H,76H;   0°à  4°的余弦值

DB ……

DB ……

DB 08H,72H,06H,98H,05H,23H,03H,49H,01H,75H;   85°à 89°的余弦值

;查表程序,根据B寄存器中的值(0~90)查表

MOV DPTR, #YUXIAN_TAB

MOV A,B

ADD A,B

MOV B,A

MOVC A,@A+DPTR

MOV 64H,A

INC B

MOV A,B

MOVC A,@A+DPTR

MOV 65H,A

RET

其结果在65H64H中,为功率因素cosφ,存储的是BCD形式的数,可直接用于显示,显示的值前应价0和点(.),为纯小数。如:

0度时为0.9999,(非常接近1)

1度时为0.9998,

……

……

89度时为0.0175(非常的小了)

然而还没考虑到符号和出错。这两个问题只有在显示程序中才可加以考虑,1是加不加负号的问题,二是出错报不报警的问题,后续(显示程序)讨论。

如果要用于计算,则需要换算成16进制数。

 

训练项目8  单片机软件系统的设计—有功功率和无功功率的计算

1、有功功率的计算与分析

由前面关于视在功率的编程可知,视在功率的计算结果已经保存在了7BH、7AH、79H、78H中,其中7BH为0,而7AH、79H、78H中的数已经除以64了,则7AH中也为0,只有79H78H中为双字节的有效数据。要与功率因素相乘,便得到了有功功率的1/64。然后再乘以64。

需要注意的是,视在功率是16进制数,而65H64H中的功率因素还仅仅是适合于显示的BCD数,要想做16进制乘法,还必须将功率因素转换为16进制数。转换程序较为简单,就不加注释了,设BCD数在65H64H中,转换为16进制后,其结果传到69H68H。

 

BCDTOHEX:

MOV 68H,#0

MOV 69H,#0

 

MOV A,64H

 

ANL A,#0FH

MOV 68H,A

 

MOV A,64H

 

ANL A,#0F0H

SWAP A

MOV B,#10

MUL AB

ADD A,68H

MOV 68H,A

;完成第一字节单独转换

MOV A,65H

 

ANL A,#0FH

MOV 69H,A

 

MOV A,65H

 

ANL A,#0F0H

SWAP A

MOV B,#10

MUL AB

ADD A,69H

MOV 69H,A

;完成第二字节单独转换

MOV A,69H

MOV B,#100

MUL AB

ADD A,68H

MOV 68H,A

MOV A,B

ADDC A,#0

MOV 69H,A

;完成二个字节合并

RET

 

要获得有功功率,需要进行乘法运算,即视在功率在79H、78H中,功率因素在69H、68H中,都是16进制了,可以直接相乘了,设乘积的结果保存在6DH、6CH、6BH、6AH中,这是典型的双字节乘双字节的程序,结果为4字节,可参考视在功率计算时的双字节乘法程序编制,这里不再赘述。

6DH、6CH、6BH、6AH为1/64的功率因素值,需要乘以64才行,总共需要1999*1999/64*9999*64=39956013999=094D9063AFH,需要5个字节保存数据。

乘以64可用除以4乘以256的方法进行,即右移两位并在其后加一个字节的0。程序较简单,这里不加注释。

CHENG64:

CLR C

MOV A,6DH

RRC A

MOV 6DH,A

 

MOV A,6CH

RRC A

MOV 6CH,A

 

MOV A,6BH

RRC A

MOV 6BH,A

 

MOV A,6AH

RRC A

MOV 6AH,A

 

MOV 6EH,6DH

MOV 6DH,6CH

MOV 6CH,6BH

MOV 6BH,6AH

MOV 6AH,#0

 

RET

 

可知,字节数太多,低位很多位用不着,可再进行变换,最后保留4位十进制有效数字。

因为最大值是39956013999,如果只保留4位有效位3995(显示的值为39.95),单位为瓦特,可除以10000000即可,可参见前述除法子程序。

39956013999=094D9063AFH,赋给被除数

10000000=989680H,赋给除数,

还要将程序里的CHANG EQU 4改为CHANG EQU 5(5为5字节除法)。调用完子程序后,保留最低两个字节即可。设结果在最低两字节6BH6AH中

 

2、无功功率的计算程序分析

无功功率的计算和有功功率的计算非常相似,所不同的是,有功功率计算时采用的是余弦表,而无功功率的计算时需要采用正弦表,所以,只要将余弦表改为正弦表这唯一的区别外其余完全性同。这里不再复述。

训练项目9  单片机软件系统的设计—按键和显示程序的设计

1、按键程序的设计

由图S3-2,按键采用的是P2.4~P2.7,设分别为显示频率、功率因素、有功功率、无功功率,则按键程序对应如下:

MOV A,#0F0H

ORL P2,A

MOV A,P2

JB ACC.4,N_PINLV

SETB PINLV_VIEW_FLAG

CLR GLYS_VIEW_FLAG

CLR YOUGONG_VIEW_FLAG

CLR WUGONG_VIEW_FLAG

RET

N_PINLV:

JB ACC.5,N_GLYINSU

CLR PINLV_VIEW_FLAG

SETB GLYS_VIEW_FLAG

CLR YOUGONG_VIEW_FLAG

CLR WUGONG_VIEW_FLAG

RET

N_GLYINSU:

JB ACC.6,N_YOUGONG

CLR PINLV_VIEW_FLAG

CLR GLYS_VIEW_FLAG

SETB YOUGONG_VIEW_FLAG

CLR WUGONG_VIEW_FLAG

RET

N_YOUGONG:

JB ACC.7,N_WUGONG

CLR PINLV_VIEW_FLAG

CLR GLYS_VIEW_FLAG

CLR YOUGONG_VIEW_FLAG

SETB WUGONG_VIEW_FLAG

RET

N_WUGONG:

RET

注意程序中为考虑到键盘抖动,实际教学中应在程序中加以改善。

 

2、显示程序的设计

 

显示程序应设计在主程序中,并不停的循环调用,否则容易停显,其格式为:设显示程序的程序名为VIEW_LED

其结构为

MAIN:

;任务1;

;任务2;

;………;

;任务n;

LCALL VIEW_LED;显示程序

LJMP MAIN

显示程序结构为:

VIEW_LED:

    ;第一个数码管显示

  MOV     DPTR,#TAB

        MOV     A,70H

        MOVC    A,@A+DPTR

        CLR     ACC.7    ;点亮小数点

        MOV     P0,A

        CLR     P2.0

        LCALL   DELAY

        SETB    P2.0

    ;第二个数码管显示

        MOV     DPTR,#TAB

        MOV     A,71H

        MOVC    A,@A+DPTR

 

        MOV     P0,A

        CLR     P2.1

        LCALL   DELAY

        SETB    P2.1

    ;第三个数码管显示

        MOV     DPTR,#TAB

        MOV     A,72H

        MOVC    A,@A+DPTR

        MOV     P0,A

        CLR     P2.2

        LCALL   DELAY

        SETB    P2.2

     ;第四个数码管显示

        MOV     DPTR,#TAB

        MOV     A,73H

        MOVC    A,@A+DPTR

        MOV     P0,A

        CLR     P2.3

        LCALL   DELAY

        SETB    P2.3

        RET

TAB:    DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

 

 

注意程序中要考虑以下几个问题:

1)由于按键定义了四个显示项目标志,在调用显示程序前应先把要显示的数据准备好并传送到显示缓冲区;

2)各显示项目要考虑到显示的小数点;

3)要考虑功率因素的正负号。

上一篇: stm32应用例程 下一篇: 如何正确的使用示波器

分享 举报