主页 > 案例大全 > 论文案例大全-交流电流三次谐波测量

论文案例大全-交流电流三次谐波测量

2021-04-23 14:10:54

  电力系统中的谐波可能对电力系统的稳定运行造成危害,而谐波中往往三次谐波成分较多,因此,测量三次谐波可以为电力系统稳定运行提供保障。本设计使用Keil和Proteus两个软件进行仿真,对电力系统中的三次谐波进行测量。首先,通过两个电流源模拟电力系统中的基波和三次谐波,将这两个信号叠加后进行处理并进行A/D转换。然后将采样值送给单片机,单片机对采样值进行傅利叶计算得到三次谐波的幅值和大致波形。最后将三次谐波的幅值和波形在液晶显示器上显示。本设计仅能对整数次数的谐波进行测量,而不能测量非整数次数的谐波。

  第一章电力系统谐波测量的意义、方法和发展趋势

  1.1电力系统谐波测量的意义

  电力系统的电流测量可以为继电保护和电能计量提供依据,也可以为电力系统的有功功率、无功功率潮流的计算提供数据。而随着各种整流装置、变频设备和大量家用电器接入电力系统,电力系统运行过程中的电流也混入了各种各样的谐波,谐波会对电力系统造成诸多不利影响。

  谐波对电力系统造成的不利影响及危害有:1、谐波会增加发、输、用电设备的损耗。2、影响继电保护装置和自动化装置的可靠性和正常工作。3、影响电力系统中测量和计量仪器的准确性。4、干扰通信系统的正常工作。5、对电力电缆的运行造成影响。6、引起电网局部的并联谐振和串联谐振。7、干扰弱电系统的相关设备。

  谐波带来的危害遍及发电、变电、输电、配电、用电以及通讯等方面,如何将谐波的危害降到最低,是现在电力系统关注的重要问题之一,解决这一问题的关键就在于对电网中谐波的成分、幅值等参数进行定量测量。

  1.2谐波测量的方法和发展趋势

  早期谐波测量是用模拟滤波器实现的,这个方法的原理是将采样来的信号经放大后送入滤波器,滤波器的中心频率固定为基波的整数倍,这样就能滤出整数次谐波,将经过滤波器的信号送入多路显示器就能显示谐波的成分及其幅值。这种方法的优点是结构简单,成本低;缺点是滤波器受参数影响很大,外界环境发生变化而影响到滤波器的参数时,就不易获得较为精确的测量结果。

  现在的谐波测量大多采用基于变换的谐波测量方法和基于瞬时无功功率理论的谐波测量方法。前者运用傅利叶变换的基本原理,将数字化的采样数据用傅利叶算法进行计算从而得到测量谐波的幅值,这种方法精度较高,使用方便,相比于模拟滤波器方法来说受硬件参数的影响小;其缺点是运用傅利叶算法,计算量大,计算时间相对较长,且无法测量非整次谐波。后者运用瞬时无功功率理论,将三相电流信号变换到坐标系中,用相量和矩阵的运算方法得到基波分量,再将测得的三相电流信号减去基波分量即可得到三相谐波参数,这种方法响应快,延时小,检测谐波的同时能补偿无功功率,但它结构复杂,且其算法适用于三相电路而不适用于单相电路。

  自适应谐波检测方法也是现在常用的一种谐波检测方法。它是由一个有源电力滤波器和一个非线性负载组成,通过各种自动控制模块形成闭环回路,流过非线性负载的电流经电流互感器测量,然后使用有源电力滤波器产生一个基波电流,非线性负载的电流减去基波电流即可得到谐波电流,这种方法的好处是测量时只需知道基波的幅值和频率即可将除基波以外的所有谐波全部测出,且由于搭建了闭环回路,其自适应能力好;其缺点是在测量前难以得到基波的相位和各高次谐波的幅值与相位,导致其测量精度有待提高。

  人工神经网络测量方法是现在比较受关注的测量方法,其原理是选择合适的训练样本送入人工神经网络进行训练,然后将采样样本输入经过训练的人工神经网络即可得到谐波的参数,这种方法也可以与自适应谐波检测方法结合从而提高获得结果的精度。

  现在,谐波检测的软件算法向智能化、多功能实用化方向发展,硬件设备则向更加可靠、快速、精确的方向发展以满足软件算法的需要,谐波检测的结果向更高精度和更快速度发展,同时,谐波检测分析与控制理论相结合使得测量、控制能够一体化,集成度更高从而使得整个测量系统成本更低。

  第二章设计方案和原理

  2.1基本原理简述

  本文设计了一个以AT89C55单片机为主要核心控制器的电力系统三次谐波测量系统。其主要由AT89C55单片机、AD1674转换器,AMPIRE—128×64显示器、LM311运算放大器、OPAMP运算放大器、TRAN-2P2S变压器和两个ISINE电流源组成。

  其工作原理为:首先由信号源产生基波和三次谐波的交流电流信号,然后通过TRAN-2P2S和100欧姆的电阻将电流转变为幅值较小的电压信号,然后通过OPAMP运算放大器和LM311运算放大器组成的电压放大器获得交流采样信号,并将信号通过过零比较电路获得AD转换控制信号,用控制信号控制AD转换,将交流采样信号由模拟信号转换为数字信号,随后单片机对数字信号进行计算处理,并将计算的结果通过AMPIRE 128×64显示器显示出来。

  2.2算法原理简述

  本设计的计算部分使用傅利叶算法,傅利叶算法的公式如公式2-1和公式2-2。

  (2-1)

  (2-2)

  单片机不能处理连续信号而能处理离散的数字信号,因此不能直接用原始的傅利叶算法,需要将傅利叶算法进行离散化处理,离散之后的傅利叶算法公式为公式2-3和公式2-4。

  (2-3)

  (2-4)

  根据离散的傅利叶算法可以得到a与b的值,再根据如公式2-5所示的电流有效值计算公式即可得到测量电流的有效值

  (2-5)

  2.3使用软件简介

  本设计使用的软件为keil和proteus。

  2.3.1 Keil软件使用方法简介

  Keil是一款51系列单片机C语言开发软件,包括C编译器、宏汇编、链接器、库管理等部分。使用时,要先执行菜单中的命令“Project”→“New Project”,然后选定存储地址并保存。保存后将弹出“Select Device for Target‘Target1’”对话框,如图2.1,在此对话框中可以选择使用的单片机型号。

  图2.1 Select Device for Target‘Target1’对话框

  选择单片机并点击“OK”后,点击“File”→“New”建立一个文件,然后点击“File”→“Save As”将其保存为“.c”格式。然后在文本框中输入程序,并将C语言源文件通过双击左侧“Source Group 1”文件添加入工程。最后点击“Translate”按钮即可进行编译。若要产生“.hex”格式的文件,则需要在“Project”→“Options for Target‘Target 1’”对话框中寻找“Output”栏并勾选“Create HEX File”选项。

  2.3.2 Proteus软件使用方法简介

  Proteus是一款用于单片机及外围器件模拟仿真的软件,拥有原理布图,PCB自动或人工布线和电路仿真等功能。启动proteus进入工作页面,如图2.2所示,工作页面包括标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真控制按钮、预览窗口、对象选择窗口、图形编辑窗口等。

  图2.2 Proteus工作页面

  绘制仿真电路图前,要将图中所用元件从库中选出来,同一个元件不管图中用多少次都只从库中取一次。从元件库选择元件时,单击图2.2中的“P”按钮弹出如图2.3的“选择元器件”对话框,然后在“关键字”栏中输入所需元件的全称或部分名称即可查询到所需元件。随后双击所需元件即可将元件添加至对象选择窗口。

  绘制电路图时,需要先将元件放置在编辑区,在对象选择窗口中选中所需元件,然后在编辑区任意位置单击鼠标左键即可放置元件。元件放置完成后需要用光标将各个元件的引脚连接。连线时,将鼠标移动到一个对象的引脚末端附近,单击左键后移动鼠标到另一个对象的引脚末端附近并再次单击左键即可完成一次连线。全部连接设置完成之后即可进行元件参数设置,以电阻为例,在需要修改参数的元件上双击鼠标左键可以弹出如图2.3的“编辑元件”对话框,可以在这个对话框中对元件参数进行修改,修改完成后点击“确定”即可保存元件参数。

  电路图绘制完成后,单击菜单“工具”→“电器规则检查”,弹出如图2.4的窗口,当窗口中有“No ERC errors found”字样时表示电器规则无误,这时就可以点击运行仿真按钮进行仿真。

  本设计是直接使用扩展名为“hex”的十六进制文件进行调试的,首先在keil中建立新工程,编写C语言程序并编译产生hex文件,然后将hex文件载入单片机中,随后进行仿真观察仿真结果是否符合预期,并对不符合预期的部分程序进行修改。

  图2.3“编辑元件”对话框

  图2.3 Proteus选择元器件对话框

  图2.4电气规则检查窗口

  第三章硬件和软件部分

  3.1硬件部分

  3.1.1单片机简介

  本设计采用的单片机为AT89C55单片机,其引脚如图3.1。

  XTAL1:片内振荡电路的输入端,是外接晶体的一个引脚。

  XTAL2:片内振荡电路的输出端,是外接晶体的另一端。

  RST:复位控制输入端,当振荡器运行时,在此引脚上出现两个机器周期的高电平,使单片机复位。

  片外程序存储器读选通信号输出,从外部程序存储器中取指令或数据期间,在每个机器周期内有效两次,本设计由于没有使用片外程序存储器,因此这个引脚不接。

  ALE:允许地址锁存输出端,提供把低字节地址锁存到外部存储器的信号,由于本设计没有使用外部存储器,因此这个引脚也不接。

  片内、片外程序存储器,当这个引脚为高电平时,访问片内存储器,当这个引脚为低电平时,访问片外存储器。由于本设计使用片内存储器,因此这个引脚接+5V。

  输入/输出端口引脚P0、P1、P2、P3:四个端口均为八位输入/输出端口,其中P3口具有双重功能,作为第一功能使用时,其与P1口功能相同。P3口的第二功能见表3.1:

  表3.1 P3口的第二功能

  端口引脚第二功能

  RXD串行输入口

  TXD串行输出口

  外部中断0输入线

  外部中断1输入线

  定时器0外部输入

  定时器1外部输入

  外部数据存储写选通信号输出

  外部数据存储读选通信号输出

  本设计需要用到的输入/输出接口有4个,P0口用于与AD转换器数据输出端口的连接;P1口与液晶显示器的数据端连接用于与液晶显示器交换数据;P2口作为控制端口,分别于AD转换器和液晶显示器连接,与AD转换器连接的引脚用于控制AD转换器的启停,设置AD转换器的工作模式,与液晶显示器连接的引脚用于对液晶显示器进行设置;P3口与外电路连接,用于接收信号处理后得到的方波信号,并由此信号产生倍频信号驱动AD转换器。

  图3.1 AT89C55单片机引脚图

  3.1.2信号源和调理部分

  本设计的信号源和调理部分的接线图如图3.2,电流互感器TR1变比为1:500,设TR1电源侧电流为,则输入电压跟随器的电压为

  (公式3-1)

  电压放大器的输出电压为

  (公式3-2)

  图3.2信号源和调理电路接线图

  3.1.3 AD转换部分

  由于本设计的AD转换是对三次谐波电流幅值进行转换,因此需要高精度、快速、双极性的AD转换器,使用双极性12位逐次逼近型AD转换器即可满足要求,备选AD转换器有AD7321和AD1674,经过编程测试,发现AD7321无法满足要求,其转换结果存在与实际结果不相符的情况,因此AD转换使用AD1674转换芯片,图3.3为该芯片与单片机AT89C55系统的连接图,AD1674的控制表见表3.2。AD1674的引脚可分为逻辑控制端口、并行信号输出端口、模拟信号输入端口和电源端口四种类型。

  1.逻辑控制端口

  12/:数据输出位选择端,若为高电平,则输出12位,若为低电平,则输出8位。

  :片选信号输入端。

  R/C:读/转换状态输入端。完全控制模式时高电平为读状态,独立工作模式时,在输入信号的下降沿开始转换。

  A0:输出位数控制端,R/C=1,12/=0时,若A0=0,则输出高八位数据,若A0=1,则输出低四位数据。

  STS:转换状态端,此端口输出为1时表示转换正在进行,输出为0时表示转换结束。

  2.并行数据输出口

  DB11~DB4为高八位数据输出口,DB3~DB0为低四位数据输出口。

  3.模拟信号输入端

  10VIN:10V范围输入端,包括0~10V单极性输入或±5V双极性输入。

  20VIN:20V范围输入端,包括0~20V单极性输入或±10V双极性输入。

  4.供电电源端口

  REFOUT:+10V基准电压输出端。

  REFIN:基准电压输入端,在10V基准电源上接50Ω电阻后连于此端。

  VAS:+12V/+15V模拟供电输入。

  VEE:-12V/-15V模拟供电输入。

  AGND:模拟接地端。

  BIPOFF:双极电压偏移量调整端,与REFIN接法相同。

  图3.3 AD1674与单片机系统的连接图

  表3.2 AD1674控制表

  执行操作

  0××××无操作

  ×1×××无操作

  1 0 0×0启动12位数据转换

  1 0 0×1启动8位数据转换

  1 0 1 1×允许12位并行输出

  1 0 1 1 0允许高8位输出

  1 0 1 0 1允许低4位输出

  3.1.4显示部分

  本设计的显示要求为显示三次谐波有效值和大致波形,由于需要显示电流波形,因此一般的数码管显示器无法完成此功能,要完成显示波形的功能,需要使用图形点阵显示器。由于设计要求使用KS0108控制的液晶显示器,因此查询Proteus元件库后选择AT89C55单片机和AMPIRE 128×64显示器,如图3.5,采用P1口进行输出,P2口对显示器进行设置和控制。AMPIRE—128×64显示器的各个引脚功能见图3.6。

  显示器显示汉字时,需要用到16×16的点阵,在这个点阵中显示特定的点即可组成汉字,这些点的数据可以通过字模提取软件获得,如图3.4,对于AMPIRE—128×64液晶显示器,汉字取模要使用纵向取模,字节掉转并采用C语言编码方式,在点阵信息里会展示组成汉字的点的信息,将这些点在液晶屏上显示即可组成“南”字。

  图3.4汉字字模提取软件

  图3.5显示部分接线图

  图3.6显示器各个引脚功能

  3.2软件部分

  软件部分包含显示部分、AD转换部分和主函数。

  3.2.1显示部分

  显示部分主要包含忙检查函数,选屏函数,清屏函数,初始化函数,写数据函数,写命令函数,设置显示位置函数,汉字、字符显示函数和波形绘制函数。

  忙检查函数主要完成对显示器忙状态的检查,可以定义一个变量,将其幅值为P1口的值,将这个变量不断按位与0x80来检查忙标志位,若处于忙状态,则等待,若不处于忙状态,则可以写数据或命令,其流程图见图3.7。

  图3.7忙检查函数流程图

  忙检查函数的代码如下:

  check_busy()//忙检查

  {

  unsigned char state;

  RS=0;

  RW=1;

  do

  {

  P1=0xff;

  E=1;

  state=P1;

  E=0;

  }

  while(state&0x80==0x80);//若忙,则等待

  }

  选择显示区域函数要完成根据形参的值选择左屏或右屏或全屏的功能,用switch语句,判断输入的形参为0还是1还是其他,若为0,选左半屏,1选右半屏,其他选全屏,流程图见图3.8。

  图3.8选择显示区域函数流程图

  选择显示区域函数代码如下:

  yj_xp(unsigned char index)//液晶显示器选择显示区域

  {

  switch(index)

  {

  case 0:{CS1=0;CS2=1;break;}//CS1=0;CS2=1;//选择左半屏

  case 1:{CS1=1;CS2=0;break;}//CS1=1;CS2=0;//选择右半屏default:{CS1=0;CS2=0;break;}//选择全屏

  }

  }

  清屏函数主要完成对显示屏清屏,清除显示屏上之前已经显示的内容,用循环选择所有行列写入数据0即可清除所有显示,流程图见图3.9。

  图3.9清屏函数流程图

  清屏函数代码如下:

  void yj_qp()//清屏

  {

  unsigned char i,j;

  yj_xp(2);

  for(i=0;i<8;i++)//循环,选择所有行和列

  {

  wc1(i|0xb8);

  wc1(0x40);

  for(j=0;j<64;j++)//清除所有显示

  {

  wd1(0x00);

  }

  }

  }

  初始化函数主要完成对液晶显示屏的初始化,设置显示起始行,清除所有已显示内容的功能,主要通过写命令函数完成,其流程图如图3.10。

  图3.10初始化函数流程图

  初始化函数的代码如下:

  yj_cs()//液晶初始化

  {

  yj_xp(2);

  wc1(0xc0);//设置起始行

  wc1(0x3f);

  yj_qp();//清屏

  }

  写数据函数与写命令函数类似,写数据函数主要完成对液晶显示屏写入需要显示的数据,而写命令函数则是向液晶显示器写入控制显示器的命令,二者在程序上的不同仅为RS的设置。首先需要进行忙检查,若显示器是忙状态,那么既不能写数据也不能写命令,要等待显示器不忙才能进行写操作,若显示器不处于忙状态,则将RW置为0,E置为1,写数据函数需要将RS置为1,而写命令函数要将RS置为0,然后将需要写入的数据或命令放在P1口上,完成写入后再将E置为0。两函数的流程图见图3.11、图3.12。

  图3.11写命令函数流程图图3.12写数据函数流程图

  写命令和写数据函数的代码如下:

  //写命令

  wc1(unsigned char com)

  {

  check_busy();

  RS=0;

  RW=0;

  E=1;

  P1=com;

  E=0;

  }

  //写数据

  wd1(unsigned char dat)

  {

  check_busy();

  RS=1;

  RW=0;

  E=1;

  P1=dat;

  E=0;

  }

  设置显示位置函数主要完成对液晶显示器上字符或汉字显示位置的设置功能,函数有两个形参,分别代表行和列,首先判断列数是否大于64,如果大于64,那么显示在右半屏,再将列值减64得到显示在右半屏的列数;否则显示在左半屏,然后通过写命令函数写入列地址和行地址,流程图见图3.13。

  显示汉字和显示字符的函数也类似,显示汉字和显示字符的功能都是向液晶显示器发送数据,在液晶显示器上显示汉字、数字和英文字符。在定义函数时有三个形参,分别是要显示的行、要显示的列和要显示数据的地址指针,通过设置显示位置函数来完成对显示位置的设置,再通过指针写入需要显示的数据,需要显示的数据事先由字模提取软件获得并存放于数组中。显示分两段进行,先显示汉字或字符的上半部分,然后将显示行加一进行下半部分显示。两个函数的流程图完全一致,如图3.14,两程序的具体内容也基本一致,显示字符的程序与显示汉字程序仅存在变量循环次数上的差别。

  图3.13设置显示位置函数流程图

  设置显示位置函数代码如下:

  //设置显示位置

  void set_xy(uch x,uch y)

  {

  if(y>=64)//判断输入的y坐标在左半屏还是在右半屏

  {

  yj_xp(1);//y>=64,在右半屏

  y=y-64;

  }

  else

  {

  yj_xp(0);//y<64,在左半屏

  }

  wc1(0x40|y);//设置列

  _nop_();

  wc1(0xb8|x);//设置行

  }

  图3.14中文汉字、字符显示函数流程图

  中文汉字、字符显示函数代码如下:

  //中文字体显示

  void disp_hz(uch R,uch L,uch*p)

  {

  uch i;

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

  {

  set_xy(2*R,16*L+i);//显示文字上半部分

  wd1(p);

  set_xy(2*R+1,16*L+i);//显示文字下半部分

  wd1(p[i+16]);

  }

  }

  //字符显示

  void disp_zf(uch R,uch L,uch*p)

  {

  uch i;

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

  {

  set_xy(2*R,8*L+i);//显示字符上半部分

  wd1(p);

  set_xy(2*R+1,8*L+i);//显示字符下半部分

  wd1(p[i+8]);

  }

  }

  波形绘制函数主要完成对调理后的电流波形的绘制功能,首先定义变量,由于本设计最终的波形显示效果为左半屏显示字符“波形:”,右半屏绘制大致波形,因此定义变量后选择右半屏进行操作,然后设置循环,将AD转换得到的数据进行初步处理,判断这些数据是正值还是负值,若为负值,则绘制负半周的波形,若为正值则绘制正半周的波形,波形绘制函数流程图如图3.15。

  波形绘制函数代码如下:

  void disp_tx()//画波形

  {

  uch i;

  int x=0;

  yj_xp(1);

  for(i=0;i<NN-2;i++)

  {

  x=jg/256;

  wc1(0x48+i);

  if((x&0xf000)==0xf000)//若采样值为负,画负半周的波形

  {

  wc1(0xb8|5);

  x=abs(x);

  wd1(0x01<<x);

  }

  else//若采样值为正,画正半周的波形

  {

  wc1(0xb8|4);

  wd1(0x80>>x);

  }

  }

  }

  图3.15波形绘制函数流程图

  3.2.2 AD转换部分

  AD转换部分主要包含AD转换函数和两个中断函数。

  AD转换函数主要完成对ad转换器的控制以及读取AD转换结果的功能。首先将RC和A0都置为0,再将CS置0启动12位AD转换,用while函数判断STS的状态进而判断转换是否结束,待转换结束后,设置RC=1,A0=0读取高八位转换结果,然后再重新设置RC=1,A0=1读取低四位转换结果,最后设置CS=1关闭AD转换。函数流程图如图3.16。

  图3.16 AD转换函数流程图

  AD转换函数代码如下:

  void adc_1674(void)//ad转换

  {

  P0=0xff;

  CS=1;

  RC=0;

  A0=0;

  CS=0;

  _nop_();

  CS=1;

  while(STS==1);//若仍在转换,等待

  RC=1;

  A0=0;

  _nop_();

  CS=0;

  _nop_();

  hb=P0;//读取高八位数据

  RC=1;

  A0=1;

  CS=0;

  _nop_();

  lb=P0;//读取低四位数据

  CS=1;

  }

  两个中断函数分别是由调理后的方波的下降沿触发的中断和由计数器计数溢出触发的中断。前者主要完成对计数器的控制,方波信号的第一个周期不进行计数,第二个周期开始计数,第三个周期到来时停止计数。首先对形参幅值为3,每次进入中断就进行一次自减,再用switch语句判断参数当前的值,若为0,则停止计数,若为1,则开始计数。后者控制AD转换,每次进入中断的时候就控制AD转换器进行数据转换,将转换得到的结果用两个参数保存,两个形参分别保存转换结果的高八位和低四位数据,然后将读取到的高八位数据和低四位数据通过逻辑运算组合成一个12位二进制数,再将这个数经过处理转换为补码形式存到数组之中。两个程序的流程图如图3.17,图3.18所示。

  图3.17下降沿触发的中断函数流程图图3.18计数溢出触发的中断函数流程图

  连个中断函数的代码如下:

  void zd1()interrupt 0//下降沿触发的中断

  {

  cou--;

  switch(cou)

  {

  case 0://计数器停止计时

  TR0=0;

  EX0=0;

  break;

  case 1://计数器开始计时

  TR0=1;

  break;

  }

  }

  void zd2()interrupt 1//计数器计数值溢出触发的中断

  {

  int aa,bb;

  TL0=dl;

  TH0=dh;

  adc_1674();

  aa=hb;

  bb=lb;

  aa=aa&0x00ff;//保持高八位数据,其他置零

  bb=bb&0x0f;//保持低四位数据,其他清零

  jg[cou]=((aa<<4)|bb)-0x800;//数据左移四位,将低四位数据送入,得到12位数字量,并将其处理为补码形式

  cou++;

  if(cou>=NN)//等待进行N次A/D转换

  {

  TR0=0;

  ET0=0;//关闭采样

  }

  }

  3.2.3主函数

  主函数要完成对读取信号、控制ad转换、计算结果和显示的功能,首先进行液晶显示屏的初始化,然后设置计数器的工作方式,设置计数器的中断方式和计数初值,第一次使用计数器要得到交流电流的频率,以这个频率为基础产生驱动AD转换的倍频信号,第二次使用计数器则要控制AD转换,得到AD转换的结果,然后将AD转换的结果进行傅利叶计算,得到三次谐波电流的有效值,最后对电流的有效值和交流电流的波形进行显示,流程图如图3.19。

  图3.19主函数流程图

  主函数代码如下:

  main()//主函数

  {

  ui a,b,c,d,e;

  int i;

  float f;

  yj_cs();

  TMOD=0x01;//设置计数器工作模式

  EA=1;

  f=6*3.14/NN;

  while(1)

  {

  ET0=1;//设置中断方式和计数器初值

  IT0=1;

  TH0=0;

  TL0=0;

  cou=3;

  EX0=1;

  while(cou!=0);

  a=65535-(TH0*256+TL0)/NN+1;//将得到的计数值处理获得50倍频信号的计数器初值

  dh=(uch)(a/256);//设置新的计数器初值

  dl=(uch)(a%256);

  cou=0;

  ET0=1;

  TL0=dl;

  TH0=dh;

  TR0=1;

  while(cou<NN);//等待ad转换完成

  m=0;

  n=0;

  for(a=0;a<NN;a++)//对ad转换结果进行计算

  {

  m=m+2*(jg[a]*cos(f*a))/NN;

  n=n+2*(jg[a]*sin(f*a))/NN;

  }

  m=sqrt((m*m+n*n)/2);

  m=m*5000/2048;

  m=m*5/3.264;

  a=(unsigned int)(m*2/1.907+110);//对计算结果进行处理,排除误差等的影响

  b=a/1000;

  a=a%1000;

  c=a/100;

  a=a%100;

  d=a/10;

  e=a%10;

  disp_tx();//绘制谐波大致波形

  for(i=0;i<3;i++)//显示字符:“有效值”

  {

  disp_hz(0,i,hz);

  }

  for(i=0;i<2;i++)//显示字符:“波形”

  {

  disp_hz(2,i,hz[i+3]);

  }

  disp_zf(0,6,zf[1]);//显示“:”

  disp_zf(2,4,zf[1]);

  disp_zf(0,9,sz);//显示个位

  disp_zf(0,10,zf[0]);//显示小数点

  disp_zf(0,11,sz[c]);//显示十分位

  disp_zf(0,12,sz[d]);//显示百分位

  disp_zf(0,13,sz[e]);//显示千分位

  disp_zf(0,14,zf[2]);//显示单位“A”

  }

  }

  3.3各部分仿真效果

  3.3.1信号调理部分仿真

  信号调理部分仿真主要测试交流信号经过互感器、电压跟随器和电压放大器后的幅值是否超出AD转换器的范围以及通过过零比较器后得到的方波是否满足要求。运行仿真,通过交流电压表读交流信号的幅值,判断是否在±5V的范围之内,并且通过示波器和频率计测量方波信号频率是否为50Hz。根据公式3-1和公式3-2,当仅输入5A的基波电流时,电压放大器输出的电压应为:

  ,而过零比较器后应能取得50Hz的方波信号。图3.20为仿真结果,由图可见,5A的基波信号和经过处理幅值为3.3V,示波器显示过零比较后的信号为一个方波,而频率计显示该方波信号为50Hz。说明信号经处理后的结果与公式计算一致,信号调理部分能够正常对输入信号进行取样、放大并产生50Hz的方波信号。

  图3.20信号调理部分仿真

  3.3.2 AD转换部分仿真

  AD转换部分主要检测所选AD转换器选择是否合理,AD转换器是否能够正常工作,编写的AD转换程序是否能够正常运行以及对AD转换结果的处理是否正确。将AD转换器和单片机连接,再将虚拟终端连接到单片机上,向AD转换器送入直流电压+5V和-5V。假如AD转换器和处理程序正常工作,那么在虚拟终端上应分别显示07FFh和F800h。实际运行结果如图3.21、图3.22。由两图可以看见,当输入电压为+5V时,转换结果为07FFh,输入电压为-5V时,转换结果为F800h,说明AD转换器选择合理,能够正常工作且AD转换和对数据的处理程序没有问题。

  图3.21+5V电压的AD转换结果

  图3.22-5V电压的AD转换结果

  3.3.3显示部分仿真效果

  显示部分仿真主要测试选择的显示器是否可用,显示程序是否出现问题。用字模提取软件提取汉字“南昌工程学院”,将这些汉字从第二行第二列开始依次显示并保持,若液晶显示器工作正常且程序正确,那么运行结果应为液晶显示器全屏除“南昌工程学院”字样以外没有任何其他显示,无乱码。显示结果如图3.23。不难看出,显示器正确显示了预计要显示的字符,说明显示部分没有问题,液晶显示器选择合理,显示部分的程序和硬件能够正常工作。