Back to Blog

基于DSP+ARM+FPGA的电能质量分析仪的软件设计

#arm开发#fpga开发#人工智能

软件设计是电能质量设备的核心内容,上述章节详细介绍了电能质量参数的算法,并且通过仿真实验进行了验证,本章将结合现代电能质量监测设备需求实现算法在实际电网中应用。根据设计的电能质量分析仪的需求分析,进行总体的软件设计,主要包括整体构架、各部分的软件功能实现、三核之间的通讯设计,最终实现电能参数的高精度测量,并将其结果进行显示和存储。

本文主要通过设计软件,将理论算法进行实际应用,从应用角度出发,合理安排算法,增强前面章节介绍的算法的应用性。

5.2 软件总体设计

5.2.1 仪器实现功能

根据电能质量分析仪的软件需求,大概可将此设备的功能分为如下模块:

(1)电能质量参数的测量功能将电能质量基本参数,主要包括电压、电流、频率、谐波、间谐波、骤升骤降、浪涌电流等,按照国标中 A 级仪器的标准进行实现,详细设计每一环节,尽量较少误差,提高运算速度,保证设备的高精度,实现在线监测功能。

仪器的精度部分主要涉及数据采集、数据传递、数据的计算、数据显示。数据采集部分主要由硬件电路决定,尽量减少器件对电网采集信号的影响;数据传递主要与三核之间通讯相关,保证通讯的正常工作、数据的正确传输;数据的计算主要由算法决定,本文采用的算法都是符合精度要求并通过仿真实验的算法;数据显示主要涉及显示位数等问题,严格把握这些环节是实现电能质量参数高精度的重要保障。

(2)人机交互功能本文采用按键与 LCD 组合的方式实现人机交换环节,用户通过按键选择合适的功能,LCD 进行相应的界面显示,更好的呈现算法的处理数据。

(3)事件监测功能完整的设备应包含暂态和稳态事件的检测,通过观察事件的发生判断点电网的运行情况,以及发生的情况,从而可采取相应的方法避免事故非发生。

5.2.2 系统总体框图

根据以上软件设计的需要功能,本文采用基于 FPGA+DSP+ARM 构架实现三相电能质量分析仪。系统整体框图如下:

如图 5-1 所示的系统总体框图,电网信号首先通过信号调理电路,将电网信号进行转换为 AD 的可接受范围的电信号,并尽量减少电路对原信号幅值和相位的影响,然后经过两路 AD 数据采样,传递给 FPGA 进行数据的预处理,其中采样信号一路低频采样传递给 FPGA 进行基波周期检测,一路高频采样传递给 FPGA

结合基波周期进行数据打包,然后通过 DSP 外部接口 upp 将数据包传递给 DSP 进行处理。

其中,图 5-1 中 DSP+ARM 的芯片选用的是 TI 公司的 OMAPL138,该芯片将

DSPC6748 与 ARM926EJ-S 集中于一个芯片上,比分开使用两个芯片的功耗低,两芯片中 DSP 采用 BIOS 系统、C 语言编程进行开发,主要处理电能质量各个参数的计算、FPGA 的通讯、ARM 的通讯。ARM 芯片采用 Linux 操作系统,QT 编写界面显示,主要进行电能参数的界面操作、FPGA 通讯、DSP 通讯、各接口的驱动管理、应用程序管理等。DSP 与 ARM 之间的通讯通过 TI 公司提供的 DSPLINK

软件编程实现。该芯片的 DSP 与 ARM 的主频为 300MHz,但本芯片可以将两芯片的主频最高提升为 456MHz ,可根据需要进行设定。OMAPL138 的外设资源丰富,DSP 与 ARM 两核公用该芯片的外设资源,主要包括 DDR2、SPI、FLASH、

USBHost/OTG、MMC/SD、I2C、以太网 EMAC 等,但在使用这些外设资源中要特别注意此芯片由于引脚个数有限,不同的外设可能会同时使用同一引脚,要注意引脚复用,防止 DSP 与 ARM 的使用资源发生冲突[29-32]。由于此芯片与本文设计所相关的接口功能一致,故可直接加以利用,减少了电能质量分析仪的开发周期,降低了成本。

5.3 OMAPL138 软件结构设计

大部分电能参数的算法基于 OMAPL138 实现的,其中主要包括谐波间谐波算法。OMAPL138 的软件部分主要包括两部分,第一部分由 DSP 端进行参数计算,主要涉及基本配置、任务调度、程序的优化等内容;第二部分由 ARM 端进行计算结果的显示,更加简洁、方便观察运算数据的精度。

DSP 的嵌入式开发首先需要对编译环境的正确配置,方便后期工程管理和程序调试。由于涉及到电能参数的计算较多,会有多个文件,最终需生成可执行程序,移植到开发板上运行。DSP 端主要包括裸机程序测试、编译环境配置、主程序设计及实现。

5.3.1 基本配置

在对开发板进行程序开发时,首先应该保证基本资源的可用性。由于

OMAPL138 上的 DSP 与 ARM 是公用外设资源,故可利用 DSP 的裸机程序进行测试芯片的外设功能是否正常,检测硬件设计是否存在问题。本文通过连接仿真器,将测试程序生成的.out 文件烧写到开发板中,对 DDR2、Flash、串口、网口等外设进行功能测试。

本文的 DSP 采用的 DSP/BIOS 操作系统,DSP/BIOS 是一个可扩充的实时操作系统,其实质是一组系统模块的 API 函数,可供用户编写程序时进行调用,节省开发时间以及程序的执行时间。DSP/BIOS 提供了一个可视化的环境来定义目标系统的全局类属性:系统内存映射、中断向量表、片上定时器编程、内存的动态分配和释放。软件开发平台使用 CCS3.3 进行编程实现。需要加载 GEL 文件,此文件主要配置芯片上电时的各个引脚的基本配置,可根据需要进行修改。在 CCS 中建立带有DSP/BIOS新项目,修改DSP/BIOS的配置文件,主要包括全局变量(GBL)、存储器管理(MEM)、系统服务管理(SYS)、硬件中断管理(HWI)、软件中断管理(SWI)、任务管理(TSK)、信号量(SEM)、邮箱(MBX)、时间记录(LOG)、时钟管理(CLK)等。各个模块都提供了相应的 API 函数,可快速调用方便编程实现。

主要介绍时序线程类木块的配置,包括硬中断、软中断、任务,其结构安排如图 5-2 所示。

图 5-2 中当 FPGA 将每相采样点数达到 256 点即半周期时,将数据进行打包通过 upp 发送数据包至 DSP,引起一次 DSP 的硬中断,其中 upp 的数据包格式如表

5-1 所示,但由于 upp 的配置传输要求,每个数据为 16 位,每次传输的字节为

(256*8+64)*2=2112;每一次的硬中断随即触发一个软中断,软中断进行一些简单的数据处理,通过信号量触发各个任务,保证各任务之间的时序关系。

5.3.2 程序优先级实现

DSP 端的系统程序框图如图 5-3 所示:

DSP 端从 main 函数开始执行,首先进行模块上电,DSP 端的主函数进行寄存器配置,主要进行 EMIFA 配置、upp 配置,主要对寄存器的配置完成相应的功能实现,其中 upp 功能实现 FPGA 与 DSP 的数据传输以及引起 DSP 硬中断,是 DSP

端程序运行的时间基准;DSP 端的内存进行详细分配,主要完成 cache、RAM 的功能配置,加快程序的读取、执行速度;然后进行中断配置,主要完成中断使能;由于本文采用全局数组来存储主要数据,方便各个任务进行调用,对这些数组进行初始化,方便后续使用;然后对 DSPLINK 进行初始化,以便 DSP 与 ARM 进行握手通讯;对各个任务进行初始化。然后由 DSP/BIOS 来接管任务调度。

DSP/BIOS 有 4 类线程调度,优先级由高到低分别为硬中断(HWI)、软中断

(SWI)、任务(TSK)、后台线程(IDL)。其中硬中断运行时间很短,主要进行紧急处理,如果不能处理完,可触发软中断或者任务进行后续处理;软中断运行时间介于硬中断与任务之间,但不可阻塞;任务可阻塞,灵活性强,任务之间主要通过信号量、邮箱、队列等进行通信;后台线程是在 CPU 空闲时循环运行。线程之间可以抢占,硬中断和软中断都使用系统堆栈,每一任务使用自己的堆栈。

对电能参数根据需要的数据周期数进行分类,可分成三类,分别为半周期计算参数、一周期计算参数、10 周期计算参数,由于计算可能被抢占而发生阻塞情况,因此参数计算选择任务对象,因此分别设置为 10ms 任务、20ms 任务、200ms

任务。其中骤升骤降、浪涌电流需要半波有效值进行每半周期的判断,将其放在

10ms 任务中;20ms 任务计算三相电压电流的有效值、最大值、最小值、波峰因数;

200ms 任务计算三相电压电流谐波、间谐波幅值、相位;谐波间谐波子组计算;谐波畸变;三相不平衡参数计算;各个功率的计算等。

由于周期长的任务需要等待时间短的周期的数据积累,时间短的任务是周期长任务的资源,因此周期短任务应该优先级比周期长任务高,可保证数据能够及时处理,高优先级任务抢占低优先级任务进行运行,被抢占的任务也可以在高优先级任务运行完之后,得到资源随后运行,任务之间通过信号量进行通讯,唤醒任务。由于数据传输任务是 ARM 端进行实时显示的数据来源,因此必须保证数据在 ARM 端需要的时候以最快的速度进行传递,而不被其他任务抢占,因此将数据传输任务优先级高于其他任务。

5.3.3 程序实现优化

DSP 是根据时间片运行各个任务的,每个任务都有时间周期的限制,需要在规定周期内完成运算,同时不能影响其他任务时间执行,10 周期是最长的运行周期,需各个任务在此期间都运行完成,才是完整的一次参数运算。因此,每个任务运行时间最好比限制周期时间短为最佳,运算速度是 DSP 必须要保证。本文针对这个前提对 DSP 程序设计进行了优化。

Upp 软中断中将数据进行数模转换过程中,有大量的除法运算,由于 DSP 一次除法需几个周期,但可以一个周期完成一次乘法和加法,因此将此运算进行查表计算,避免除法,加快了运算速度。其他程序设计处有类似除法运算也进行查表、移位、乘法进行优化,充分利用 DSP 的运行优势加快程序执行。

200ms 任务主要完成谐波间谐波计算,由于需要计算 A、B、C 电压、电流 10

周期点数计算,计算量较大,为保证任务能够在 10 周期之内,对此任务进行了如下几个方面的优化:

(1)旋转因子只计算一次,在 200ms 任务建立初期,计算出旋转因子并保存在数组内,常驻与内存中,200ms 任务执行时直接调用即可,避免每次执行此任务时进行重复计算。

(2)DSP 硬件中有关于 FFT 实现,API 有相关调用,利用这一点将谐波间谐波算法设计中分离出可以应用 FFT 的运算,利用 DSP 本身优势加快运算速度。

(3)但由于算法中涉及到类 DFT 运算,若果计算三相电压电流的所有点数,计算时间对于主频为 300M 的 DSP 不够,而且对于基波频率为 50Hz 的输入,计算频域为 0~12.8kHz,步长为 5Hz。而国标中以 5Hz 为间隔计算 0~2.5kHz 的频率点,以 10Hz 为间隔计算 2.5k~9kHz 的频率点,针对国标中要求对算法进行择点计算优化,节省了计算量,进行有效计算优化。

ARM 端界面的刷新时间一般为 200ms 或者 400ms 一次,最大传输数据量为

512*6*4=12288 个字节。OMAPL138 主要有两类内存,片内 RAM 和 DDR,片内

RAM 的读写速度比 DDR 速度快的多,因此 DSP 与 ARM 之间的通讯 DSPLINK

选择芯片片内 0x8000000~0x8001FFFF 的 128k 的共享 RAM,内部空间大小足够传递数据,故可以加快数据传输任务。

经过 CCS 编程测试各个任务的运行时间,通过设置断点测试优化时间。

执行一次 10ms 任务时间:有事件发生时 0.01598ms;执行一次 20ms 任务时间:约 1.5008ms;执行一次 200ms 任务时间:包含抢占,本函数头尾之间执行时间约 92.22519ms。

由程序仿真检测时间可知,即使任务被抢占,每个任务也可在限制时间内完成,并且剩余时间充裕,为功能扩展提供了充裕的时间。

5.3.4 测量数据显示

DSP 将运算电能参数通过 DSPLINK 传递给 ARM 进行数据显示,方便查看测量数据。ARM 端采用 Linux 操作系统,界面使用 QT 进行编程实现。本节主要研究界面对电能参数测量结果的显示实现,以及为实现完成的驱动的设计,从而更好的呈现出结果,方便后续试验进行数据测试。

5.3.4.1 界面设计

本文使用 QT 进行界面编程实现,QT 是基于 C++语言的高程度的模块化、可重用性较高、良好的封装性。QT 支持跨平台编程实现,可移植性好。嵌入式系统中常使用 QT/Embeded 版本,可根据实际需求进行库的裁剪,实用性高,灵活性好。

首先进行 QT 库的编译,使用的版本为 4.6.3,编译 PC 版本,可进行虚拟机编程调试,使用交叉编译工具编译 ARM 版本,此版本应尽量精简,进行编程移植使用。

在 QT 界面设计中,主要工作是通过 DSPLINK 子类中获取 DSP 计算的电能参数,然后进行数据分析、整理,将数据按照图 5-4 分类进行显示,可将数据按照需求进行存储。

本文设计界面将菜单选项置于右侧,左侧显示相应的界面,通过主菜单选定相应子界面选项,显示对应子界面的子菜单,通过子菜单的选项确定要显示的界面。如图 5-4 所示,子界面主要有 8 项:波形显示、有效值|相位、谐波分析、波动、功率、不平衡、告警、系统管理。波形显示实时显示电网三相电压电流 2 个周期的波形、有效值、频率信息;有效值|相位显示三相电压电流的有效值、相位角图;谐波分析包括谐波电压电流的柱状图、表格,间谐波表格等,主要显示含有率、幅值、相位、畸变、功率等参数信息;波动显示趋势图,可通过观察一段时间内的波动的整体趋势;功率界面包含有功功率、无功功率、功率因数、线损等参数;不平衡界面包含趋势图和表格,趋势图可观察一段时间内的不平衡的走向;告警显示稳态参数、暂态参数的事件显示,不同事件包含的参数不同,可根据事件的记录判断电网的运行情况,并根据事件的发生频率采取相应的措施;系统管理主要是参数配置,用户可根据需要对参数进行配置,主要参数包括标称电压、标称电流、电压暂升暂降阈值等,这些值的修改、各种参数的切换都是通过上下左右按键进行数值修改或者选定。QT 界面设计中,每个子界面都定义为一个类,根据每个界面具有的特色完成类的编程实现,其中比较重要的为波形显示、柱状图显示、表格显示。而且不同的界面刷新频率不同,过于频繁的刷新会造成

CPU 运行过高,增加系统负荷,影响系统的响应速度,故需根据不同的界面设置不同的刷新周期。

本文的 QT 界面框图如下图所示:

界面设计中最关键的界面切换,此功能依赖于按键功能的实现,本文设计的仪器按键主要通过上、下、左、右、确认、取消来完成,通过按键功能的设置实现不同子界面类之间的切换,其中可使用 QT 中信号槽机制,一个事件可以触发另一个或多个事件,这种机制便于编程实现。

5.3.4.2 驱动程序设计

一般嵌入式驱动程序开发需要对外围设备进行如下内容:

(1)评审现有的驱动程序,测试并实验它是否可以如期工作;

(2)寻找一个相近的驱动程序,将其进行修改成与使用硬件相适应;

(3)重新编写驱动程序。

本文主要涉及到 SD 卡、USB、RTC、LCD、按键驱动,其中三相电能质量分析的设计电路与购买的开发板的外围设备布线方式类似,其中嵌入式 Linux 中的

SD 卡、USB、RTC 驱动经过测试可以正常工作。本文采用的 LCD 选择尺寸较大,但接线方式与购买开发板中的 LCD 一样,驱动的配置一致,但屏幕的相关参数不同,可根据内核的 LCD 驱动找到对应的参数变量进行修改,但由于屏幕尺寸较大,对于芯片 OMAPL138 传输数据量大,会出现屏幕显示不正常,需要修改 LCD 优先级为最高,确保 LCDC 的吞吐量/延迟需求得到满足。

按键驱动没有类似的驱动实现,需重新编写,按键驱动主要用于 FPGA 与 ARM

间的通讯。按键驱动实现有两种方式,第一种是通过中断的方式实现,第二种是通过模拟标准键盘的方式实现。由于 OMAPL138 的 GPIO 中断资源有限,本文采用第二种方法通过 I2C 实现。实现方式如下图所示:

用户通过按键产生一次中断,FPGA 接受到中断信息,产生对应的键值,按键赋值从 0 或者 1 开始,然后通过 I2C 总线发送给 ARM,ARM 中的 Linux 系统接收到键值之后,将键值与标准键盘值进行对应,键值为数组编号,标准键盘值为数组值。然后 Linux 系统将标准按键值进行事件上报,操作系统根据事件进行事件分发,QT 应用程序接收到按键事件后,执行相应的按键处理。

5.4 测频程序实现

数据预处理木块主要由 AD 采样模块与 FPGA 实现,两路 AD 采样信号,一路低频采样将电网信号传递给 FPGA 进行基波频率的测量,保证基波频率的快速计算与高精度要求,为另一路使用定频采样信号提供可靠的间隔抽取,其中采样频率为 10M,保证实现同步的高精度,然后由 FPGA 将抽取得到的数据进行打包,以半周期数据为一个数据包,通过 OMAPL138 的外部接口 upp,以硬中断的方式与 DSP 通讯,将数据发送给 DSP 进行数据处理,整个数据采集与数据预处理模块为电能质量的参数高精度计算提供基础。

由第三章与第四章的算法分析可知,为保证电能质量分析仪的精度要求,此模块中的 AD 芯片选用 16 位的进行采样,其中进行测频流程图如下:

由基波频率测量程序流程图可知根据国标标准,测频范围为[42.5,57.5]Hz,测频精度为 0.001Hz,然后根据频率范围设置黄金分割法的初始搜索值。对 AD 采样数据首先进行加 Blackman 窗。然后黄金分割法进行精度判定,若不满足则进行

FFT+FT 运算,通过比较函数值,对黄金分割法的搜索点重新赋值,反复执行这个过程,直到精度满足要求,计算出基波频率。

5.5 谐波间谐波程序实现

通过本章节的软件设计以及 OMAPL138 软件结构设计,对 DSP 中实现参数运算进行了谐波间谐波时间优化,图 5-7 流程图实现谐波间谐波程序实现,与第四章的算法设计一致。在 DSP 主函数中首先对旋转因子进行计算并存储,后面 200ms

任务被触发后,可直接读取内存,加快程序执行速度。DSP 端接收数据进行次数积累为 10 周期后,唤醒 200ms 任务,主要执行谐波间谐波程序计算。首先将 5120

点分成 5 组 1024 点,然后每一组进行基 2 的 FFT 运算,将运算结果进行实部、虚部存储,然后根据国标中计算频率范围,进行选点进行 DFT 计算,进一步加快运算速度,然后可计算谐波间谐波幅值、相位,根据此算法计算的数据,进行谐波、间谐波其他参数的运算,例如总谐波畸变、谐波子组等计算。

5.6 核通讯设计

本文采用 FPGA+DSP+ARM 三核构架,三个核之间通讯关系到数据传输是否正确,FPGA 与 DSP 通讯使用的 UPP(universal parallel port),DSP 与 ARM 通讯使用 TI 提供的软件 DSPLINK 实现,FPGA 与 ARM 使用上节中 I2C 驱动实现的。

UPP 以 16 位数据宽度进行数据传输,本文采用 DSP 接收数据的模式,示意图如下所示:

如上图所示,FPGA 每 10ms 触发一次 upp 中断,进行一次数据包传输,数据通过 I/O 通道 A 的然后存储在 upp 内部的 DMA 中,增加吞吐量,减轻 CPU 负担,然后当 DMA 存储全部数据后,触发行中断,将数据写入内存中,然后进行数据解包、处理。

DSPLINK 对于 GPP 端相当于驱动 DSP 的驱动程序,其对 GPP 端、ARM 端提供完整的 API 函数调用,是对底层 DSP 与 ARM 通讯的封装,简化了对双核 CPU

的通讯开发,降低了难度。最主要的工作需在虚拟机上对 DSPLINK 进行参数配置,需要修改对应的配置文件,通过 GPP 端对 DSPLINK 源码编译。主要对 DSP 与 ARM

(GPP)内存分配。开发板的 DDR 大小为 128M,可在 uboot 中设置 ARM 的内存大小参数传递给内核。其中 DDR 的起始地址 0xc0000000,内存分配如下:

ARM 端:

0xc000 0000~0xc2ff ffff 48M

0xc400 0000~0xc7ff ffff 64M

DSP 端:

0xc300 0000~0xc3ff ffff 16M