电压谐波分析论文

毕业设计(论文)任务书

I、毕业设计(论文)题目:

电网电压谐波分析仪设计

II、毕 业设计(论文)使用的原始资料(数据)及设计技术要求:

用汇编或C语言对制作的交流电压谐波分析仪编程,实现电网电压谐波分析仪功 能。具体要求为:

1.采用交流同步采样法,采样点数不少于64点/周。

2.综合误差

3.用单片机、12位以上A/D等器件实现。

4.通过键盘控制可显示1-31次谐波分量。

5. 翻译一篇相关的英文资料。

III、毕 业设计(论文)工作内容及完成时间:

第01~03周:资料查找、方案论证、英文资料翻译、开题报告撰写。

第04~11周:软件设计与调试。

第12~14周:软硬件联调,实验测试。

第15~18周:毕业论文撰写,答辩。

Ⅳ 、主 要参考资料:

[1] 卢承领. 电力系统谐波分析仪综合设计[J]. 装备制造技术,2012第10期:275 -277

[2] 侯少红,安卓. 电力系统的谐波分析与测量[J]. 科技资讯,2011(05)

[3] 罗小东. 基于双DSP的电力系统谐波分析仪的设计[J]. 科技创新与生产力, 2011(06)

[4] 孙宏军,张涛等.智能仪器仪表[M].清华大学出版社,2007.1

[5] 张先庭.单片机原理、接口与C51应用程序设计 [M].国防工业出版社,2011.1

[6] Sutherland P E.Harmonic measurements in industrial power system[J].IEEE Trans on 1995,31(1):175-183.

学院 专业类

学生(签名):

日期: 自 2013 年 2 月 25 日至 2013 年 6 月 15 日

指导教师(签名):

助理指导教师(并指出所负责的部分):

电子工程 系(室)主任(签名)

附注:任务书应该附在已完成的毕业设计说明书首页。

电网电压谐波分析仪设计

学生姓名: 班级:

指导老师:

摘要:随着科学技术的进步,各种新型的用电设备在社会的各个领域得到了广泛的使用,由于设备运行所要求的高安全性和精确性,对电能的使用和需求产生了更高的要求,但非线性负荷的大量使用却带来了严重的电力谐波污染,给系统安全、稳定、高效运行和供用电设备造成严重影响及危害。最大限度的减少谐波的危害,是电力系统领域极为关注的问题,而解决这一问题的关键在于定量地确定谐波的成分、幅值等。提高电网谐波监测分析水平,对于抑制高次谐波含量是十分必要和有价值的。

该谐波分析仪是基于MSP430单片机进行设计的,软件使用CCSV5.1平台开发,采用模块化程序设计思想,针对谐波分析仪的性能指标将其分为测频采样、波形显示和谐波显示三大模块。它能对输入的交流电压进行频率测量,根据测得的频率对输入电压进行交流同步采样,并显示输入电压的波形;再通过FFT算法计算出各次谐波,并通过按键在液晶屏上显示各次谐波。

本文从谐波分析仪的系统组成、工作原理、硬件设计和软件设计等方面介绍了电压谐波分析仪的设计。调试时将该分析仪测得的频率、电压峰值、基波幅值等电参量与标准测试的结果相比较,其结果的综合误差在百分之一以内,达到了设计的要求。

关键词:MSP430单片机 交流同步采样 FFT 谐波显示

指导老师签名:

The power grid voltage harmonic analyzer software design

Student name: Class:

Supervisor:

Abstract:With the progress of science and technology, various new types of electrical equipment in all spheres of society has been widely used, the equipment to perform the required high accuracy, and safety use of electricity and demand produced higher requirements, but the use of non-linear load has brought serious electric power harmonic pollution, to system safety, stable and efficient operation and power supply equipment caused serious effect and harm. Minimize the harm of harmonic, is extremely concern power system field, and the key to solve this problem is to quantitatively determine the harmonic component, amplitude, etc. Improve the level of power grid harmonic monitoring and analysis, to restrain high harmonic content is very necessary and valuable.

The harmonic analyzer is designed based on MSP430 SCM, use CCSV5.1 platform development software, adopt modularization program design idea, in view of the performance of the harmonic analyzer, which can be divided into sampling, waveform display and harmonic frequency measurement are three big modules. It can input ac voltage frequency measurement, according to the measured frequency of the input voltage of ac synchronous sampling, and display the input voltage waveform; Again through the FFT algorithm to calculate the every harmonic, and through the keys displayed on the LCD screen every harmonic.

This article from the harmonic analyzer system composition, working principle, hardware design and software design of voltage harmonic analyzer is introduced in aspects of design. When debugging the analyzer measured frequency, electric parameters such as voltage peak value, amplitude value compared with the oscilloscope to test results, the results of the comprehensive error within one percent, meet the design requirements.

Keywords: MSP430 microcontroller Ac synchronous sampling

FFT Harmonic show

Signature of Supervisor:

1 绪 论

1.1、选题的依据及意义

电能是一种经济、实用、清洁且容易控制和转换的能源形态,其应用程度是一个国家发展水平的主要标志之一。作为一种特殊商品,电能同样具有商品指标可被测量、商品形态可被描述、商品性能可被改善等特征、因此与其他商品一样,电能也应该讲求质量问题。电能质量问题主要分为稳态电能质量问题和暂态电能质量问题两大类。稳态电能质量问题包括频率偏移、电压偏移、谐波等以波形畸变为特征的扰动问题,其中以谐波问题为代表。

随着工业的发展和科学技术的进步,电力系统的谐波污染也越来越严重。工业中的各类静止换流器、电动机、开关电源,生活中的荧光灯、电视机等在给工农业生产和人们的日常生活带来便利的同时,也向电网倾泻着大量的谐波垃圾。电力谐波不仅造成电压波形畸变,使电能质量下降、电能损耗增大;谐波还可能引起重要的控制和保护装置出现故障、电力设备过载或破坏等。

像很多其它形式的污染一样,谐波的发生会影响整个电环境,并波及到离谐波源很远的地方。谐波污染不像水资源和大气污染现象那么直观,人们一般感觉不到它的存在,波形污染的存在往往在遭受代价昂贵的事故损失后才被探测出来。随着整个国民经济的增长,非线性电力负荷还有不断增长的趋势,其对电力系统带来的影响也同步增长。国外的经验表明,各种非线性用电设备容量的增长率大大超过电网的发电量的增长率,这一事实决定了谐波监督和治理工作的长期性和艰巨性。因此,正确分析电力网谐波产生的根源和机理、进而采取有效措施最大限度地抑制其影响、保证电网的安全运行是非常重要和必要的。

电力系统中,各种谐波源产生的谐波对电力系统环境造成污染,影响到整个电力系统的电气环境,包括电力系统本身和广大用户。初步归纳起来主要表现有,由于流过高次谐波电流,造成用电设备因额外功耗而过热,或者发生磁感应障碍;由于高次谐波而形成的畸变率,对利用电压谐波控制的设备,可能造成误动或失控;由于高次谐波的存在,通讯线路将出现噪音和危险的感应电动势。

综上所述,可以看出不论从保证电力系统和供电系统的安全经济运行或是保证设备和人身的安全来看,对谐波污染造成的危害影响加以经常检测和限制都是迫切需要的。

1.2、研究概况及发展趋势

电力系统谐波问题不是一个新问题。早在20世纪30年代,西方国家就已提出静态整流器产生的波形畸变问题,各国电力专家开始认识到了谐波的重要性。但只是在近十几年来,随着电力系统的发展,负载特性的非线性化,谐波造成的危害逐渐增大和增多,对这个领域的研究才逐渐开始引起各国电力系统工程界的密切关注。

在评价一个电力系统的供电质量时,一般只要求电网电压的幅值和频率保持稳定,因而在国家电气规程中,主要规定了有关电压幅值和供电频率的标准与其它指标相比,这两项指标更主要地决定了电气设备的工作频率和电网的技术经济指标。近几十年来,由于谐波问题的出现,在某些情况下谐波所产生的危害范围和程度与电能的主要质量指标不合格产生的危害不相上下。发达国家的经验和预测表明,随着科学技术的发展,非线性负荷用电设备的种类、数量和用电量还将迅猛增加。国际上公认谐波污染是电网的公害,必须采取措施加以限制。从1984年开始,每两年召开一次的电力系统谐波国际会议,为这个领域的国际交流提供了直接的渠道,推动着谐波研究工作的开展。

由于实测电网谐波的干扰状况已成为保证电网安全经济运行、高质量供电必不可少的措施之一,世界各国都相应研制和开发了一系列的谐波测量分析装置和仪器。谐波测量和分析的历程发展至今已经随着集成电路和微处理器及计算机的迅速发展而产生了一系列基于快速傅立叶变换的谐波分析仪,被测信号经采用保持、A/D转换、傅立叶计算输出结果,测试操作简单方便,计算机结果快速准确。新一代多功能、数字化、自动化和智能化的谐波测量分析仪已经成为发展的主要方向。

近年来,世界各国在研制和使用谐波分析仪方面发展较为迅速,仪器的性能先进,测量功能齐全,适用范围广,且耐用可靠,但价格较为昂贵。相比之下国内的谐波分析仪价格较低,但是制造工艺较差,可靠性和精度方面还存在缺陷。 电力系统谐波测量算法向复杂化、智能化发展,谐波测量与谐波分析如何相互配合,针对非稳态波形畸变,寻求新的数学方法,如小波变换等,是人们关注的方向。另外,硬件设备的精度、速度和可靠性的快速发展,为实现高性能算法和实时控制奠定了基础。

1.3、研究的内容

本设计以MSP430F5529单片机为核心,采用CCSV5.1软件开发平台进行编程,其研究的主要内容如下:

1、MSP430F5529最小系统的构建;

2、CCSV5.1软件开发平台的功能及使用方法;

3、MSP430单片机定时器模块的功能;

4、MSP430单片机A/D采样模块的功能;

5、频率测量程序的编写;

6、交流同步采样程序的编写;

7、FFT算法的原理;

8、按键及液晶显示程序的编写。

2 系统组成及工作原理

2.1、系统设计方案

2.1.1、硬件设计方案

用电流型互感器对输入的交流电压进行降压,降压后进行整形和单极性变换,用滞回比较器可以将正弦波整形成方波,以用于频率的测量;用MC1403芯片产生一个直流电压,在输入的交流电压上叠加直流电压,将交流电压提升到零伏以上实现单极变换,以用于交流采样。单片机控制102×64液晶进行液晶显示,另外,单片机外接两个按键进行液晶显示的控制。

2.1.2、软件设计方案

在CCSV5.1平台上用C语言进行编程,采用定时器A1的捕获模式对输入的方波进行频率测量,根据测得的频率计算出交流采样的采样间隔。用MSP430单片机自带的12位AD进行A/D采样,采样模式设置成单通道多次采样,将定时器A0设置成增计数模式,当定时时间到了就进入定时器中断读取当前的采样值,完成64点等间隔采样后关闭A/D,然后对采得的数据进行处理。将采样数据转换成液晶显示屏上的坐标,描点显示出交流电压的波形;对采样数据进行FFT运算,得到基波和各次谐波的幅值,再通过按键对各次谐波进行翻页显示。

2.2、系统组成

该谐波分析仪系统以MSP430F5529单片机为核心,其外围模块电路包括:电压取样电路、滤波电路、整形电路、单极性变换电路、按键电路和液晶显示电路。系统组成框图如图 2.1 所示:

图 2.1 系统组成框图

2.3、系统工作原理

通过电压取样电路对输入的220V交流电压进行降压,降压后通过低通滤波器进行滤波,滤波后的电压信号分别输入到单极性变换电路和整形电路中。单极性变换电路通过MC1403芯片产生一个直流电压,将该直流电压通过运放叠加到所输入的交流电压上面就可以完成单极性变换。电压整形电路由滞回比较器构成,将滤波后的正弦电压通过该模块就可以被整形成方波。将方波输入到MSP430单片机系统就可以进行频率的测量,通过所测得的频率就可以计算出交流电压采样的时间间隔。将单极性变换后的交流电压输入到单片机系统,根据测频所计算的采样间隔时间进行64点交流同步采样。采样完成之后,根据采样数据计算出各点的坐标,然后在液晶屏上显示电压的波形。进行FFT运算,计算出各次谐波的幅值并通过按键在液晶屏上显示各次谐波。

3 谐波分析算法介绍

电力系统的谐波分析,通常是采用快速傅里叶变换(FFT);小波变换由于其良好的时频分析特性也在谐波分析领域得到了广泛应用;本设计采用的是快速傅里叶变换。

快速傅里叶变换(FFT)是当今谐波检测中应用最广泛的一种谐波检测方法,它可以方便的实现信号的计算分析。

快速傅里叶变换是离散傅里叶变换(DFT)的一种快速算法,FFT算法就是不断地把长序列的DFT分解成几个短序列的DFT,并利用蝶形因子的周期性与对称性,来减少运算次数。使用该方法测量谐波,精度较高,使用方便。因此,在进行谐波分析的时候,首先要进行FFT分析。该算法最简单最常用的是基2FFT。

其主要原理分析如下:

DFT的定义式如(3-1)式所示:

kn(3-1) X(k)=∑x(n)WNRN(k) k=0,1…..N-1

n=0N-1

式中nkWN称为蝶形因子。若按此直接计算DFT,其运算量为N2次复乘和N(N+1)次复加。当N很大时,运算量就相当的大,为此采用快速傅里叶变换。

FFT算法一般可以分为时间抽取FFT和频率抽取两大类。时间抽取FFT算法是每一级处理都在时域里把N点的输入序列按照奇数和偶数分为奇序列和偶序列;而频率抽取FFT是在频域里把序列分解成奇、偶的序列形式来计算。

为了将大点数的DFT分解为小点数的DFT进行运算,要求序列的长度N为复

M合数,最常用的是N=2的情况(M为正整数)。先将序列x(n)按奇偶项分成两

组:

⎧x(2r)=x1(r)N⎨r=0,1, ,-1x(2r+1)=x2(r)⎩2

然后,将DFT运算也相应分为两组

knX(k)=DFT[x(n)]=∑x(n)WN

n=0N-1

=∑x(2r)Wr=0

N/2-1

r=0N/2-12rkNN/2-1+∑x(2r+1)Wr=0kNN/2-1r=0(2r+1)kN

=∑x1(r)W2rkN+W∑x22rk(r)WN

=∑x1(r)W

r=0

N/2-1

rkN/2

+W

kN

N/2-1r=0

∑x

2

rk

(r)WN/2

k

=X1(k)+WNX2(k)

(3-2)

其中X1(k)、X2(k)分别是x1(n)、x2(n)的N/2点的DFT:

X1(k)=∑x1(r)W

r=0N/2-1r=0N/2-1

rk

N/2

N/2-1

=

r=0

rk

x(2r)WN/2,0≤k≤

N

-1 (3-3) 2

N

-1 (3-4) 2

X2(k)=∑x2(r)W

rkN/2

N/2-1

=

r=0

rk

x(2r+1)WN/2,0≤k≤

至此,一个N点DFT被分解为两个N/2点的DFT。 由式子

k

X(k)=X1(k)+WNX2(k)

可得:

Nk

X(k+N)=X1(k)-WNX2(k)其中k=0,1, ,-1,

2

这样N点DFT可全部由下式确定出来:

k

⎧⎪X(k)=X1(k)+WNX2(k)N⎨kk=0,1, ,-1⎪⎩X(k+N/2)=X1(k)-WNX2(k) 2

上式可用一个专用的碟形符号来表示,如图3.1所示符号对应一次复乘和两次复加运算。

a

k

a+WNb

b

k

WN

-1

k

a-WNb

N2N2

()=

只需要24次复数乘

图3.1蝶形运算符号

通过这样的分解以后,每一个N/2点的DFT

N2N2

法,两个N/2点的DFT需要次复乘,再加上将两个N/2点DFT合2()=

22

N2NN2次复乘。可并成为N点DFT时有N/2次与W因子相乘,一共需要 +≈222见,仅仅经过一次分解,就使运算量减少近一半。

依次类推,经过M次分解,最后将N点DFT分解成N个1点DFT和M级蝶形运算,而1点DFT就是时域序列本身。

4 系统硬件设计

4.2、按键电路

MSP430F5529开发板上有S1和S2两个按键可供使用,S1按键接p1.7引脚,S2按键接p2.2引脚,其连接电路如图4.2所示。

图4.2 按键电路

4.3、电压取样电路设计

采用电流型互感器进行降压,在有效值220V的交流电压上串联一个240K

的电阻R5,则输入电流互感器的电流为0.917mA。电流互感器的输入和输出电流是相等的,所以输出电流也为0.917mA,再接一个1K的电阻R2,就得到了有效值为0.917V、峰值为1.296V的交流电压。

该部分电路如图4.3所示: 图4.3 电压取样电路

4.4、整形电路设计

整形电路是要将输入的正弦波整形成方波,用一个滞回比较器就可以完成整形。滞回比较器中电阻R13阻值取100欧姆,R15的阻值取10千欧,这样便可以计算出阈值电压为正负0.12V,通过该电路便可以将正弦波整形成方波,且频率不会变化。通过电阻R16和R17分压,使输出方波的低电平为0V,高电平为 3.24V,可以输出给单片机进行频率测量。

整形电路如图4.4所示:

图4.4 整形电路

4.5、滤波电路设计

设计要求最高显示31次谐波,而基波频率是50Hz,则31次谐波的频率为

1550Hz,为了避免干扰,使测量更加准确,这里应该将更高频率的谐波滤除掉。滤波电路采用一阶有源低通滤波器进行滤波,将RC无源低通滤波器的输出接同相比例运算电路的输入端就构成了一阶有源低通滤波器,电阻R8的参数取820欧姆,电容C5取0.1uf,则该滤波器的截止频率f=1/2πRC = 1941.9Hz,这样即保留了1—31次谐波,又将更高次谐波滤除掉了,硬件中加入滤波电路能有效的滤除高频干扰,降低误差。

滤波电路如图4.5所示:

图4.5 滤波电路

4.6、单极性变换电路设计

在交流电压上面叠加一个直流电压就可以完成单极性变换,所以先要产生一

个直流电压,该直流电压要使正弦波的负半周完全抬升到零伏以上,且电压的最大值不能超过MSP430单片机允许的最大采样电压3.3V;为防止电网中电压的波动,要给单片机留有一定的电压余量,所以抬升后的最大电压要与单片机的最大采样电压有一定的缓冲量。

直流基准电压用MC1403芯片产生,该芯片是高准确度、低温漂、采用激光修正的带隙基准电压源,常用在那些需要基本精准的基准电压的场合。用该芯片产生一个5V的直流电压,分压电阻R11取820欧姆,R14取330欧姆,通过电阻分压可以得到1.435V的直流电压,再通过加减运算电路就可以将该直流电压叠加到交流电压上面,抬升之后的交流电压最大值为2.731V,最小值为0.139V,既完成单极性变换,又留有一定的的缓冲量。

复位信号。

液晶显示电路如图4.7所示:

图4.7 液晶显示电路

5 系统软件设计

5.1、软件开发环境介绍

系统软件使用CCSV5.1开发平台编写。CCS是TI公司研发的一款具有环境

配置、源文件编辑、程序调试、跟踪和分析等功能的集成开发环境,能够帮助用户在一个软件环境下完成编辑、编译、链接、调试和数据分析等工作。CCSV5.1为CCS软件的最新版本,功能更强大、性能更稳定、可用性更高,是MSP430软件开发的理想工具。

5.2、主程序设计

先对MSP430单片机系统进行初始化,用定时器TA1进行频率测量,通过测

得的频率计算出采样间隔,用定时器TA0控制A/D进行等间隔采样,采样完成后进行波形显示,然后将采样所得数据进行FFT运算得到各次谐波的幅值,最后在液晶屏上将各次谐波显示出来。

N

图5.1 主程序流程图

5.3、频率测量程序设计

频率测量要用到MSP430单片机的定时器,定时器的使用主要由TACTL控制寄存器和TACCTL捕获/比较控制寄存器来控制。 TACTL控制寄存器

TACTL的SSEL1和SSEL0两位控制时钟源的选择

TASSEL_0 :输入时钟源为TACLK TASSEL_1 :输入时钟源为ACLK TASSEL_2 :输入时钟源为SMCLK TASSEL_3 :输入时钟源为INCLK

ID1,ID0控制输入分频选择 ID_0 :不分频 ID_1 :2分频 ID_2 :4分频 ID_3 :8分频 MC1,MC0是计数模式控制位 MC_0 :停止模式 MC_1 :增计数模式 MC_2 :连续计数模式 MC_3 :增/减计数模式 CLR :定时器清除位 TAIE :定时器中断允许位 TAIFG :定时器中断溢出标志位 TACCTL捕获/比较控制寄存器

CM1-0 选择捕获模式

CM_0 :禁止捕获模式 CM_1 :上升沿捕获 CM_2 :下降沿捕获

CM_3 :上升沿与下降沿都捕获

SCS选择捕获信号与定时器时钟同步、异步关系

0 异步捕获 1 同步捕获

CAP选择捕获模式还是比较模式

0 比较模式 1 捕获模式

用定时器A1进行频率的测量,将定时器A1设置成捕获模式,当方波的上升沿到来时,记录当前定时计数器的值,通过连续两次计数值的差即可算出所测频率的大小。

首先要进行时钟的选择和定时器计数模式的选择,这些由TA1CTL寄存器决定,该寄存器选择TASSEL_2,即时钟选择了子系统时钟SMCLK,选择ID_3,即将时钟进行了八分频,在系统初始化时将子系统时钟倍频为25M,八分频之后为3.125M,即定时器A1的时钟为3.125M;选择MC_2,将计数模式设置为连续计数模式,并要将计数初值清零。

TA1CTL = TASSEL_2 + MC_2 + TACLR+ID_3 ;这条语句便可完成上述设置。

然后是定时器捕获模式的设置,由TA1CCTL1捕获控制寄存器控制。将CAP置1,将定时器设置成捕获模式;选择CM_1,即捕获模式为上升沿捕获;将SCS为置1,即选择同步捕获模式,并打开定时器捕获中断,当上升沿来时就会进入捕获中断。

TA1CCTL1 = CM_1+SCS+CCIS_0+CAP+CCIE;这条语句可实现上述功能。 将定时器A1设置好后,打开捕获中断,等待连续两次捕获完成。在捕获中断程序中用newdata变量记录当前TA1R计数器中的值,用olddata变量记录上一次捕获事件时TA1R计数器的值。

比较olddata和newdata的大小,如果newdata大,则说明没有发生溢出,则

data=newdata-olddata;若olddata大,则说明发生了溢出,则

data=65536+newdata-olddata;而定时器时钟为3.125M,那么用3125000除以data的值即可得到频率值了。

测频程序流程图如图5.2所示:

图5.2测频程序流程图

定时器A1中断服务程序流程图如图5.3所示:

图5.3 定时器A1中断程序流程图

5.4、A/D采样程序设计

选用MSP430单片机的ADC12模块进行采样,该模块由ADC12CTL0转换控制寄存器0和ADC12CTL1转换控制寄存器1一起控制。

ADC12SC采集/转换控制位 ADC12ENC转换允许位

ADC12TVIE转换时间溢出中断允许位 ADC12OVIE溢出中断允许位 ADC12ON ADC12内核控制位 0 关闭ADC12内核 1 打开ADC12

内核 REFON参考电压控制位

2.5V内部参考电压的电压值选择位 MSC多次采样/转换位

SHT1,SHT0 采样保持定时器1,采样保持定时器0 CSSTARADD 转换存储地址位 SHS 采样触发输入源选择位

0 ADC12SC 1 Timer_A.OUT1 2 Timer_B.OUT0 3 Timer_B.OUT1

SHP 采样信号(SAMPCON)选择控制位

0 SAMPCON源自采样触发信号 1 SAMPCON源自采样定时器

ISSH 采样输入信号方向控制位

ADC12DIY ADC12时钟源分频因子选择位 ADC12SSEL ADC12内核时钟源选择

0 1 2 3

ADC12内部时钟源:ADC12OSC ACLK MCLK SMCLK

CONSEQ 转换模式选择位

0 1 2 3

单通道单次转换模式 序列通道单次转换模式 单通道多次转换模式 序列通道多次转换模式

ADC12BUSY ADC12忙标志位(只用于单通道单次转换模式)

对采样模块进行操作时要先打开ADC12内核,即要使ADC12ON置1;因为要进行多点采样,所以将采样模式设置成单通道多次采样模式,并要使ADC12MSC多次采样/转换位置1,同时设置好采样保持时间。

ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC ;这条语句便可实现上述设置。

采样定时器由采样输入信号的上升沿触发,所以要使ADC12SHP位置1,采样模式为单通道多次转换,即模式选择为ADC12CONSEQ_2,这些由ADC12CTL1寄存器控制。

ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2 ;这条语句可实现上述功能。

采样结果的存储由ADC12MCTLx转换存储控制寄存器控制,这里选用ADC12MEM0转换存储器,即其控制寄存器为ADC12MCTL0,该寄存器要进行参考电压的选择和采样转换通道的选择。参考电压选择为系统的供电电压,即选择ADC12SREF_0位,通道选择为A6通道,即选择ADC12INCH_6位,

ADC12MCTL0=ADC12SREF_0+ADC12INCH_6;这条语句可实现上述设置。 因为要对交流电压进行等间隔采样,所以用定时器A0进行采样间隔的控制。定时器A0要设置成增计数模式,同样选择子系统时钟SMCLK进行八分频, 即:TA0CTL = TASSEL_2 + MC_1 + TACLR+ID_3。

测频程序所得的两次捕获的差值除以64,所得数据即为捕获比较寄存器TA0CCR0的值,打开定时器A0中断,当TA0R的计数值等于TA0CCR0的值时,TA0R计数器的值清零并进入到定时器中断服务程序。在定时器A0的中断服务程序中,先关闭A/D转换,读取当前转换存储器ADC12MEM0的值,并判断是否为第64次采样,若是,则将采样标志置1,结束采样;若不是,则继续采样,等待下一次定时器中断,直到64点等间隔采样完成为止。

图5.4 A/D采样流程图 图5.5 定时器A0中断程序流程图

5.5、波形显示程序设计

采样点数为64点,所以正弦波波形由64个点描绘而成。所用液晶显示为102

×64液晶,64个点的横坐标依次为0~63,主要是要确定每个点的纵坐标位置。纵坐标位置由A/D采样的数值确定,采样数值范围是0~4095,而纵坐标范围是0~63,采样值与坐标是相对应的,用采样值乘以参数0.01538并转换成整形数据即为该点的纵坐标值。得到每个点的坐标之后,使用for循环将64个点在液晶屏上依次描绘出来,这样就可以显示一个周期的正弦波形了。

5.6、按键及显示程序设计

MSP430F5529单片机的开发板只用到了S1和S2两个按键,S1和S2分别接单片机的p1.7和p2.2引脚,单片机的P1和P2端口的16个引脚都是有具有中断功能的。在MSP430F5529.h宏定义中定义了一个16位寄存器PA,再定义一个变量buttonsMask,令buttonsMask=0x48,即对应上了p1.7和p2.2两个端口。

将p1.7和p2.2的SEL寄存器置零,即PASEL &= ~buttonsMask,将引脚选择为I/O功能;

将IES寄存器置零,PAIES&= ~buttonsMask; 将中断触发选择为上升沿触发; 将IFG寄存器清零,PAIFG &= ~buttonsMask; 将中断标志清零;

最后将IE寄存器置1,PAIE |= buttonsMask; 开外部中断,等待按键按下。 若有键按下,则判断是哪个键按下,这通过查看中断标志PAIFG寄存器可以知道,若S1键被按下,则将BUTTON1寄存器置1;若S2键被按下,则将BUTTON2寄存器置1‘

用变量buttonsPressed记录按键信息,buttonsPressed = PAIFG & BUTTON_ALL;

并在看门狗中断程序中用看门狗定时器WDTCTL设置一个250ms的消斗程序,即:WDTCTL = WDTPW + WDTSSEL_1 + WDTTMSEL + WDTCNTCL + WDTIS_5;

在主程序中只需要检查BUTTON1和BUTTON2的值就可以知道是哪个键按下。

102×64液晶屏是以描点的形式显示,所以先要将字母、各种符号的字模先做好,并用数组存储好。液晶显示要确定四个参数,先要确定显示的位置,即确定x和y的坐标值;然后是查表确定显示的字模,即显示的数据;最后是确定显示的模式。当这些都确定了就可以在液晶屏上的指定位置显示数据了。显示时是以字符形式显示,所以采样所得的整形或浮点型数据必需先转换成字符型数据才可以正确的显示出来。

6

系统调试

通过方案的选择,原理图的设计,PCB板的绘制,元器件的选择确定,硬件电路的焊接及相关程序的编写,完成了电压谐波分析仪的设计,其整体实物图如图6.1

图6.1 系统实物图

6.1、软件调试

先进行按键和显示程序的调试。单片机上电之后液晶显示屏上会显示相应的内容,当有键按下之后便会清除当前显示内容,并进行频率的测量。上电后所显示的内容如图6.2所示:

图6.2 初始界面显示

然后进行频率测量程序的调试。用定时器A2控制产生一个方波,测量该方波的频率,即可知道测频程序有没有作用。TA2CTL = TASSEL_2 + MC_1+TACLR+ID_3 ;定时器A2的时钟设置为3.125M,计数模式为增计数模式,捕获比较寄存器TA2CCR0赋值为31250,P1DIR |= 0x01,以单片机的p1.0口为方波的输出端口;当TA2R计数到到31250时,计数器清零并进入定时器A0的中断,在中断程序中将p1.0端口取反,即:P1OUT ^= 0x01;这样便产生了一个频率为50Hz的方波。通过测频程序测量两次捕获的计数差值为62500,用时钟3125000除以62500即为50,说明测频程序可以正确的测量到频率。

调试时没有交流电源,所以采样的电压用一节干电池提供,采样完成后查看存储采样值的数组,数组中64个数值都在1710左右,这说明实现了64次采样;电池的电压为1.5V,通过采样值计数出来的电压为1.503V,这说明采样的数值是准确的。通过波形显示程序也可以在液晶屏上描绘出一条直线,这说明波形显示程序也是可行的。但是是对直流电压进行采样,所以是不是等间隔采样,这里还是无法证明,必须对交流电压进行采样才可以确定是不是等间隔采样,这一步要在和硬件联合调试时才可以证明。

6.2、系统联合调试及分析

先用示波器观察硬件电路的输出波形,单极性变换之后的波形图如图6.3所

示:

图6.3 单极性变换效果图

可以观察到单极性变换之后,整体波形抬高到了零伏以上,且波形没有失真,峰值为1.295V,其最大电压没有超出最高采样电压,所以硬件电路单极性变换之后所产生的交流电压是可以用于A/D采样的。

用示波器观察整形电路输出的方波波形,整形之后所输出的方波如图6.4所示:

图6.4 整形效果图

由图6.4可知整形电路可以产生标准的方波,方波最小值为0V,最大值为3.20V,没有超过MSP430单片机所允许的最大电压;整形之后的方波频率为50.0191Hz,所以硬件电路所产生的方波是可以用于频率测量的。

将硬件的方波输出端接单片机的p2.0捕获端口,交流输出端接单片机p6.6采样端口。在测频程序结束处设置断点,程序运行至该断点处,查看两次捕获的差值data=62390,用3125000除以data的值为50.088,与示波器所测频率相差0.14%,这说明可以准确的测量到交流电压的频率。

将程序运行至波形显示程序结束,液晶屏所显示的波形如图6.5所示:

图 6.5 波形显示

液晶屏可以正确显示正弦波波形和所测频率的大小,这说明交流采样程序和波形显示程序是正确的,实现了交流同步采样。

要将该谐波分析仪进行校准才可以用其监测电网中的谐波。这里用BD-3D多功能校验产生频率为50Hz、有效值为220V的基波,同时叠加有效值为22V的二次谐波和有效值为10V的五次谐波。对该复合波进行采样和FFT运算,可以计算出基波为220.4V,二次谐波为21.8V,五次谐波为10.1V,其他各次谐波趋近于零,其综合误差在1%以内,完成了校准。

图6.6 校准效果图

完成谐波分析仪的校准之后,便可以用其测量电网中的各次谐波,并用按键控制基波和各次谐波的显示。

图6.7 基波显示

图6.8

2-7次谐波

图 6.9 8-13次谐波

图6.11 20-25次谐波

图 6.12 26-31次谐波

由测量结果可知,电网中的电压有效值并不是标准的220V电压,有一点偏差。其各次谐波中,低次谐波较多,高次谐波基本趋近于零。

7 总结与展望

7.1、总结

7.2、展望

参考文献

[1] 卢承领.电力系统谐波分析仪综合设计[J]. 装备制造技术,2012第10期:275 -277

[2] 侯少红,安卓.电力系统的谐波分析与测量[J]. 科技资讯,2011.5

[3] 罗小东.基于双DSP的电力系统谐波分析仪的设计[J]. 科技创新与生产力, 2011.6

[4] 孙宏军,张涛等.智能仪器仪表[M].清华大学出版社,2007.1

[5] 张先庭.单片机原理、接口与C51应用程序设计 [M].国防工业出版社,2011.1

[6]高西全.数值信号处理第三版[M].西安电子科技大学出版社,2008.5

[7]沈建华.MSP430系列单片机原理与实践[M].北京航空航天大学出版社,2008.5

[8]李智奇.MSP430系列单片机原理与系统设计[M].西安电子科技大学出版社,2007.9

[9]秦龙.MSP430单片机C语言应用程序设计[M].电子工业出版社,2008.6

[10]黄智伟.全国大学生电子设计竞赛训练教程[M].北京:电子工业出版社,2005:142-161.

[11]胡学海.单片机原理及应用系统设计[M].电子工业出版社,2005,2-7

[12]吴大正.信号与线性系统分析第四版[M].高等教育出版社,2005.8

[13]尹建华.微型计算机原理与接口技术第二版[M].高等教育出版社,2007.9

[14]阎石.数字电子技术基础第五版[M].高等教育出版社,2006.5

[15]蔡明生.电子设计[M].北京高等教育出版社,2004.1.

[16]华成英.模拟电子技术基本教程[M].清华大学出版社,2005.9

[17]谭浩强.C程序设计第三版[M].清华大学出版社,2005.7

[18]邱关源.电路第五版[M].高等教育出版社,2006.3

[19]常键生.检测与转换技术第三版.机械工业出版社, 2004.6

[20] Sutherland P E.Harmonic measurements in industrial power system[J].IEEE Trans

on 1995,31(1):175-183.

致 谢

附录:

程序清单

#include

#include

#include

#include "HAL_PMM.h"

#include "HAL_UCS.h"

#include "HAL_Board.h"

#include "HAL_Buttons.h"

#include "HAL_Cma3000.h"

#include "HAL_Dogs102x6.h"

#include "stdlib.h"

uint16_t timeoutCounter;

volatile uint32_t t2_count=0,F_flag=0;

uint32_t cap,newdata,olddata,data;

uint32_t zq_flag=0;

#define PI 3.14

int results[64],disp_1[32];

int results_1[64];

char str[20],str2[10];

float disbuffer,data_r[64],data_i[64];

int ad_flag,flag_1,di;

int count;

////////////////////////XXXX大学的字模//////////////////////////

uint8_t One[]={

0x20,0x20,0x27,0x24,0x24,0x26,0x2D,0xF4,0x24,0x25,0x26,0x24,0x24,0x67

,0x20,0x00,

0x00,0x00,0xFE,0x20,0xA0,0xA0,0xA0,0xFE,0xA0,0xA0,0xA0,0xA4,0x22,0xFC

,0x00,0x00,

0x00,0x00,0x00,0x7E,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x7E,0x00,0x00

,0x00,0x00,

0x00,0x00,0xFE,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xFE,0x00

,0x00,0x00,

0x01,0x01,0x3F,0x69,0xA5,0x3F,0x00,0x10,0x17,0x94,0x54,0x17,0x10,0x10

,0x00,0x00,

0x01,0x06,0xF8,0x42,0x21,0xFE,0x01,0x06,0xF8,0x00,0x00,0xFC,0x02,0x02

,0x0E,0x00,

0x08,0x30,0x21,0x22,0x24,0x28,0xA0,0x60,0x20,0x28,0x24,0x22,0x21,0x28

,0x30,0x00,

0x00,0x02,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x02,0x02

,0x00,0x00,

0x04,0x04,0x04,0x04,0x04,0x04,0x05,0xFE,0x05,0x04,0x04,0x04,0x04,0x04

,0x04,0x00,

0x00,0x01,0x02,0x04,0x08,0x30,0xC0,0x00,0x80,0x60,0x10,0x0C,0x06,0x03

,0x02,0x00,

0x02,0x0C,0x08,0x48,0x3A,0x2A,0x0A,0x8A,0x7A,0x2B,0x0A,0x18,0xEA,0x4C

,0x08,0x00,

0x00,0x40,0x40,0x40,0x40,0x40,0x42,0x41,0xFE,0x40,0x40,0x40,0x40,0x40

,0x40,0x00,

};

/////////////////////电压谐波分析的字模////////////////////////////

uint8_t Two[]={

0x00,0x00,0x1F,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x1F,0x00

,0x00,0x00,

0x00,0x00,0xF0,0x20,0x20,0x20,0x20,0xFC,0x22,0x22,0x22,0x22,0xF2,0x02

,0x0E,0x00,

0x00,0x00,0x7F,0x40,0x42,0x42,0x42,0x42,0x5F,0x42,0x42,0x42,0x46,0x42

,0x40,0x00,

0x04,0x18,0xE4,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x84,0x74,0x24,0x04

,0x04,0x00,

0x02,0x82,0x73,0x20,0x00,0xFF,0x12,0x14,0x11,0x02,0xFC,0x12,0x22,0x22

,0x0E,0x00,

0x00,0x00,0xFE,0x04,0x08,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00

,0x00,0x00,

0x08,0x06,0x80,0x67,0x00,0x1F,0x11,0x11,0x11,0xFF,0x11,0x11,0x11,0x18

,0x10,0x00,

0x20,0x20,0xFF,0x02,0x0C,0xF1,0x01,0x82,0x64,0x18,0x18,0x64,0x86,0x03

,0x02,0x00,

0x01,0x02,0x04,0x19,0xE1,0x41,0x01,0x01,0xC1,0x21,0x19,0x0C,0x06,0x03

,0x02,0x00,

0x00,0x01,0x02,0x04,0x08,0xF0,0x00,0x00,0x04,0x02,0xFC,0x00,0x00,0x00

,0x00,0x00,

0x10,0x11,0x16,0xFF,0x12,0x11,0x00,0x3F,0x24,0x24,0x44,0x47,0x44,0x44

,0x04,0x00,

0x40,0x80,0x00,0xFF,0x00,0x82,0x0C,0xF0,0x00,0x00,0x00,0xFF,0x00,0x00

,0x00,0x00,

};

////////////////////////////////////////////////////

void Init_m(void)

{

uint8_t contrast = *((unsigned char *)contrastSetpointAddress); //读取FLASH中对比度值

uint8_t brightness = *((unsigned char *)brightnessSetpointAddress); //读取FLASH中背光值

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

Board_init(); //初始化GPIO

SetVCore(3); //设VCore为最大

LFXT_Start(XT1DRIVE_0); //利用LFXT1(32.768kHZ)作为时钟参考 Init_FLL_Settle(25000, 762); //利用FLL将系统时钟设为最大25MHZ SFRIFG1 = 0; //清中断标志

SFRIE1 |= OFIE; //使能晶振失效中断 __enable_interrupt(); //使能全局中断

Dogs102x6_init(); //初始化LCD

Dogs102x6_backlightInit(); //背光初始化

if (contrast == 0xFF) //若当前FLASH中无对比度值,则

将对比度值设为11(默认)

contrast = 11;

if (brightness == 0xFF) //若当前FLASH中无背光值,则将背光

值设为11(默认)

brightness = 11;

Dogs102x6_setBacklight(brightness); //设置初始背光值

Dogs102x6_setContrast(contrast); //设置初始对比度值 Dogs102x6_clearScreen(); //清屏

Buttons_init(BUTTON_ALL); //初始化按键

Buttons_interruptEnable(BUTTON_ALL); //使能所有按键中断 buttonsPressed = 0;

Dogs102x6_ChineseDraw(One,6,0,0,3);

Dogs102x6_ChineseDraw(Two,6,0,2,3);

Dogs102x6_stringDraw(7, 0, " *press S1 | S2*", DOGS102x6_DRAW_NORMAL); while (!buttonsPressed) //等待按键被按下,或者超时退出等待 {

for (timeoutCounter = 0; timeoutCounter

if (buttonsPressed)

break;

__delay_cycles(1000);

}

break;

}

buttonsPressed = 0;

Dogs102x6_clearScreen();

}

///////////////////////频率测量程序////////////////////////////////// void zhouqi(void)

{

P2SEL |= 0x01; //p2.0口设置成捕获端口

TA1CTL = TASSEL_2 + MC_2 + TACLR+ID_3 ;//选择SMCLK,8分频

TA1CCTL1 = CM_1+SCS+CCIS_0+CAP+CCIE;//TA1设置成捕获模式,上升沿捕获 _EINT();

while(1)

{if(zq_flag==10)

break;

}

TA1CCTL1 &= ~CCIE;

}

///////////////////////////谐波显示的表格////////////////////////// void dis(void)

{

int aa ;

int bb ;

for(aa=0;aa

{

Dogs102x6_lineDraw(0, aa, 101, aa, DOGS102x6_DRAW_NORMAL);

}

for(bb=9;bb

{

Dogs102x6_charDrawXY(90, bb, 'v', DOGS102x6_DRAW_NORMAL);

}

Dogs102x6_stringDrawXY(1, 1, "every harmonic ", DOGS102x6_DRAW_NORMAL); Dogs102x6_lineDraw(0, 0, 0, 63, DOGS102x6_DRAW_NORMAL); Dogs102x6_lineDraw(101, 0, 101, 63, DOGS102x6_DRAW_NORMAL); Dogs102x6_lineDraw(17, 9, 17,63, DOGS102x6_DRAW_NORMAL);

}

//////////////////////////谐波数据转字符串/////////////////////////// void dischar(void)

{ char str1[10];

int disc,disc1,ch=0,ch1=0;

disbuffer=disbuffer*10;

disc=(int) disbuffer;

disc1=disc;

if(disc1>=1000)

{while(disc!=0)

{

str1[ch]=disc%10+'0';

disc=disc/10;

ch++;

}

str2[0]=str1[3];

str2[1]=str1[2];

str2[2]=str1[1];

str2[3]=46;

str2[4]=str1[0];

str2[5]='\0';

}

else if(disc1>=100)

{

while(disc!=0)

{

str1[ch]=disc%10+'0';

disc=disc/10;

ch++;

}

str2[0]=str1[2];

str2[1]=str1[1];

str2[2]=46;

str2[3]=str1[0];

str2[4]='\0';

}

else if(disc1>=10)

{

str2[2]=disc%10+'0';

str2[1]=46;

disc=disc/10;

str2[0]=disc%10+'0';

str2[3]='\0';

}

else if(disc1>=1)

{

str2[0]=48;

str2[1]=46;

str2[2]=disc%10+'0';

str2[3]='\0';

}

else if(disc1==0)

{

str2[0]=str2[2]=48;

str2[1]=46;

}

}/////////////////////////波形显示///////////////////////////// void boxin(void)

{ uint8_t bx_x, bx_y;

char str3[10],str4[10];

int results_2[64];

int bx,bx1,bx3=0,disb;

float bx2,disb1,Y[64];

for(bx=0;bx

{ results_2[bx]=results_1[bx];

Y[bx]=results_2[bx]*0.01538;//计算纵坐标

}

for(bx=0,bx_x=3;bx

{ bx2=Y[bx];

bx1=(int) bx2;

bx_y=bx1;

Dogs102x6_pixelDraw(bx_x, bx_y, DOGS102x6_DRAW_NORMAL);//描点显示 }

disb1=3125000/data;//计算频率

disb=(int)disb1;

while(disb!=0)

{

str3[bx3]=disb%10+'0';

disb=disb/10;

bx3++;

}

str4[0]=str3[1];

str4[1]=str3[0];

str4[2]='\0';

//////////////////频率显示//////////////////

Dogs102x6_stringDrawXY(52, 5, "F=", DOGS102x6_DRAW_NORMAL);

Dogs102x6_stringDrawXY(68, 5, str4, DOGS102x6_DRAW_NORMAL);

Dogs102x6_stringDrawXY(85, 5, "Hz", DOGS102x6_DRAW_NORMAL);

}

/////////////////////////////FFT运算//////////////////////////////// void fft(void)

{ int x0,x1,x2,x3,x4,x5,xx,b1,c1,L,k1,f_1;

float TR,TI;

unsigned ii,jj;

for(f_1=0;f_1

{

data_r[f_1]=results_1[f_1]*0.00088-1.42;

}

///////////////倒序///////////////////////

for(ii=0;ii

{

x0=x1=x2=x3=x4=x5=0;

x0=ii&0x01; x1=(ii/2)&0x01; x2=(ii/4)&0x01;

x3=(ii/8)&0x01;x4=(ii/16)&0x01;x5=(ii/32)&0x01;

xx=x0*32+x1*16+x2*8+x3*4+x4*2+x5;

data_i[xx]=data_r[ii];

}

for(ii=0;ii

{

data_r[ii]=data_i[ii];

data_i[ii]=0;

}

///////////////fft处理函数///////////////

for(L=1;L

{

b1=1;ii=L-1;

while(ii>0)

{b1=b1*2;ii--;}

for(jj=0;jj

{

c1=1;ii=6-L;

while(ii>0)

{c1=c1*2;ii--;}

c1=c1*jj;

for(k1=jj;k1

{

TR=data_r[k1+b1]*cos(2*PI*c1/64)-data_i[k1+b1]*sin(2*PI*c1/64); TI=data_r[k1+b1]*sin(2*PI*c1/64)+data_i[k1+b1]*cos(2*PI*c1/64); data_r[k1+b1]=data_r[k1]-TR;

data_i[k1+b1]=data_i[k1]-TI;

data_r[k1]=data_r[k1]+TR;

data_i[k1]=data_i[k1]+TI;

} }}

for(xx=0;xx

{

data_i[xx]=sqrt(data_r[xx]*data_r[xx]+data_i[xx]*data_i[xx])/32; }}

///////////////////////////////主程序//////////////////////////// void main()

{ uint8_t dd;

int ee,ff;

char cc[20];

Init_m();

while(1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

Dogs102x6_stringDraw(0, 0, "Harmonic analysis", DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(1,0,"=============",DOGS102x6_DRAW_NORMAL);

Dogs102x6_stringDraw(2, 0, " Press S1 to A/D ", DOGS102x6_DRAW_NORMAL); while (!(buttonsPressed & BUTTON_S2))

{ if(buttonsPressed & BUTTON_S1) { Dogs102x6_clearScreen(); buttonsPressed = 0; zhouqi();//频率测量 /////////////////////同步采样///////////////////////////

int aw,ad_2=0,ad_3;

float ad_4;

ad_4=data/64;

ad_3=(int) ad_4;

P6SEL |= BIT6;//p6.6口为采样端口

ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC;//开ADC12内核 ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2;//单通道多次转换

ADC12MCTL0=ADC12SREF_0+ADC12INCH_6;//选用A6通道

ADC12IE = 0x00;

ADC12CTL0 |= ADC12ENC;

TA0CTL = TASSEL_2 + MC_1 + TACLR+ID_3;//TA0增计数模式 TA0CCR0 =ad_3;

ADC12CTL0 |= ADC12SC;

TA0CCTL0 = CCIE;

_EINT();

while(1)

{

if(ad_flag==1)

{

ad_flag=0;

ad_2=1;

ADC12CTL0 &= ~ADC12ENC;

for(aw=0;aw

{

results_1[aw]=results[aw];

}}

if(ad_2==1)

break;

}

boxin();//波形显示

while (!(buttonsPressed & BUTTON_S2))

{

/////////////////////画坐标轴////////////////////////

Dogs102x6_lineDraw(0, 50, 101, 50, DOGS102x6_DRAW_NORMAL); Dogs102x6_lineDraw(3, 63, 3, 0, DOGS102x6_DRAW_NORMAL);

Dogs102x6_lineDraw(100, 49, 100, 51, DOGS102x6_DRAW_NORMAL);

Dogs102x6_lineDraw(99, 48, 99, 52, DOGS102x6_DRAW_NORMAL);

Dogs102x6_lineDraw(2, 1, 4, 1, DOGS102x6_DRAW_NORMAL);

Dogs102x6_lineDraw(1, 2, 5, 2, DOGS102x6_DRAW_NORMAL);

Dogs102x6_charDrawXY(5, 0, 'v', DOGS102x6_DRAW_NORMAL);

Dogs102x6_charDrawXY(92, 51, 't', DOGS102x6_DRAW_NORMAL);

if(buttonsPressed & BUTTON_S1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

fft();

while (!(buttonsPressed & BUTTON_S2))

{

Dogs102x6_stringDraw(0,0,"Harmonic analysis", DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(1, 0,"=================", DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(2, 0, "Fundamental wave:", DOGS102x6_DRAW_NORMAL); Dogs102x6_charDrawXY(90, 24, 'v', DOGS102x6_DRAW_NORMAL);

disbuffer=data_i[1];//基波显示

dischar();

Dogs102x6_stringDrawXY(60, 24, str2, DOGS102x6_DRAW_NORMAL);

if(buttonsPressed & BUTTON_S1)

{

Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

/////////////////////2-7次谐波显示/////////////////////////// for(dd=2,ee=10;dd

{

cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL); disbuffer=data_i[dd];

dischar();

Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL);

}

while (!(buttonsPressed & BUTTON_S2))

{ if(buttonsPressed & BUTTON_S1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

//////////////////////8-13次谐波显示////////////////////////// for(ff=dd,ee=10;dd

{ cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL);

disbuffer=data_i[dd];

dischar();

Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL);

}

while (!(buttonsPressed & BUTTON_S2))

{if(buttonsPressed & BUTTON_S1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

//////////////////////14-19次谐波显示///////////////////////////// for(ff=dd,ee=10;dd

{cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL); disbuffer=data_r[dd];

dischar();

Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL); }

while (!(buttonsPressed & BUTTON_S2))

{if(buttonsPressed & BUTTON_S1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

////////////////////////20-25次谐波显示/////////////////////////// for(ff=dd,ee=10;dd

{ cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL); disbuffer=data_i[dd];

dischar();

Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL);

}

while (!(buttonsPressed & BUTTON_S2))

{ if(buttonsPressed & BUTTON_S1)

{Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

//////////////////////26-31次谐波显示///////////////////// for(ff=dd,ee=10;dd

{ cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL); disbuffer=data_r[dd]; dischar(); Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL);

}

while (!(buttonsPressed & BUTTON_S2))

{ } } }} } } } } } } } } } }}}}

///////////////////////定时器A0中断函数//////////////////////// #pragma vector=TIMER0_A0_VECTOR

__interrupt void TIMER0_A0_ISR(void)

{static unsigned int count=0;

ADC12CTL0 &= ~ADC12ENC;

results[count]=ADC12MEM0;//读采样值

count++;

if(count==64)

{ ad_flag=1;

count=0;

TA0CCTL0 &= ~CCIE;

}

ADC12CTL0 |= ADC12ENC+ADC12SC;

}

//////////////////////定时器A1中断函数////////////////////// #pragma vector=TIMER1_A1_VECTOR

__interrupt void TIMER1_A1_ISR(void)

{switch(__even_in_range(TA1IV,14))

{case 0: break;

case 2:

newdata=TA1R;//读当前捕获值

if(newdata

{ data=65536+newdata-olddata; }

else

{ data=newdata-olddata; }

olddata=newdata;

zq_flag++;

break;

case 4: break;

case 6: break;

case 8: break;

case 10: break;

case 12: break;

case 14:break;

default: break;

}

}

毕业设计(论文)任务书

I、毕业设计(论文)题目:

电网电压谐波分析仪设计

II、毕 业设计(论文)使用的原始资料(数据)及设计技术要求:

用汇编或C语言对制作的交流电压谐波分析仪编程,实现电网电压谐波分析仪功 能。具体要求为:

1.采用交流同步采样法,采样点数不少于64点/周。

2.综合误差

3.用单片机、12位以上A/D等器件实现。

4.通过键盘控制可显示1-31次谐波分量。

5. 翻译一篇相关的英文资料。

III、毕 业设计(论文)工作内容及完成时间:

第01~03周:资料查找、方案论证、英文资料翻译、开题报告撰写。

第04~11周:软件设计与调试。

第12~14周:软硬件联调,实验测试。

第15~18周:毕业论文撰写,答辩。

Ⅳ 、主 要参考资料:

[1] 卢承领. 电力系统谐波分析仪综合设计[J]. 装备制造技术,2012第10期:275 -277

[2] 侯少红,安卓. 电力系统的谐波分析与测量[J]. 科技资讯,2011(05)

[3] 罗小东. 基于双DSP的电力系统谐波分析仪的设计[J]. 科技创新与生产力, 2011(06)

[4] 孙宏军,张涛等.智能仪器仪表[M].清华大学出版社,2007.1

[5] 张先庭.单片机原理、接口与C51应用程序设计 [M].国防工业出版社,2011.1

[6] Sutherland P E.Harmonic measurements in industrial power system[J].IEEE Trans on 1995,31(1):175-183.

学院 专业类

学生(签名):

日期: 自 2013 年 2 月 25 日至 2013 年 6 月 15 日

指导教师(签名):

助理指导教师(并指出所负责的部分):

电子工程 系(室)主任(签名)

附注:任务书应该附在已完成的毕业设计说明书首页。

电网电压谐波分析仪设计

学生姓名: 班级:

指导老师:

摘要:随着科学技术的进步,各种新型的用电设备在社会的各个领域得到了广泛的使用,由于设备运行所要求的高安全性和精确性,对电能的使用和需求产生了更高的要求,但非线性负荷的大量使用却带来了严重的电力谐波污染,给系统安全、稳定、高效运行和供用电设备造成严重影响及危害。最大限度的减少谐波的危害,是电力系统领域极为关注的问题,而解决这一问题的关键在于定量地确定谐波的成分、幅值等。提高电网谐波监测分析水平,对于抑制高次谐波含量是十分必要和有价值的。

该谐波分析仪是基于MSP430单片机进行设计的,软件使用CCSV5.1平台开发,采用模块化程序设计思想,针对谐波分析仪的性能指标将其分为测频采样、波形显示和谐波显示三大模块。它能对输入的交流电压进行频率测量,根据测得的频率对输入电压进行交流同步采样,并显示输入电压的波形;再通过FFT算法计算出各次谐波,并通过按键在液晶屏上显示各次谐波。

本文从谐波分析仪的系统组成、工作原理、硬件设计和软件设计等方面介绍了电压谐波分析仪的设计。调试时将该分析仪测得的频率、电压峰值、基波幅值等电参量与标准测试的结果相比较,其结果的综合误差在百分之一以内,达到了设计的要求。

关键词:MSP430单片机 交流同步采样 FFT 谐波显示

指导老师签名:

The power grid voltage harmonic analyzer software design

Student name: Class:

Supervisor:

Abstract:With the progress of science and technology, various new types of electrical equipment in all spheres of society has been widely used, the equipment to perform the required high accuracy, and safety use of electricity and demand produced higher requirements, but the use of non-linear load has brought serious electric power harmonic pollution, to system safety, stable and efficient operation and power supply equipment caused serious effect and harm. Minimize the harm of harmonic, is extremely concern power system field, and the key to solve this problem is to quantitatively determine the harmonic component, amplitude, etc. Improve the level of power grid harmonic monitoring and analysis, to restrain high harmonic content is very necessary and valuable.

The harmonic analyzer is designed based on MSP430 SCM, use CCSV5.1 platform development software, adopt modularization program design idea, in view of the performance of the harmonic analyzer, which can be divided into sampling, waveform display and harmonic frequency measurement are three big modules. It can input ac voltage frequency measurement, according to the measured frequency of the input voltage of ac synchronous sampling, and display the input voltage waveform; Again through the FFT algorithm to calculate the every harmonic, and through the keys displayed on the LCD screen every harmonic.

This article from the harmonic analyzer system composition, working principle, hardware design and software design of voltage harmonic analyzer is introduced in aspects of design. When debugging the analyzer measured frequency, electric parameters such as voltage peak value, amplitude value compared with the oscilloscope to test results, the results of the comprehensive error within one percent, meet the design requirements.

Keywords: MSP430 microcontroller Ac synchronous sampling

FFT Harmonic show

Signature of Supervisor:

1 绪 论

1.1、选题的依据及意义

电能是一种经济、实用、清洁且容易控制和转换的能源形态,其应用程度是一个国家发展水平的主要标志之一。作为一种特殊商品,电能同样具有商品指标可被测量、商品形态可被描述、商品性能可被改善等特征、因此与其他商品一样,电能也应该讲求质量问题。电能质量问题主要分为稳态电能质量问题和暂态电能质量问题两大类。稳态电能质量问题包括频率偏移、电压偏移、谐波等以波形畸变为特征的扰动问题,其中以谐波问题为代表。

随着工业的发展和科学技术的进步,电力系统的谐波污染也越来越严重。工业中的各类静止换流器、电动机、开关电源,生活中的荧光灯、电视机等在给工农业生产和人们的日常生活带来便利的同时,也向电网倾泻着大量的谐波垃圾。电力谐波不仅造成电压波形畸变,使电能质量下降、电能损耗增大;谐波还可能引起重要的控制和保护装置出现故障、电力设备过载或破坏等。

像很多其它形式的污染一样,谐波的发生会影响整个电环境,并波及到离谐波源很远的地方。谐波污染不像水资源和大气污染现象那么直观,人们一般感觉不到它的存在,波形污染的存在往往在遭受代价昂贵的事故损失后才被探测出来。随着整个国民经济的增长,非线性电力负荷还有不断增长的趋势,其对电力系统带来的影响也同步增长。国外的经验表明,各种非线性用电设备容量的增长率大大超过电网的发电量的增长率,这一事实决定了谐波监督和治理工作的长期性和艰巨性。因此,正确分析电力网谐波产生的根源和机理、进而采取有效措施最大限度地抑制其影响、保证电网的安全运行是非常重要和必要的。

电力系统中,各种谐波源产生的谐波对电力系统环境造成污染,影响到整个电力系统的电气环境,包括电力系统本身和广大用户。初步归纳起来主要表现有,由于流过高次谐波电流,造成用电设备因额外功耗而过热,或者发生磁感应障碍;由于高次谐波而形成的畸变率,对利用电压谐波控制的设备,可能造成误动或失控;由于高次谐波的存在,通讯线路将出现噪音和危险的感应电动势。

综上所述,可以看出不论从保证电力系统和供电系统的安全经济运行或是保证设备和人身的安全来看,对谐波污染造成的危害影响加以经常检测和限制都是迫切需要的。

1.2、研究概况及发展趋势

电力系统谐波问题不是一个新问题。早在20世纪30年代,西方国家就已提出静态整流器产生的波形畸变问题,各国电力专家开始认识到了谐波的重要性。但只是在近十几年来,随着电力系统的发展,负载特性的非线性化,谐波造成的危害逐渐增大和增多,对这个领域的研究才逐渐开始引起各国电力系统工程界的密切关注。

在评价一个电力系统的供电质量时,一般只要求电网电压的幅值和频率保持稳定,因而在国家电气规程中,主要规定了有关电压幅值和供电频率的标准与其它指标相比,这两项指标更主要地决定了电气设备的工作频率和电网的技术经济指标。近几十年来,由于谐波问题的出现,在某些情况下谐波所产生的危害范围和程度与电能的主要质量指标不合格产生的危害不相上下。发达国家的经验和预测表明,随着科学技术的发展,非线性负荷用电设备的种类、数量和用电量还将迅猛增加。国际上公认谐波污染是电网的公害,必须采取措施加以限制。从1984年开始,每两年召开一次的电力系统谐波国际会议,为这个领域的国际交流提供了直接的渠道,推动着谐波研究工作的开展。

由于实测电网谐波的干扰状况已成为保证电网安全经济运行、高质量供电必不可少的措施之一,世界各国都相应研制和开发了一系列的谐波测量分析装置和仪器。谐波测量和分析的历程发展至今已经随着集成电路和微处理器及计算机的迅速发展而产生了一系列基于快速傅立叶变换的谐波分析仪,被测信号经采用保持、A/D转换、傅立叶计算输出结果,测试操作简单方便,计算机结果快速准确。新一代多功能、数字化、自动化和智能化的谐波测量分析仪已经成为发展的主要方向。

近年来,世界各国在研制和使用谐波分析仪方面发展较为迅速,仪器的性能先进,测量功能齐全,适用范围广,且耐用可靠,但价格较为昂贵。相比之下国内的谐波分析仪价格较低,但是制造工艺较差,可靠性和精度方面还存在缺陷。 电力系统谐波测量算法向复杂化、智能化发展,谐波测量与谐波分析如何相互配合,针对非稳态波形畸变,寻求新的数学方法,如小波变换等,是人们关注的方向。另外,硬件设备的精度、速度和可靠性的快速发展,为实现高性能算法和实时控制奠定了基础。

1.3、研究的内容

本设计以MSP430F5529单片机为核心,采用CCSV5.1软件开发平台进行编程,其研究的主要内容如下:

1、MSP430F5529最小系统的构建;

2、CCSV5.1软件开发平台的功能及使用方法;

3、MSP430单片机定时器模块的功能;

4、MSP430单片机A/D采样模块的功能;

5、频率测量程序的编写;

6、交流同步采样程序的编写;

7、FFT算法的原理;

8、按键及液晶显示程序的编写。

2 系统组成及工作原理

2.1、系统设计方案

2.1.1、硬件设计方案

用电流型互感器对输入的交流电压进行降压,降压后进行整形和单极性变换,用滞回比较器可以将正弦波整形成方波,以用于频率的测量;用MC1403芯片产生一个直流电压,在输入的交流电压上叠加直流电压,将交流电压提升到零伏以上实现单极变换,以用于交流采样。单片机控制102×64液晶进行液晶显示,另外,单片机外接两个按键进行液晶显示的控制。

2.1.2、软件设计方案

在CCSV5.1平台上用C语言进行编程,采用定时器A1的捕获模式对输入的方波进行频率测量,根据测得的频率计算出交流采样的采样间隔。用MSP430单片机自带的12位AD进行A/D采样,采样模式设置成单通道多次采样,将定时器A0设置成增计数模式,当定时时间到了就进入定时器中断读取当前的采样值,完成64点等间隔采样后关闭A/D,然后对采得的数据进行处理。将采样数据转换成液晶显示屏上的坐标,描点显示出交流电压的波形;对采样数据进行FFT运算,得到基波和各次谐波的幅值,再通过按键对各次谐波进行翻页显示。

2.2、系统组成

该谐波分析仪系统以MSP430F5529单片机为核心,其外围模块电路包括:电压取样电路、滤波电路、整形电路、单极性变换电路、按键电路和液晶显示电路。系统组成框图如图 2.1 所示:

图 2.1 系统组成框图

2.3、系统工作原理

通过电压取样电路对输入的220V交流电压进行降压,降压后通过低通滤波器进行滤波,滤波后的电压信号分别输入到单极性变换电路和整形电路中。单极性变换电路通过MC1403芯片产生一个直流电压,将该直流电压通过运放叠加到所输入的交流电压上面就可以完成单极性变换。电压整形电路由滞回比较器构成,将滤波后的正弦电压通过该模块就可以被整形成方波。将方波输入到MSP430单片机系统就可以进行频率的测量,通过所测得的频率就可以计算出交流电压采样的时间间隔。将单极性变换后的交流电压输入到单片机系统,根据测频所计算的采样间隔时间进行64点交流同步采样。采样完成之后,根据采样数据计算出各点的坐标,然后在液晶屏上显示电压的波形。进行FFT运算,计算出各次谐波的幅值并通过按键在液晶屏上显示各次谐波。

3 谐波分析算法介绍

电力系统的谐波分析,通常是采用快速傅里叶变换(FFT);小波变换由于其良好的时频分析特性也在谐波分析领域得到了广泛应用;本设计采用的是快速傅里叶变换。

快速傅里叶变换(FFT)是当今谐波检测中应用最广泛的一种谐波检测方法,它可以方便的实现信号的计算分析。

快速傅里叶变换是离散傅里叶变换(DFT)的一种快速算法,FFT算法就是不断地把长序列的DFT分解成几个短序列的DFT,并利用蝶形因子的周期性与对称性,来减少运算次数。使用该方法测量谐波,精度较高,使用方便。因此,在进行谐波分析的时候,首先要进行FFT分析。该算法最简单最常用的是基2FFT。

其主要原理分析如下:

DFT的定义式如(3-1)式所示:

kn(3-1) X(k)=∑x(n)WNRN(k) k=0,1…..N-1

n=0N-1

式中nkWN称为蝶形因子。若按此直接计算DFT,其运算量为N2次复乘和N(N+1)次复加。当N很大时,运算量就相当的大,为此采用快速傅里叶变换。

FFT算法一般可以分为时间抽取FFT和频率抽取两大类。时间抽取FFT算法是每一级处理都在时域里把N点的输入序列按照奇数和偶数分为奇序列和偶序列;而频率抽取FFT是在频域里把序列分解成奇、偶的序列形式来计算。

为了将大点数的DFT分解为小点数的DFT进行运算,要求序列的长度N为复

M合数,最常用的是N=2的情况(M为正整数)。先将序列x(n)按奇偶项分成两

组:

⎧x(2r)=x1(r)N⎨r=0,1, ,-1x(2r+1)=x2(r)⎩2

然后,将DFT运算也相应分为两组

knX(k)=DFT[x(n)]=∑x(n)WN

n=0N-1

=∑x(2r)Wr=0

N/2-1

r=0N/2-12rkNN/2-1+∑x(2r+1)Wr=0kNN/2-1r=0(2r+1)kN

=∑x1(r)W2rkN+W∑x22rk(r)WN

=∑x1(r)W

r=0

N/2-1

rkN/2

+W

kN

N/2-1r=0

∑x

2

rk

(r)WN/2

k

=X1(k)+WNX2(k)

(3-2)

其中X1(k)、X2(k)分别是x1(n)、x2(n)的N/2点的DFT:

X1(k)=∑x1(r)W

r=0N/2-1r=0N/2-1

rk

N/2

N/2-1

=

r=0

rk

x(2r)WN/2,0≤k≤

N

-1 (3-3) 2

N

-1 (3-4) 2

X2(k)=∑x2(r)W

rkN/2

N/2-1

=

r=0

rk

x(2r+1)WN/2,0≤k≤

至此,一个N点DFT被分解为两个N/2点的DFT。 由式子

k

X(k)=X1(k)+WNX2(k)

可得:

Nk

X(k+N)=X1(k)-WNX2(k)其中k=0,1, ,-1,

2

这样N点DFT可全部由下式确定出来:

k

⎧⎪X(k)=X1(k)+WNX2(k)N⎨kk=0,1, ,-1⎪⎩X(k+N/2)=X1(k)-WNX2(k) 2

上式可用一个专用的碟形符号来表示,如图3.1所示符号对应一次复乘和两次复加运算。

a

k

a+WNb

b

k

WN

-1

k

a-WNb

N2N2

()=

只需要24次复数乘

图3.1蝶形运算符号

通过这样的分解以后,每一个N/2点的DFT

N2N2

法,两个N/2点的DFT需要次复乘,再加上将两个N/2点DFT合2()=

22

N2NN2次复乘。可并成为N点DFT时有N/2次与W因子相乘,一共需要 +≈222见,仅仅经过一次分解,就使运算量减少近一半。

依次类推,经过M次分解,最后将N点DFT分解成N个1点DFT和M级蝶形运算,而1点DFT就是时域序列本身。

4 系统硬件设计

4.2、按键电路

MSP430F5529开发板上有S1和S2两个按键可供使用,S1按键接p1.7引脚,S2按键接p2.2引脚,其连接电路如图4.2所示。

图4.2 按键电路

4.3、电压取样电路设计

采用电流型互感器进行降压,在有效值220V的交流电压上串联一个240K

的电阻R5,则输入电流互感器的电流为0.917mA。电流互感器的输入和输出电流是相等的,所以输出电流也为0.917mA,再接一个1K的电阻R2,就得到了有效值为0.917V、峰值为1.296V的交流电压。

该部分电路如图4.3所示: 图4.3 电压取样电路

4.4、整形电路设计

整形电路是要将输入的正弦波整形成方波,用一个滞回比较器就可以完成整形。滞回比较器中电阻R13阻值取100欧姆,R15的阻值取10千欧,这样便可以计算出阈值电压为正负0.12V,通过该电路便可以将正弦波整形成方波,且频率不会变化。通过电阻R16和R17分压,使输出方波的低电平为0V,高电平为 3.24V,可以输出给单片机进行频率测量。

整形电路如图4.4所示:

图4.4 整形电路

4.5、滤波电路设计

设计要求最高显示31次谐波,而基波频率是50Hz,则31次谐波的频率为

1550Hz,为了避免干扰,使测量更加准确,这里应该将更高频率的谐波滤除掉。滤波电路采用一阶有源低通滤波器进行滤波,将RC无源低通滤波器的输出接同相比例运算电路的输入端就构成了一阶有源低通滤波器,电阻R8的参数取820欧姆,电容C5取0.1uf,则该滤波器的截止频率f=1/2πRC = 1941.9Hz,这样即保留了1—31次谐波,又将更高次谐波滤除掉了,硬件中加入滤波电路能有效的滤除高频干扰,降低误差。

滤波电路如图4.5所示:

图4.5 滤波电路

4.6、单极性变换电路设计

在交流电压上面叠加一个直流电压就可以完成单极性变换,所以先要产生一

个直流电压,该直流电压要使正弦波的负半周完全抬升到零伏以上,且电压的最大值不能超过MSP430单片机允许的最大采样电压3.3V;为防止电网中电压的波动,要给单片机留有一定的电压余量,所以抬升后的最大电压要与单片机的最大采样电压有一定的缓冲量。

直流基准电压用MC1403芯片产生,该芯片是高准确度、低温漂、采用激光修正的带隙基准电压源,常用在那些需要基本精准的基准电压的场合。用该芯片产生一个5V的直流电压,分压电阻R11取820欧姆,R14取330欧姆,通过电阻分压可以得到1.435V的直流电压,再通过加减运算电路就可以将该直流电压叠加到交流电压上面,抬升之后的交流电压最大值为2.731V,最小值为0.139V,既完成单极性变换,又留有一定的的缓冲量。

复位信号。

液晶显示电路如图4.7所示:

图4.7 液晶显示电路

5 系统软件设计

5.1、软件开发环境介绍

系统软件使用CCSV5.1开发平台编写。CCS是TI公司研发的一款具有环境

配置、源文件编辑、程序调试、跟踪和分析等功能的集成开发环境,能够帮助用户在一个软件环境下完成编辑、编译、链接、调试和数据分析等工作。CCSV5.1为CCS软件的最新版本,功能更强大、性能更稳定、可用性更高,是MSP430软件开发的理想工具。

5.2、主程序设计

先对MSP430单片机系统进行初始化,用定时器TA1进行频率测量,通过测

得的频率计算出采样间隔,用定时器TA0控制A/D进行等间隔采样,采样完成后进行波形显示,然后将采样所得数据进行FFT运算得到各次谐波的幅值,最后在液晶屏上将各次谐波显示出来。

N

图5.1 主程序流程图

5.3、频率测量程序设计

频率测量要用到MSP430单片机的定时器,定时器的使用主要由TACTL控制寄存器和TACCTL捕获/比较控制寄存器来控制。 TACTL控制寄存器

TACTL的SSEL1和SSEL0两位控制时钟源的选择

TASSEL_0 :输入时钟源为TACLK TASSEL_1 :输入时钟源为ACLK TASSEL_2 :输入时钟源为SMCLK TASSEL_3 :输入时钟源为INCLK

ID1,ID0控制输入分频选择 ID_0 :不分频 ID_1 :2分频 ID_2 :4分频 ID_3 :8分频 MC1,MC0是计数模式控制位 MC_0 :停止模式 MC_1 :增计数模式 MC_2 :连续计数模式 MC_3 :增/减计数模式 CLR :定时器清除位 TAIE :定时器中断允许位 TAIFG :定时器中断溢出标志位 TACCTL捕获/比较控制寄存器

CM1-0 选择捕获模式

CM_0 :禁止捕获模式 CM_1 :上升沿捕获 CM_2 :下降沿捕获

CM_3 :上升沿与下降沿都捕获

SCS选择捕获信号与定时器时钟同步、异步关系

0 异步捕获 1 同步捕获

CAP选择捕获模式还是比较模式

0 比较模式 1 捕获模式

用定时器A1进行频率的测量,将定时器A1设置成捕获模式,当方波的上升沿到来时,记录当前定时计数器的值,通过连续两次计数值的差即可算出所测频率的大小。

首先要进行时钟的选择和定时器计数模式的选择,这些由TA1CTL寄存器决定,该寄存器选择TASSEL_2,即时钟选择了子系统时钟SMCLK,选择ID_3,即将时钟进行了八分频,在系统初始化时将子系统时钟倍频为25M,八分频之后为3.125M,即定时器A1的时钟为3.125M;选择MC_2,将计数模式设置为连续计数模式,并要将计数初值清零。

TA1CTL = TASSEL_2 + MC_2 + TACLR+ID_3 ;这条语句便可完成上述设置。

然后是定时器捕获模式的设置,由TA1CCTL1捕获控制寄存器控制。将CAP置1,将定时器设置成捕获模式;选择CM_1,即捕获模式为上升沿捕获;将SCS为置1,即选择同步捕获模式,并打开定时器捕获中断,当上升沿来时就会进入捕获中断。

TA1CCTL1 = CM_1+SCS+CCIS_0+CAP+CCIE;这条语句可实现上述功能。 将定时器A1设置好后,打开捕获中断,等待连续两次捕获完成。在捕获中断程序中用newdata变量记录当前TA1R计数器中的值,用olddata变量记录上一次捕获事件时TA1R计数器的值。

比较olddata和newdata的大小,如果newdata大,则说明没有发生溢出,则

data=newdata-olddata;若olddata大,则说明发生了溢出,则

data=65536+newdata-olddata;而定时器时钟为3.125M,那么用3125000除以data的值即可得到频率值了。

测频程序流程图如图5.2所示:

图5.2测频程序流程图

定时器A1中断服务程序流程图如图5.3所示:

图5.3 定时器A1中断程序流程图

5.4、A/D采样程序设计

选用MSP430单片机的ADC12模块进行采样,该模块由ADC12CTL0转换控制寄存器0和ADC12CTL1转换控制寄存器1一起控制。

ADC12SC采集/转换控制位 ADC12ENC转换允许位

ADC12TVIE转换时间溢出中断允许位 ADC12OVIE溢出中断允许位 ADC12ON ADC12内核控制位 0 关闭ADC12内核 1 打开ADC12

内核 REFON参考电压控制位

2.5V内部参考电压的电压值选择位 MSC多次采样/转换位

SHT1,SHT0 采样保持定时器1,采样保持定时器0 CSSTARADD 转换存储地址位 SHS 采样触发输入源选择位

0 ADC12SC 1 Timer_A.OUT1 2 Timer_B.OUT0 3 Timer_B.OUT1

SHP 采样信号(SAMPCON)选择控制位

0 SAMPCON源自采样触发信号 1 SAMPCON源自采样定时器

ISSH 采样输入信号方向控制位

ADC12DIY ADC12时钟源分频因子选择位 ADC12SSEL ADC12内核时钟源选择

0 1 2 3

ADC12内部时钟源:ADC12OSC ACLK MCLK SMCLK

CONSEQ 转换模式选择位

0 1 2 3

单通道单次转换模式 序列通道单次转换模式 单通道多次转换模式 序列通道多次转换模式

ADC12BUSY ADC12忙标志位(只用于单通道单次转换模式)

对采样模块进行操作时要先打开ADC12内核,即要使ADC12ON置1;因为要进行多点采样,所以将采样模式设置成单通道多次采样模式,并要使ADC12MSC多次采样/转换位置1,同时设置好采样保持时间。

ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC ;这条语句便可实现上述设置。

采样定时器由采样输入信号的上升沿触发,所以要使ADC12SHP位置1,采样模式为单通道多次转换,即模式选择为ADC12CONSEQ_2,这些由ADC12CTL1寄存器控制。

ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2 ;这条语句可实现上述功能。

采样结果的存储由ADC12MCTLx转换存储控制寄存器控制,这里选用ADC12MEM0转换存储器,即其控制寄存器为ADC12MCTL0,该寄存器要进行参考电压的选择和采样转换通道的选择。参考电压选择为系统的供电电压,即选择ADC12SREF_0位,通道选择为A6通道,即选择ADC12INCH_6位,

ADC12MCTL0=ADC12SREF_0+ADC12INCH_6;这条语句可实现上述设置。 因为要对交流电压进行等间隔采样,所以用定时器A0进行采样间隔的控制。定时器A0要设置成增计数模式,同样选择子系统时钟SMCLK进行八分频, 即:TA0CTL = TASSEL_2 + MC_1 + TACLR+ID_3。

测频程序所得的两次捕获的差值除以64,所得数据即为捕获比较寄存器TA0CCR0的值,打开定时器A0中断,当TA0R的计数值等于TA0CCR0的值时,TA0R计数器的值清零并进入到定时器中断服务程序。在定时器A0的中断服务程序中,先关闭A/D转换,读取当前转换存储器ADC12MEM0的值,并判断是否为第64次采样,若是,则将采样标志置1,结束采样;若不是,则继续采样,等待下一次定时器中断,直到64点等间隔采样完成为止。

图5.4 A/D采样流程图 图5.5 定时器A0中断程序流程图

5.5、波形显示程序设计

采样点数为64点,所以正弦波波形由64个点描绘而成。所用液晶显示为102

×64液晶,64个点的横坐标依次为0~63,主要是要确定每个点的纵坐标位置。纵坐标位置由A/D采样的数值确定,采样数值范围是0~4095,而纵坐标范围是0~63,采样值与坐标是相对应的,用采样值乘以参数0.01538并转换成整形数据即为该点的纵坐标值。得到每个点的坐标之后,使用for循环将64个点在液晶屏上依次描绘出来,这样就可以显示一个周期的正弦波形了。

5.6、按键及显示程序设计

MSP430F5529单片机的开发板只用到了S1和S2两个按键,S1和S2分别接单片机的p1.7和p2.2引脚,单片机的P1和P2端口的16个引脚都是有具有中断功能的。在MSP430F5529.h宏定义中定义了一个16位寄存器PA,再定义一个变量buttonsMask,令buttonsMask=0x48,即对应上了p1.7和p2.2两个端口。

将p1.7和p2.2的SEL寄存器置零,即PASEL &= ~buttonsMask,将引脚选择为I/O功能;

将IES寄存器置零,PAIES&= ~buttonsMask; 将中断触发选择为上升沿触发; 将IFG寄存器清零,PAIFG &= ~buttonsMask; 将中断标志清零;

最后将IE寄存器置1,PAIE |= buttonsMask; 开外部中断,等待按键按下。 若有键按下,则判断是哪个键按下,这通过查看中断标志PAIFG寄存器可以知道,若S1键被按下,则将BUTTON1寄存器置1;若S2键被按下,则将BUTTON2寄存器置1‘

用变量buttonsPressed记录按键信息,buttonsPressed = PAIFG & BUTTON_ALL;

并在看门狗中断程序中用看门狗定时器WDTCTL设置一个250ms的消斗程序,即:WDTCTL = WDTPW + WDTSSEL_1 + WDTTMSEL + WDTCNTCL + WDTIS_5;

在主程序中只需要检查BUTTON1和BUTTON2的值就可以知道是哪个键按下。

102×64液晶屏是以描点的形式显示,所以先要将字母、各种符号的字模先做好,并用数组存储好。液晶显示要确定四个参数,先要确定显示的位置,即确定x和y的坐标值;然后是查表确定显示的字模,即显示的数据;最后是确定显示的模式。当这些都确定了就可以在液晶屏上的指定位置显示数据了。显示时是以字符形式显示,所以采样所得的整形或浮点型数据必需先转换成字符型数据才可以正确的显示出来。

6

系统调试

通过方案的选择,原理图的设计,PCB板的绘制,元器件的选择确定,硬件电路的焊接及相关程序的编写,完成了电压谐波分析仪的设计,其整体实物图如图6.1

图6.1 系统实物图

6.1、软件调试

先进行按键和显示程序的调试。单片机上电之后液晶显示屏上会显示相应的内容,当有键按下之后便会清除当前显示内容,并进行频率的测量。上电后所显示的内容如图6.2所示:

图6.2 初始界面显示

然后进行频率测量程序的调试。用定时器A2控制产生一个方波,测量该方波的频率,即可知道测频程序有没有作用。TA2CTL = TASSEL_2 + MC_1+TACLR+ID_3 ;定时器A2的时钟设置为3.125M,计数模式为增计数模式,捕获比较寄存器TA2CCR0赋值为31250,P1DIR |= 0x01,以单片机的p1.0口为方波的输出端口;当TA2R计数到到31250时,计数器清零并进入定时器A0的中断,在中断程序中将p1.0端口取反,即:P1OUT ^= 0x01;这样便产生了一个频率为50Hz的方波。通过测频程序测量两次捕获的计数差值为62500,用时钟3125000除以62500即为50,说明测频程序可以正确的测量到频率。

调试时没有交流电源,所以采样的电压用一节干电池提供,采样完成后查看存储采样值的数组,数组中64个数值都在1710左右,这说明实现了64次采样;电池的电压为1.5V,通过采样值计数出来的电压为1.503V,这说明采样的数值是准确的。通过波形显示程序也可以在液晶屏上描绘出一条直线,这说明波形显示程序也是可行的。但是是对直流电压进行采样,所以是不是等间隔采样,这里还是无法证明,必须对交流电压进行采样才可以确定是不是等间隔采样,这一步要在和硬件联合调试时才可以证明。

6.2、系统联合调试及分析

先用示波器观察硬件电路的输出波形,单极性变换之后的波形图如图6.3所

示:

图6.3 单极性变换效果图

可以观察到单极性变换之后,整体波形抬高到了零伏以上,且波形没有失真,峰值为1.295V,其最大电压没有超出最高采样电压,所以硬件电路单极性变换之后所产生的交流电压是可以用于A/D采样的。

用示波器观察整形电路输出的方波波形,整形之后所输出的方波如图6.4所示:

图6.4 整形效果图

由图6.4可知整形电路可以产生标准的方波,方波最小值为0V,最大值为3.20V,没有超过MSP430单片机所允许的最大电压;整形之后的方波频率为50.0191Hz,所以硬件电路所产生的方波是可以用于频率测量的。

将硬件的方波输出端接单片机的p2.0捕获端口,交流输出端接单片机p6.6采样端口。在测频程序结束处设置断点,程序运行至该断点处,查看两次捕获的差值data=62390,用3125000除以data的值为50.088,与示波器所测频率相差0.14%,这说明可以准确的测量到交流电压的频率。

将程序运行至波形显示程序结束,液晶屏所显示的波形如图6.5所示:

图 6.5 波形显示

液晶屏可以正确显示正弦波波形和所测频率的大小,这说明交流采样程序和波形显示程序是正确的,实现了交流同步采样。

要将该谐波分析仪进行校准才可以用其监测电网中的谐波。这里用BD-3D多功能校验产生频率为50Hz、有效值为220V的基波,同时叠加有效值为22V的二次谐波和有效值为10V的五次谐波。对该复合波进行采样和FFT运算,可以计算出基波为220.4V,二次谐波为21.8V,五次谐波为10.1V,其他各次谐波趋近于零,其综合误差在1%以内,完成了校准。

图6.6 校准效果图

完成谐波分析仪的校准之后,便可以用其测量电网中的各次谐波,并用按键控制基波和各次谐波的显示。

图6.7 基波显示

图6.8

2-7次谐波

图 6.9 8-13次谐波

图6.11 20-25次谐波

图 6.12 26-31次谐波

由测量结果可知,电网中的电压有效值并不是标准的220V电压,有一点偏差。其各次谐波中,低次谐波较多,高次谐波基本趋近于零。

7 总结与展望

7.1、总结

7.2、展望

参考文献

[1] 卢承领.电力系统谐波分析仪综合设计[J]. 装备制造技术,2012第10期:275 -277

[2] 侯少红,安卓.电力系统的谐波分析与测量[J]. 科技资讯,2011.5

[3] 罗小东.基于双DSP的电力系统谐波分析仪的设计[J]. 科技创新与生产力, 2011.6

[4] 孙宏军,张涛等.智能仪器仪表[M].清华大学出版社,2007.1

[5] 张先庭.单片机原理、接口与C51应用程序设计 [M].国防工业出版社,2011.1

[6]高西全.数值信号处理第三版[M].西安电子科技大学出版社,2008.5

[7]沈建华.MSP430系列单片机原理与实践[M].北京航空航天大学出版社,2008.5

[8]李智奇.MSP430系列单片机原理与系统设计[M].西安电子科技大学出版社,2007.9

[9]秦龙.MSP430单片机C语言应用程序设计[M].电子工业出版社,2008.6

[10]黄智伟.全国大学生电子设计竞赛训练教程[M].北京:电子工业出版社,2005:142-161.

[11]胡学海.单片机原理及应用系统设计[M].电子工业出版社,2005,2-7

[12]吴大正.信号与线性系统分析第四版[M].高等教育出版社,2005.8

[13]尹建华.微型计算机原理与接口技术第二版[M].高等教育出版社,2007.9

[14]阎石.数字电子技术基础第五版[M].高等教育出版社,2006.5

[15]蔡明生.电子设计[M].北京高等教育出版社,2004.1.

[16]华成英.模拟电子技术基本教程[M].清华大学出版社,2005.9

[17]谭浩强.C程序设计第三版[M].清华大学出版社,2005.7

[18]邱关源.电路第五版[M].高等教育出版社,2006.3

[19]常键生.检测与转换技术第三版.机械工业出版社, 2004.6

[20] Sutherland P E.Harmonic measurements in industrial power system[J].IEEE Trans

on 1995,31(1):175-183.

致 谢

附录:

程序清单

#include

#include

#include

#include "HAL_PMM.h"

#include "HAL_UCS.h"

#include "HAL_Board.h"

#include "HAL_Buttons.h"

#include "HAL_Cma3000.h"

#include "HAL_Dogs102x6.h"

#include "stdlib.h"

uint16_t timeoutCounter;

volatile uint32_t t2_count=0,F_flag=0;

uint32_t cap,newdata,olddata,data;

uint32_t zq_flag=0;

#define PI 3.14

int results[64],disp_1[32];

int results_1[64];

char str[20],str2[10];

float disbuffer,data_r[64],data_i[64];

int ad_flag,flag_1,di;

int count;

////////////////////////XXXX大学的字模//////////////////////////

uint8_t One[]={

0x20,0x20,0x27,0x24,0x24,0x26,0x2D,0xF4,0x24,0x25,0x26,0x24,0x24,0x67

,0x20,0x00,

0x00,0x00,0xFE,0x20,0xA0,0xA0,0xA0,0xFE,0xA0,0xA0,0xA0,0xA4,0x22,0xFC

,0x00,0x00,

0x00,0x00,0x00,0x7E,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x7E,0x00,0x00

,0x00,0x00,

0x00,0x00,0xFE,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xFE,0x00

,0x00,0x00,

0x01,0x01,0x3F,0x69,0xA5,0x3F,0x00,0x10,0x17,0x94,0x54,0x17,0x10,0x10

,0x00,0x00,

0x01,0x06,0xF8,0x42,0x21,0xFE,0x01,0x06,0xF8,0x00,0x00,0xFC,0x02,0x02

,0x0E,0x00,

0x08,0x30,0x21,0x22,0x24,0x28,0xA0,0x60,0x20,0x28,0x24,0x22,0x21,0x28

,0x30,0x00,

0x00,0x02,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x02,0x02

,0x00,0x00,

0x04,0x04,0x04,0x04,0x04,0x04,0x05,0xFE,0x05,0x04,0x04,0x04,0x04,0x04

,0x04,0x00,

0x00,0x01,0x02,0x04,0x08,0x30,0xC0,0x00,0x80,0x60,0x10,0x0C,0x06,0x03

,0x02,0x00,

0x02,0x0C,0x08,0x48,0x3A,0x2A,0x0A,0x8A,0x7A,0x2B,0x0A,0x18,0xEA,0x4C

,0x08,0x00,

0x00,0x40,0x40,0x40,0x40,0x40,0x42,0x41,0xFE,0x40,0x40,0x40,0x40,0x40

,0x40,0x00,

};

/////////////////////电压谐波分析的字模////////////////////////////

uint8_t Two[]={

0x00,0x00,0x1F,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x1F,0x00

,0x00,0x00,

0x00,0x00,0xF0,0x20,0x20,0x20,0x20,0xFC,0x22,0x22,0x22,0x22,0xF2,0x02

,0x0E,0x00,

0x00,0x00,0x7F,0x40,0x42,0x42,0x42,0x42,0x5F,0x42,0x42,0x42,0x46,0x42

,0x40,0x00,

0x04,0x18,0xE4,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x84,0x74,0x24,0x04

,0x04,0x00,

0x02,0x82,0x73,0x20,0x00,0xFF,0x12,0x14,0x11,0x02,0xFC,0x12,0x22,0x22

,0x0E,0x00,

0x00,0x00,0xFE,0x04,0x08,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00

,0x00,0x00,

0x08,0x06,0x80,0x67,0x00,0x1F,0x11,0x11,0x11,0xFF,0x11,0x11,0x11,0x18

,0x10,0x00,

0x20,0x20,0xFF,0x02,0x0C,0xF1,0x01,0x82,0x64,0x18,0x18,0x64,0x86,0x03

,0x02,0x00,

0x01,0x02,0x04,0x19,0xE1,0x41,0x01,0x01,0xC1,0x21,0x19,0x0C,0x06,0x03

,0x02,0x00,

0x00,0x01,0x02,0x04,0x08,0xF0,0x00,0x00,0x04,0x02,0xFC,0x00,0x00,0x00

,0x00,0x00,

0x10,0x11,0x16,0xFF,0x12,0x11,0x00,0x3F,0x24,0x24,0x44,0x47,0x44,0x44

,0x04,0x00,

0x40,0x80,0x00,0xFF,0x00,0x82,0x0C,0xF0,0x00,0x00,0x00,0xFF,0x00,0x00

,0x00,0x00,

};

////////////////////////////////////////////////////

void Init_m(void)

{

uint8_t contrast = *((unsigned char *)contrastSetpointAddress); //读取FLASH中对比度值

uint8_t brightness = *((unsigned char *)brightnessSetpointAddress); //读取FLASH中背光值

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

Board_init(); //初始化GPIO

SetVCore(3); //设VCore为最大

LFXT_Start(XT1DRIVE_0); //利用LFXT1(32.768kHZ)作为时钟参考 Init_FLL_Settle(25000, 762); //利用FLL将系统时钟设为最大25MHZ SFRIFG1 = 0; //清中断标志

SFRIE1 |= OFIE; //使能晶振失效中断 __enable_interrupt(); //使能全局中断

Dogs102x6_init(); //初始化LCD

Dogs102x6_backlightInit(); //背光初始化

if (contrast == 0xFF) //若当前FLASH中无对比度值,则

将对比度值设为11(默认)

contrast = 11;

if (brightness == 0xFF) //若当前FLASH中无背光值,则将背光

值设为11(默认)

brightness = 11;

Dogs102x6_setBacklight(brightness); //设置初始背光值

Dogs102x6_setContrast(contrast); //设置初始对比度值 Dogs102x6_clearScreen(); //清屏

Buttons_init(BUTTON_ALL); //初始化按键

Buttons_interruptEnable(BUTTON_ALL); //使能所有按键中断 buttonsPressed = 0;

Dogs102x6_ChineseDraw(One,6,0,0,3);

Dogs102x6_ChineseDraw(Two,6,0,2,3);

Dogs102x6_stringDraw(7, 0, " *press S1 | S2*", DOGS102x6_DRAW_NORMAL); while (!buttonsPressed) //等待按键被按下,或者超时退出等待 {

for (timeoutCounter = 0; timeoutCounter

if (buttonsPressed)

break;

__delay_cycles(1000);

}

break;

}

buttonsPressed = 0;

Dogs102x6_clearScreen();

}

///////////////////////频率测量程序////////////////////////////////// void zhouqi(void)

{

P2SEL |= 0x01; //p2.0口设置成捕获端口

TA1CTL = TASSEL_2 + MC_2 + TACLR+ID_3 ;//选择SMCLK,8分频

TA1CCTL1 = CM_1+SCS+CCIS_0+CAP+CCIE;//TA1设置成捕获模式,上升沿捕获 _EINT();

while(1)

{if(zq_flag==10)

break;

}

TA1CCTL1 &= ~CCIE;

}

///////////////////////////谐波显示的表格////////////////////////// void dis(void)

{

int aa ;

int bb ;

for(aa=0;aa

{

Dogs102x6_lineDraw(0, aa, 101, aa, DOGS102x6_DRAW_NORMAL);

}

for(bb=9;bb

{

Dogs102x6_charDrawXY(90, bb, 'v', DOGS102x6_DRAW_NORMAL);

}

Dogs102x6_stringDrawXY(1, 1, "every harmonic ", DOGS102x6_DRAW_NORMAL); Dogs102x6_lineDraw(0, 0, 0, 63, DOGS102x6_DRAW_NORMAL); Dogs102x6_lineDraw(101, 0, 101, 63, DOGS102x6_DRAW_NORMAL); Dogs102x6_lineDraw(17, 9, 17,63, DOGS102x6_DRAW_NORMAL);

}

//////////////////////////谐波数据转字符串/////////////////////////// void dischar(void)

{ char str1[10];

int disc,disc1,ch=0,ch1=0;

disbuffer=disbuffer*10;

disc=(int) disbuffer;

disc1=disc;

if(disc1>=1000)

{while(disc!=0)

{

str1[ch]=disc%10+'0';

disc=disc/10;

ch++;

}

str2[0]=str1[3];

str2[1]=str1[2];

str2[2]=str1[1];

str2[3]=46;

str2[4]=str1[0];

str2[5]='\0';

}

else if(disc1>=100)

{

while(disc!=0)

{

str1[ch]=disc%10+'0';

disc=disc/10;

ch++;

}

str2[0]=str1[2];

str2[1]=str1[1];

str2[2]=46;

str2[3]=str1[0];

str2[4]='\0';

}

else if(disc1>=10)

{

str2[2]=disc%10+'0';

str2[1]=46;

disc=disc/10;

str2[0]=disc%10+'0';

str2[3]='\0';

}

else if(disc1>=1)

{

str2[0]=48;

str2[1]=46;

str2[2]=disc%10+'0';

str2[3]='\0';

}

else if(disc1==0)

{

str2[0]=str2[2]=48;

str2[1]=46;

}

}/////////////////////////波形显示///////////////////////////// void boxin(void)

{ uint8_t bx_x, bx_y;

char str3[10],str4[10];

int results_2[64];

int bx,bx1,bx3=0,disb;

float bx2,disb1,Y[64];

for(bx=0;bx

{ results_2[bx]=results_1[bx];

Y[bx]=results_2[bx]*0.01538;//计算纵坐标

}

for(bx=0,bx_x=3;bx

{ bx2=Y[bx];

bx1=(int) bx2;

bx_y=bx1;

Dogs102x6_pixelDraw(bx_x, bx_y, DOGS102x6_DRAW_NORMAL);//描点显示 }

disb1=3125000/data;//计算频率

disb=(int)disb1;

while(disb!=0)

{

str3[bx3]=disb%10+'0';

disb=disb/10;

bx3++;

}

str4[0]=str3[1];

str4[1]=str3[0];

str4[2]='\0';

//////////////////频率显示//////////////////

Dogs102x6_stringDrawXY(52, 5, "F=", DOGS102x6_DRAW_NORMAL);

Dogs102x6_stringDrawXY(68, 5, str4, DOGS102x6_DRAW_NORMAL);

Dogs102x6_stringDrawXY(85, 5, "Hz", DOGS102x6_DRAW_NORMAL);

}

/////////////////////////////FFT运算//////////////////////////////// void fft(void)

{ int x0,x1,x2,x3,x4,x5,xx,b1,c1,L,k1,f_1;

float TR,TI;

unsigned ii,jj;

for(f_1=0;f_1

{

data_r[f_1]=results_1[f_1]*0.00088-1.42;

}

///////////////倒序///////////////////////

for(ii=0;ii

{

x0=x1=x2=x3=x4=x5=0;

x0=ii&0x01; x1=(ii/2)&0x01; x2=(ii/4)&0x01;

x3=(ii/8)&0x01;x4=(ii/16)&0x01;x5=(ii/32)&0x01;

xx=x0*32+x1*16+x2*8+x3*4+x4*2+x5;

data_i[xx]=data_r[ii];

}

for(ii=0;ii

{

data_r[ii]=data_i[ii];

data_i[ii]=0;

}

///////////////fft处理函数///////////////

for(L=1;L

{

b1=1;ii=L-1;

while(ii>0)

{b1=b1*2;ii--;}

for(jj=0;jj

{

c1=1;ii=6-L;

while(ii>0)

{c1=c1*2;ii--;}

c1=c1*jj;

for(k1=jj;k1

{

TR=data_r[k1+b1]*cos(2*PI*c1/64)-data_i[k1+b1]*sin(2*PI*c1/64); TI=data_r[k1+b1]*sin(2*PI*c1/64)+data_i[k1+b1]*cos(2*PI*c1/64); data_r[k1+b1]=data_r[k1]-TR;

data_i[k1+b1]=data_i[k1]-TI;

data_r[k1]=data_r[k1]+TR;

data_i[k1]=data_i[k1]+TI;

} }}

for(xx=0;xx

{

data_i[xx]=sqrt(data_r[xx]*data_r[xx]+data_i[xx]*data_i[xx])/32; }}

///////////////////////////////主程序//////////////////////////// void main()

{ uint8_t dd;

int ee,ff;

char cc[20];

Init_m();

while(1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

Dogs102x6_stringDraw(0, 0, "Harmonic analysis", DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(1,0,"=============",DOGS102x6_DRAW_NORMAL);

Dogs102x6_stringDraw(2, 0, " Press S1 to A/D ", DOGS102x6_DRAW_NORMAL); while (!(buttonsPressed & BUTTON_S2))

{ if(buttonsPressed & BUTTON_S1) { Dogs102x6_clearScreen(); buttonsPressed = 0; zhouqi();//频率测量 /////////////////////同步采样///////////////////////////

int aw,ad_2=0,ad_3;

float ad_4;

ad_4=data/64;

ad_3=(int) ad_4;

P6SEL |= BIT6;//p6.6口为采样端口

ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC;//开ADC12内核 ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2;//单通道多次转换

ADC12MCTL0=ADC12SREF_0+ADC12INCH_6;//选用A6通道

ADC12IE = 0x00;

ADC12CTL0 |= ADC12ENC;

TA0CTL = TASSEL_2 + MC_1 + TACLR+ID_3;//TA0增计数模式 TA0CCR0 =ad_3;

ADC12CTL0 |= ADC12SC;

TA0CCTL0 = CCIE;

_EINT();

while(1)

{

if(ad_flag==1)

{

ad_flag=0;

ad_2=1;

ADC12CTL0 &= ~ADC12ENC;

for(aw=0;aw

{

results_1[aw]=results[aw];

}}

if(ad_2==1)

break;

}

boxin();//波形显示

while (!(buttonsPressed & BUTTON_S2))

{

/////////////////////画坐标轴////////////////////////

Dogs102x6_lineDraw(0, 50, 101, 50, DOGS102x6_DRAW_NORMAL); Dogs102x6_lineDraw(3, 63, 3, 0, DOGS102x6_DRAW_NORMAL);

Dogs102x6_lineDraw(100, 49, 100, 51, DOGS102x6_DRAW_NORMAL);

Dogs102x6_lineDraw(99, 48, 99, 52, DOGS102x6_DRAW_NORMAL);

Dogs102x6_lineDraw(2, 1, 4, 1, DOGS102x6_DRAW_NORMAL);

Dogs102x6_lineDraw(1, 2, 5, 2, DOGS102x6_DRAW_NORMAL);

Dogs102x6_charDrawXY(5, 0, 'v', DOGS102x6_DRAW_NORMAL);

Dogs102x6_charDrawXY(92, 51, 't', DOGS102x6_DRAW_NORMAL);

if(buttonsPressed & BUTTON_S1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

fft();

while (!(buttonsPressed & BUTTON_S2))

{

Dogs102x6_stringDraw(0,0,"Harmonic analysis", DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(1, 0,"=================", DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(2, 0, "Fundamental wave:", DOGS102x6_DRAW_NORMAL); Dogs102x6_charDrawXY(90, 24, 'v', DOGS102x6_DRAW_NORMAL);

disbuffer=data_i[1];//基波显示

dischar();

Dogs102x6_stringDrawXY(60, 24, str2, DOGS102x6_DRAW_NORMAL);

if(buttonsPressed & BUTTON_S1)

{

Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

/////////////////////2-7次谐波显示/////////////////////////// for(dd=2,ee=10;dd

{

cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL); disbuffer=data_i[dd];

dischar();

Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL);

}

while (!(buttonsPressed & BUTTON_S2))

{ if(buttonsPressed & BUTTON_S1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

//////////////////////8-13次谐波显示////////////////////////// for(ff=dd,ee=10;dd

{ cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL);

disbuffer=data_i[dd];

dischar();

Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL);

}

while (!(buttonsPressed & BUTTON_S2))

{if(buttonsPressed & BUTTON_S1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

//////////////////////14-19次谐波显示///////////////////////////// for(ff=dd,ee=10;dd

{cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL); disbuffer=data_r[dd];

dischar();

Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL); }

while (!(buttonsPressed & BUTTON_S2))

{if(buttonsPressed & BUTTON_S1)

{ Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

////////////////////////20-25次谐波显示/////////////////////////// for(ff=dd,ee=10;dd

{ cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL); disbuffer=data_i[dd];

dischar();

Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL);

}

while (!(buttonsPressed & BUTTON_S2))

{ if(buttonsPressed & BUTTON_S1)

{Dogs102x6_clearScreen();

buttonsPressed = 0;

dis();

//////////////////////26-31次谐波显示///////////////////// for(ff=dd,ee=10;dd

{ cc[0]=dd/10+'0';

cc[1]=dd%10+'0';

cc[2]='\0';

Dogs102x6_stringDrawXY(2, ee, cc, DOGS102x6_DRAW_NORMAL); disbuffer=data_r[dd]; dischar(); Dogs102x6_stringDrawXY(50, ee, str2, DOGS102x6_DRAW_NORMAL);

}

while (!(buttonsPressed & BUTTON_S2))

{ } } }} } } } } } } } } } }}}}

///////////////////////定时器A0中断函数//////////////////////// #pragma vector=TIMER0_A0_VECTOR

__interrupt void TIMER0_A0_ISR(void)

{static unsigned int count=0;

ADC12CTL0 &= ~ADC12ENC;

results[count]=ADC12MEM0;//读采样值

count++;

if(count==64)

{ ad_flag=1;

count=0;

TA0CCTL0 &= ~CCIE;

}

ADC12CTL0 |= ADC12ENC+ADC12SC;

}

//////////////////////定时器A1中断函数////////////////////// #pragma vector=TIMER1_A1_VECTOR

__interrupt void TIMER1_A1_ISR(void)

{switch(__even_in_range(TA1IV,14))

{case 0: break;

case 2:

newdata=TA1R;//读当前捕获值

if(newdata

{ data=65536+newdata-olddata; }

else

{ data=newdata-olddata; }

olddata=newdata;

zq_flag++;

break;

case 4: break;

case 6: break;

case 8: break;

case 10: break;

case 12: break;

case 14:break;

default: break;

}

}


相关文章

  • 35kv电网单相接地故障与零序电流检测
  • 9 本科生毕业设计(论文) 题 目:35KV电网零序电流的检测及谐波分析 学生姓名: 袁 靖 系 别: 机械与电气工程系 专业年级:电气工程及其自动化2008级本科四班 指导教师: 王 铭 2012年 6 月 8 日 摘 要 小电流接地系统 ...查看


  • 传统无功功率理论及其局限性
  • 2007年第7期 东北电力技术 传统无功功率理论及其局限性 OnTraditionalReactivePowerTheoryandItsLimitation 陈晟 (深圳供电局,广东,深蜊518106) 搞耍:∞世纪舯年代,国内外许多学者提 ...查看


  • 基于simulink的变压器故障仿真
  • 图书分类号: 密 级: 毕业设计(论文) 电力变压器继电保护动作行为仿真分析系统 Simulation and Analysis System for Power Transformer Relay Protection 学生姓名 学院名称 ...查看


  • 静止无功补偿器的设计
  • 摘 要 随着我国工业化程度的加快,越来越多的大型无功设备用在工业现场,在这些机器使用的时候不仅消耗大量的无功功率,而且会产生大量的谐波污染电网.为了治理这些谐波污染,必须对系统进行无功补偿,无功补偿不仅可以稳定电压,消除谐波.而且还可以节约 ...查看


  • 非正弦电路中无功功率的定义和物理意义
  • 九江职业技术学院学报 2005.3 50 JoumalofJiujiangV()cational&TechnicalC0llege 非正弦电路中无功功率的定义和物理意义 杨 伟 (辽宁大学高等职业技术学院,辽宁沈阳 110036) ...查看


  • 电机测试中谐波分析的高精度FFT算法
  • 第21卷第12期 中国电机工程学报 V0l21N0.12Dec200l 2001年12月 Proceedin船o"heCsEE @200lChjnsoc.forEkc.E她 文章编号:0258.8013(2001)12一0083- ...查看


  • 超导储能装置中的电流源型逆变器
  • 第38卷第4期电力电子技术 Voi.38,No.4August,2004 2004年8月Power Eiectronics 超导储能装置中的电流源型逆变器 刘 逊! 褚 旭! 蒋晓华 清华大学9北京100084) 摘要! 超导储能 SMES ...查看


  • 电网谐波的产生及抑制措施分析
  • 电网谐波的产生及抑制措施分析 广东电网公司珠海金湾供电局 摘要:研究分析谐波产生的原因,为抑制电力系统的谐波干扰提供好的检测方法,对提高电网运行质量.满足用户需求有着重要的实际意义. 关键词:电网谐波.电力电子.措施 Abstract: t ...查看


  • 金蓝领维修电工论文
  • 金蓝领技师论文 变频器的工作原理.控制方式及应用 姓 名: 马娜娜 工作单位: 滨州市安全评价中心 申报工种: 维修电工 前 言:异步电动机是电力.化工等生产企业最主要的动力设备.作为高能耗设备,其输出功率不能随负荷按比例变化,大部分只能通 ...查看


热门内容