叨叨游戏网
您的当前位置:首页电能质量监测

电能质量监测

来源:叨叨游戏网


摘要

此电能质量检测装置以数字信号处理技术为核心,能对其频率、电压有效值、电流有效值、有功功率、无功功率、视在功率、功率因数等电能质量参数进行分析,并利用快速傅立叶变换(FFT)分析对数据信号分别进行处理、分析其电压、电流的谐波含有率,并实现数值的LCD显示。通过对各指标的精确计算和分析,能同时显示一个周期内分辨率达1%的输入电压、电流曲线。并利用信号处理仿真软件Matlab实现对软件程序的仿真,减少硬件成本。本系统运行稳定可靠,效果良好。

关键词:电能质量 数字信号处理 谐波

Abstract

This detection installment of electrical energy quality tests and demonstrates some parameters of energy quality that include voltage, electric current, active power, reactive power, appareat power and so on .take the digital signal processing technology as the core, carries on the data using the Fourier's analysis processing, the frequency survey, realized the various targets precise computation and the analysis, the discussion the harmonic influence, proposed the survey, the analysis and the computation harmonic content and included in the harmonic situation the voltage, the electric current content demonstration method. It can simultaneously demonstrate curve for one cycle input voltage and input current and nine subharmonics, the resolution reaches 1%. Realizes through the Matlab simulation, and establishes the software routine, reduces the hardware cost stably, the system is stable and reliable, the effect is good.

Keywords:electric energy quality;digital signal processor;harmonics

目录

一 ,设计任务„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 (一)任务„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 (二)要求„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1、基本要求 „„„„„„„„„„„„„„„„„„„„„„„„„„„„3 2、发挥部分 „„„„„„„„„„„„„„„„„„„„„„„„„„„„3 二,方案的选择与论证 „„„„„„„„„„„„„„„„„„„„„„„„„„„„4 (一)基本方案论证 „„„„„„„„„„„„„„„„„„„„„„„„„„„4 1、电路部分方案选择 „„„„„„„„„„„„„„„„„„„„„„„„4 2、最终方案设计思想及框架示意图 „„„„„„„„„„„„„„„„„„4 (二)总体设计方案„„„„„„„„„„„„„„„„„„„„„„„„„„„„4 三,分析与计算 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„5 四,总电路图及元器件清单 „„„„„„„„„„„„„„„„„„„„„„„„„„7(一)总电路图„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„7(二)元器件清单„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 五,测试 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 (一)测试仪器与设备 „„„„„„„„„„„„„„„„„„„„„„„„„„8 (二)测试方法与过程 „„„„„„„„„„„„„„„„„„„„„„„„„„8 (三)测试数据技术路处理 „„„„„„„„„„„„„„„„„„„„„„„„9 (四)结果分析 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 六,创新与发挥 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 七,心得体会 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10

参考文献„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 附录

一、设计任务

1、任务

设计并制作一个能同时对一路工频交流电(有失真的正弦波)的频率、电压有效值、电流有效值、有功功率、无功功率、功率因数、谐波等进行测量的数字式电能质量监测装置,如图1。设定待测的100~500V交流输入电压、10~50A交流输入电流均经由相应的变换器转换为对应的1~5V交流电压。

Vv(1~5V)100~500V电压变换器检测处理控制10~50A电流变换器Vi(1~5V)监测装置数字显示器键盘

图1

2、要求

2.1 基本部分

(1)测量交流输入电压有效值, 频率:50Hz;测量范围:100~500V;准确度:±0.5%。 (2)测量交流输入电流有效值, 频率:50Hz;测量范围:10~50A;准确度:±0.5%。 (3)测量有功功率P(单位为W)、无功功率Q(单位为var)、视在功率S(单位为VA)

及功率因数PF、有功功率、无功功率、视在功率准确度:±2%;功率因数显示格式:0.00~0.99。

(4)在交流电压、交流电流、有功功率、无功功率、视在功率的测试过程中,能够记录它们

的最大值和最小值。 2.2 发挥部分

(1)测量交流输入电压频率, 测量范围:45~55Hz;误差:±0.001 Hz。 (2)采用LCD显示,能够同时显示一个周期的输入电压、输入电流曲线。

(3)测量电压和电流的各次谐波含量,测量至9次谐波,采用列表和百分数形式显示,分辨率1%

(4)各次电流谐波含有率在列表显示方式中除了能够以百分比显示外,还能够显示各次谐波

的有效值。

二、方案论证

(一)电路部分方案选择

方案一:

全系统应用ATS52作全局控制。信号通过运放进行处理后,用TLC2543进行电压采集实施校正输出,以满足电压输出精度。但由于TLC2543是12位串行模数转换器,虽然节约IO口,但转换速度慢,最大转换时间为10μs,而且题目要求测量交流输入电压、电流有效值,而如需用TLC2543必须外加电路,使得硬件更加繁琐,还会增加误差,不足以满足设计要求的指标。

方案二:

全系统用ATS52作全局控制,通过运放741,进行波形的调整,用5V稳压源进行稳压,让采集的电压、电流交流信号的正弦波,转换成方波,在经过CD4011进行比较,输出其波形的相位差,从而进行下步采集使用。同时通过调节连端的电阻来校正输入数据的准确程度。在通过ADS774进行电压采集实施校正输出, ADS774是12位并行逐次逼近模数转换芯片,其内置基准源2.5V,还具有双极性偏置控制引脚BOC,当此脚接地时,信号为单极性输入方式,此脚接参考电压时,输入为双极性电压,根据管脚的接发,分别能输出0~10V,0~20V,-5~+5V,-10V~+10V,转换时间为8.5μs,仅仅应用了一部分必要的数字电子控制整体系统,本系统的优点在于成本低廉,减少硬件,并满足电压输出精度。

综上所述,设计方案二可以满足设计要求,并且可以有一定的提高空间。 (二)总体设计方案

软件流程图部分:

开始 采集电压,电流 并且计算 N 检测是否有按键按下 每按一次进入下一屏 Y 最后返回循环显示 结束

四屏显示电压谐波的绝对值(九次)五屏显示电压各次谐波含有率(九次)六七屏显示电流各次谐波的绝对值(九次)七屏显示电流各次谐波含有率(九次)八屏同时显示输入电压、输入电流波形图显示流程图部分:

一屏显示电压、电流有效值,功率因数,频率率的效值及它自身最大值最小值。二屏显示有功功率,无功功率,功率因数,视在功三屏显示电压、电流、有功、无功的最大值最小值三、分析与计算

根据题目要求,通过电压、电流互感器,实现高低电压、电流的转换后,采取两片ADS774进行数据模拟量的采集,由51单片机进行大量的数据运算,并采用LCD 显示频率、电压有效值、电流有效值、有功功率、无功功率、视在功率等参数,并记录它们的最大值、最小值。

从一屏开始,按键每按下一次进入下一屏,循环显示

应用取点法,采集波形显示的相应点,画出其波形图。运用因子的周期性和对称性的特点,通过快速傅里叶变换(FFT)计算谐波含有率。采用数学软件MATABL进行先仿真后转换成C语言的形式来实现其功能。

频率f: f=1/T T取50赫兹 功率因数PF: PF=P/S 有功功率P: 视在功率S:

P=UIcos(△t/T)

(W) △t波形相位差

无功功率Q: Q=UIcos

(var)

S= (P2+Q2) 1/2 (VA)

谐波的含有率: HRUn=Un/U1*100% HRIn=In/I1*100% 谐波的有效值:

傅里叶函数分析谐波公式: u(wt)=a0+∑(ancosnwt+bnsinnwt)

四、总电路图及元器件清单 (一)、总电路图:

信号处理电路图:

(二)部分元器件清单:(东洋元件清单与电路有出入,,以电路为准)

元件名称 ATS52 ADS774JP HM62ALP HD74LS373P HD74LS74AP IC4011BP OP07 LCD(OCMJ4*8C) 开关电源 变压器 电解电容 晶振 电位器 电阻 按键 电容 导线 数量 1片 2片 1片 1片 1片 1片 4片 1块 1个 1个 4个 1个 6个 若干 2个 若干 若干 双 2 作用 单片机 模数转换 8K×8RAM 锁存器 D型正沿触发器 输入4与非门 运放 液晶显示 五、测试

(一) 测试仪器与设备:

FLUKE 17B型万用表,GFG-8016G型信号发生器,TDS 3054B型数字存储示波器,

FLUKE 43型谐波分析仪,双路跟踪稳压稳流电源 (二) 测试方法与过程: 1、模块调试

系统的调试分模块进行,再进行整机调试,以提高调试效率。调试过程如下: 输入信号调试:

本电路图采取OP-04,让采集的电压、电流交流信号,由正弦波变成方波,经与非门进行比较,输出波形的相位差,从而进行下步采集使用。同时通过调节两端的电阻校正输入信号。

ADS774增益调节:

ADS774的10脚用来进行增益的调节。为了防止两个电位器互相影响,先调到零点,再调增益,由于本题选择的是双极性的方式-10V~+10V,所以调零点是在接近-10V调电位器r5,让其在00„00~00„01之间跳动,然后在接近+10V调电位器r6,让其在11„11~11„10之间跳动,增益调好。

半刻度校准检查:

设模拟输入电压0.0000V,此时数字码应为10„00 其校准的具体数值:

+9.9951 +9.9902 0.0049 0.0000 -9.9951 -10.0000 模拟输入电压 数码B11B10„B1B0 11„11 11„10 10„01 10„00 00„01 00„00 2、整机系统调试

将整机装入箱中,用线连接好,电源模块,重复以上步骤。 (三) 测试数据: 数据处理:

交流电压 交流电流 频 率 功率因数 万用表记录值 4.740 4.810 示波器显示值: 49.970 0.572 (3.06ms) (fluke17B) (TDS3054B) 实测值 4.734 4.8106 显示值: 49.955 0.574 有功功率(W) 无功功率(var) 视在功率(VA) 显示值: 22794 18697 13038 计算值: 22773 185 13071 交流电压 交流电流 有功功率 无功功率 视在功率 最大值 478.7 47.9 12952 19047 22887 最小值 461.0 47.239 12001 18035 22460 电压谐波的有效值 电压谐波含有率 电流谐波的有效值 电流谐波含有率 基波 373.0 100 36.494 100 2次谐波 004.9 1.266 0.561 1.512

3次谐波 005.5 1.227 4次谐波 004.1 1.046 5次谐波 007.5 1.778 6次谐波 005.4 1.152 7次谐波 001.9 0.452 8次谐波 004.4 0.993 9次谐波 004.9 1.018 给定输入电压、电流都为方波,f=50HZ 电压谐波的有效值 电压谐波含有率 基波 533.8 100 2次谐波 016.2 5.299 3次谐波 182.2 31.94 4次谐波 021.1 4.726 5次谐波 110.9 18.053 6次谐波 028.0 3.792 7次谐波 065.2 12.5 8次谐波 011.4 2.754 9次谐波 020.9 3.915 波形图: 0.854 0.720 0.917 0.802 0.555 0.808 0.910 2.150 2.028 1.0 2.204 1.270 2.074 2.493 电流谐波的有效值 29.3 0.625 4.051 0.345 3.477 0.377 2.902 0.613 1.687 电流谐波含有率 100 2.287 8.138 2.004 4.918 2.238 5.544 2.073 5.745

(四) 结果分析:

测试结果基本与预设数值一致,达到并完成了基本部分和发挥部分要求的指标,实现了对电能质量检测的功能,整体性能稳定,观察清晰、直观。但由于电位及其硬件会随着温度的变化而变化,导致存在一定的误差值。

六、创新点

本设通过采用AD774,直接测量交流脉冲信号,避免了测过零点脉冲信号,增加硬件设备,使得频率更加准确,虽然理论上有用51单片机实现其功能,但是现实生活中却没有用其实现,如果加以优化的,会为工业生产节约很大一部分成本。

七、心得体会

在完成本次任务的同时,除了对电能质量分析有一定的了解,我们还掌握了FFT(快速傅里叶变换)的应用,及其计算方法,并且通过用C语言编程增强了的逻辑思维的紧密型。,同时感谢帮我们点播的老师,让我们发现原来路就在前方的拐角,更重要的是通过本次比赛,让我明白团队具有的非凡意义,在研究与实践中,懂得了理解与尊重,对于今后的路,我们本着不抛弃、不放弃的原则,会继续努力。

参考文献:

李华 MCS-51系列单片机使用接口技术 北京航空航天大学出版社 楼然苗 51系列单片机设计实例 北京航空航天大学出版社 王兆安 谐波抑制和无功功率补偿(第二版) 机械工业出版社 闻伍春 运算放大器在电测技术中的应用 机械工业出版社 付丽琴等 数字信号处理原理及实现 国防出版社 全国大学生电子设计竞赛获奖作品汇编(第一届~第五届) 北京理工大学出版社

附件:(程序)

附件1:

#pragma SMALL #include #include #include #include

#define TURE 1 //FLASH判断忙标志 #define FALSE 0

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long Float xdata

f,phrase,v,c,p,q,s,vb=0,vs=500,cb=0,cs=50,pb=0,ps=25000,qb=0,qs=25000,sb=0,ss=25000; float xdata vxbf[9],cxbf[9],vxbfp[8],cxbfp[8]; int xdata vx[220],cx[220]; float v1,v1p,c1,c1p; sbit rs=P3^0; sbit rw=P3^1; sbit e=P3^2;

#define lcd_bus P1 // LCD数据口 sbit rst=P3^4;

sbit fscanin=P2^7; // 频率测量端口定义

sbit pscanin=P2^6; //功率因数 sbit keyin=P2^5; sbit keyout=P3^3;

#define ad_busl P0 #define ad_bush P2 sbit cs1=P3^5; sbit rc1=P3^4; sbit cs2=P3^0; sbit rc2=P3^1;

void inidelay( ) { unsigned int j;

for (j=1260;j>0;j--); } void lcddelay() { uchar j;

for (j=100;j>0;j--); } void addelay() { uchar j;

for (j=132;j>0;j--); }

void enable_lcd() // lcd写指令子程序 { rs=0; //写指令时序 rw=0; e=1; _nop_(); _nop_();

e=0;

lcddelay();}

void data_lcd() // lcd写数据 { rs=1; //写数据时序 rw=0; e=1; _nop_(); _nop_(); e=0;

lcddelay(); }

void wr_data(uchar da) //向lcd写数据 { lcd_bus=da; data_lcd(); }

void wr_command(uchar comm) //向lcd写指令{ lcd_bus=comm; enable_lcd(); }

void init_lcd() // lcd初始化{ lcd_bus=0x01; rs=0; rw=0; e=1; _nop_(); _nop_(); e=0;

inidelay();

wr_command(0x0c); //整体显示开 }

void clrword() / /清除汉字子程序 {uchar i;

init_lcd(); //LCD初始化子程序 wr_command(0x30); //开启基本指令 wr_command(0x80); for(i=0;i<32;i++) wr_data(0x20); wr_command(0x90); for(i=0;i<32;i++) wr_data(0x20); }

void show1() // 显示界面1子程序 {clrword();

wr_command(0x80); wr_data(0xB5); wr_data(0xE7);

wr_command(0x83);

wr_data(0xD1);

wr_data(0xB9); //第一行“电压:” wr_command(0x90); wr_data(0xB5); wr_data(0xE7);

wr_command(0x93); wr_data(0xC1);

wr_data(0xF7); //第二行“电流:” wr_command(0x88); wr_data(0xC6); wr_data(0xB5);

wr_command(0x8B); wr_data(0xC2);

wr_data(0xCA); //第三行“频率:” wr_command(0x98); wr_data(0xB9); wr_data(0xA6); wr_data(0xC2); wr_data(0xCA); wr_data(0xD2); wr_data(0xF2); wr_data(0xCA);

wr_data(0xFD); } //第四行“功率因数:” void init1() //定时器1初始化子程序 { TMOD=0x91;

TH1=0x00; TL1=0x00; }

uchar ask_q(float bcs,int zs) / / 求权子程序 { uchar fruit; bcs=100; zs=10;

if(bcs>=10*zs)

fruit=(fmod(bcs,10*zs))/zs; else

fruit=bcs/zs; return(fruit); }

void countf(uchar th,tl) // 计算频率子程序 { float period; period=th;

period=period*256; period=period+tl; f=1000000/period; }

void showfc(float fc,uchar addrfc) // 显示频率电流

{ uchar shi,ge,d_1,d_11,d_111; shi=ask_q(fc,10); ge=ask_q(fc,1); d_1=ask_q(fc,0.1); d_11=ask_q(fc,0.01); d_111=ask_q(fc,0.001); shi=shi+48; ge=ge+48; d_1=d_1+48; d_11=d_11+48; d_111=d_111+48;

wr_command(addrfc); wr_data(0x3A); wr_data(shi); wr_data(ge); wr_data(0x2E); wr_data(d_1); wr_data(d_11); wr_data(d_111); }

void showf(float fc,uchar addrfc) // 显示频率{ if(f!=0)

{ showfc(fc,addrfc); } else

{ wr_command(addrfc); wr_data(0x3A); wr_data(0x2D); wr_data(0x2D);} }

void measfpuls() // 测频率脉宽{ uchar th,tl; uint i=0; do

{ i++; }

while(fscanin==1 && i<40000); do

{ i++; }

while(fscanin==0 && i<40000); TR1=1; do

{ i++; }

while(fscanin==1 && i<40000); if(i<40000) { TR1=0; th=TH1;

tl=TL1;

countf(th,tl); } else f=0; TH1=0x00; TL1=0x00; }

void showph() // 显示功率因数子程序 { uchar d_1,d_11,d_111; if(phrase !=0) {

d_1=ask_q(phrase,0.1); d_11=ask_q(phrase,0.01); d_111=ask_q(phrase,0.001); d_1=d_1+48; d_11=d_11+48; d_111=d_111+48; wr_command(0x9C); wr_data(0x3A); wr_data(0x30); wr_data(0x2E); wr_data(d_1); wr_data(d_11); wr_data(d_111); } else

{ wr_command(0x9C); wr_data(0x3A); wr_data(0x2D); wr_data(0x2D); } }

void countp(uchar th,tl) // 计算功率因数子程序 { float puls; puls=th;

puls=puls*256; puls=puls+tl;

phrase=puls*6.28/40000; phrase=cos(phrase); }

void measppuls() // 测相位脉宽子程序 { uchar th,tl; uint i; do

{ i++; }

while(fscanin==1 && i<20000); do

{ i++; }

while(fscanin==0 && i<20000); TR1=1; do

{ i++; }

while(pscanin==0 && i<20000); if(i<20000) { TR1=0;

th=TH1; tl=TL1;

countp(th,tl); } else

phrase=0; TH1=0x00; TL1=0x00; }

int countad(uchar th,tl) // 计算AD数据子程序 {

int amad; amad=th;

amad=amad*256; amad=amad+tl; return(amad); }

int ad1ch() // 电压转换子程序 { uchar adh,adl; int volt; cs2=0; rc2=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); rc2=1; _nop_();

_nop_(); adl=ad_busl; adh=ad_bush; adh=adh & 0x0f; cs2=1;

volt=countad(adh,adl); return(volt); }

int ad2ch() // 电流转换子程序{ uchar adh,adl; int curr; cs1=0; rc1=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); rc1=1; _nop_(); _nop_(); adl=ad_busl; adh=ad_bush; adh=adh & 0x0f; cs1=1;

curr=countad(adh,adl); return(curr); }

// 电压电流储存子程序 {

uchar i;

for(i=0;i<220;i++)

{ vx[i]=ad1ch(); //储存电压 31.5us cx[i]=ad2ch(); //储存电流 31.5us addelay(); //延时 132us } }

void countv() // 电压计算子程序 {

uchar j; v=0;

for(j=60;j<110;j++)

v=v+((vx[j]-2047)/2.6)*((vx[j]-2047)/2.6); v=v/50; //求平均值 v=sqrt(v)*1.25; //求电压 }

void showv(float vzj,uchar addrv) // 显示电压 {

uchar bai,shi,ge,pot01; bai=ask_q(vzj,100); shi=ask_q(vzj,10); ge=ask_q(vzj,1);

pot01=ask_q(vzj,0.1); bai=bai+48; shi=shi+48; ge=ge+48;

pot01=pot01+48; wr_command(addrv); wr_data(0x3A); wr_data(bai); wr_data(shi); wr_data(ge); wr_data(0x2E); wr_data(pot01); }

void countc() // 电流计算子程序 {uchar j; c=0;

for(j=60;j<110;j++)

c=c+((cx[j]-2047)/28.96)*((cx[j]-2047)/28.96); c=c/50; c=sqrt(c)*1.25; }

void measurevc() // 测电压电流子程序 { savevc(); //电压电流存储 countv(); //电压计算 countc(); //电流计算 }

void countpqs() // 计算pqs { p=v*c*phrase; s=v*c;

q=sqrt(s*s-p*p); }

void show2() // 显示界面2子程序 { clrword();

wr_command(0x80); wr_data(0xCA); wr_data(0xD3); wr_data(0xD4); wr_data(0xDA); wr_data(0xB9); wr_data(0xA6); wr_data(0xC2);

wr_data(0xCA); //第一行“视在功率:” wr_command(0x90); wr_data(0xD3); wr_data(0xD0); wr_data(0xB9); wr_data(0xA6); wr_data(0xB9); wr_data(0xA6); wr_data(0xC2);

wr_data(0xCA); //第二行“有功功率:” wr_command(0x88); wr_data(0xCE); wr_data(0xDE); wr_data(0xB9); wr_data(0xA6); wr_data(0xB9); wr_data(0xA6); wr_data(0xC2);

wr_data(0xCA); //第三行“无功功率:” }

void showpqs(float pqs,uchar addrpqs) //显示pqs {uchar wan,qian,bai,shi,ge; wan=ask_q(pqs,10000); qian=ask_q(pqs,1000); bai=ask_q(pqs,100); shi=ask_q(pqs,10); ge=ask_q(pqs,1); wan=wan+48; qian=qian+48; bai=bai+48; shi=shi+48; ge=ge+48;

wr_command(addrpqs); wr_data(0x3A);

wr_data(wan); wr_data(qian); wr_data(bai); wr_data(shi); wr_data(ge); }

void clr_lcd() //清除显示存储器子程序 { uchar y=0x80,x=0x80,k,k1,k2; for(k2=0;k2<2;k2++) {

for(k1=0;k1<32;k1++)

{ wr_command(0x34); //,绘图显示关 wr_command(y); //设定Y地址 wr_command(x); //设定X地址 wr_command(0x30); //开启基本指令 for(k=0;k<8;k++) { wr_data(0x00); wr_data(0x00); } y++; } y=0x80; x=0x88; } }

void show_wave(uchar x,uchar y,uchar z1,uchar z2) { wr_command(0x34); wr_command(y); wr_command(x); wr_command(0x30); wr_data(z2); wr_data(z1);

wr_command(0x36); //绘图显示开 }

void showwave() //显示波形子程序 { uchar xdata w[16],i,j,k,l,x,x1,y,z1,z2; uint xdata z,zz,fz; uchar m=0;

init_lcd(); clr_lcd();

while(vx[m]>2047 && m<110) { m++; }

while(vx[m]<2047 && m<110) { m++; }

if(m>110) m=0; x1=0x80; y=0x80; l=m;

for(k=0;k<8;k++) {

zz=0x8000;

for(i=0;i<16;i++)

{ if(k<4) w[i]=vx[l+2*i]/;

else w[i]=cx[l+2*i]/; if(w[i]<32) {

x=x1+8; y=y+31-w[i]; } else {

x=x1;

y=y+63-w[i]; }

fz=0x8000; z=zz;

for(j=0;jif(w[j]==w[i]) z=z | fz; fz=fz>>1; } z1=z; z2=z>>8;

show_wave(x,y,z1,z2); zz=zz>>1; y=0x80; }

x1=x1+1; l=l+32;

if(k==3)

{ x1=0x84;

l=m; } }

x=0x80;

y=0x9F; z1=0xff; z2=0xff;

for(i=0;i<8;i++)

{ show_wave(x,y,z1,z2); x=x+1; } }

void maxmin() //最值子程序 { if(v>vb) vb=v; if(vcb) cb=c; if(cpb) pb=p; if(pqb) qb=q; if(qsb) sb=s; if(svoid xbfx() //谐波分析子程序{ float vvl,ccl,vxbc,vxbs,cxbc,cxbs,co,si; uchar i,j; float sita;

for(i=0;i<9;i++) { vxbc=0; vxbs=0; cxbc=0; cxbs=0;

sita=(i+1)*0.0628; for(j=1;j<100;j++) { co=cos(sita*j); si=sin(sita*j); //电压

vvl=(float)vx[j];

vvl=(vvl-2047)/2048; vxbc=vxbc+vvl*co; vxbs=vxbs+vvl*si; //电流

ccl=(float)cx[j];

ccl=(ccl-2047)/2048; cxbc=cxbc+ccl*co; cxbs=cxbs+ccl*si; }

vxbf[i]=sqrt(vxbc*vxbc+vxbs*vxbs); cxbf[i]=sqrt(cxbc*cxbc+cxbs*cxbs); }

v1=vxbf[0]; c1=cxbf[0]; }

void xbpec()// 谐波百分比子程序 { uchar i;

for(i=1;i<9;i++)

{ vxbfp[i]=vxbf[i]/vxbf[0]*100; cxbfp[i]=cxbf[i]/cxbf[0]*100; }

v1p=100; c1p=100; }

void main(void) //主函数 { uchar xdata cou,key=0; inidelay();

init_lcd(); init1(); do

{measurevc();

measfpuls(); //测频率脉宽子程序 measppuls(); //测相位脉宽子程序 countpqs(); maxmin();

for(cou=0;cou<200;cou++) inidelay(); if(keyin==0) {

key++; keyout=0; _nop_(); _nop_(); keyout=1;

}

if(key>=8)

{ key=0; } if(key==0) { show1();

showv(v,0x84); //显示电压子程序 showfc(c,0x94); //显示电流子程序 showf(f,0x8C); //显示频率子程序 showph(); //显示相位子程序 }

else if(key==1) {

show2();

showpqs(s,0x84); showpqs(p,0x94); showpqs(q,0x8C); showpqs(sb,0x98); showpqs(ss,0x9C); }

else if(key==2) {

clrword();

wr_command(0x80);

showv(vb,0x80); showv(vs,0x84); showfc(cb,0x90); showfc(cs,0x94); showpqs(pb,0x88); showpqs(ps,0x8C); showpqs(qb,0x98); showpqs(qs,0x9C); }

else if(key==3) { savevc(); xbfx(); xbpec();

for(cou=0;cou<20;cou++) inidelay(); clrword();

showv(v1,0x80); showv(vxbf[1],0x84); showv(vxbf[2],0x90); showv(vxbf[3],0x94); showv(vxbf[4],0x88);

showv(vxbf[5],0x8C); showv(vxbf[6],0x98); showv(vxbf[7],0x9C); }

else if(key==4) { savevc(); xbfx(); xbpec();

for(cou=0;cou<20;cou++) inidelay(); clrword();

showv(v1p,0x80);

showfc(vxbfp[1],0x84); showfc(vxbfp[2],0x90); showfc(vxbfp[3],0x94); showfc(vxbfp[4],0x88); showfc(vxbfp[5],0x8C); showfc(vxbfp[6],0x98); showfc(vxbfp[7],0x9C); }

else if(key==5) { savevc(); xbfx(); xbpec();

for(cou=0;cou<20;cou++) inidelay(); clrword();

showfc(c1,0x80); showfc(cxbf[1],0x84); showfc(cxbf[2],0x90); showfc(cxbf[3],0x94); showfc(cxbf[4],0x88); showfc(cxbf[5],0x8C); showfc(cxbf[6],0x98); showfc(cxbf[7],0x9C); }

else if(key==6) { savevc(); xbfx(); xbpec();

for(cou=0;cou<20;cou++) inidelay(); clrword();

showv(c1p,0x80);

因篇幅问题不能全部显示,请点此查看更多更全内容