【AI x FPGA自学笔记】基于多层神经网络的双质量驱动系统速度估计的FPGA实现

本文提出了一种基于神经网络(NN)的负载机械速度估计器的实用实现,适用于具有弹性耦合(elastic coupling)的驱动系统,使用可重构FPGA。该系统的独特之处在于多层神经网络被实现于置于NI CompactRIO控制器内部的FPGA中。作为状态估计器(state estimator)的神经网络是使用Levenberg-Marquardt算法进行训练的。本文提出了一种适用于此类硬件平台的多层神经网络实现的特殊算法,重点在于最小化FPGA矩阵中使用的可编程块。实现于C-RIO的神经估计器算法代码使用LabVIEW软件进行实现。神经估计器进行了测试:离线测试(基于测量的测试数据库)和在线测试(在闭环控制结构中)。这些估计器还针对具有弹性接头的驱动系统的负载机械变化惯性矩进行测试。实验测试结果表明,使用高级编程语言在FPGA中实现的多层神经网络,确保了双质量驱动系统(two-mass drive system)的状态变量高质量估计。

双质量系统控制结构的数学模型

在本文中,考虑了具有弹性联轴器的驱动系统的常用数学模型。通常,这种驱动被分析为由两个质量通过弹性轴连接组成的系统,其中第一个质量表示驱动的惯性矩(the moment of inertia of the drive),第二个质量则指负载侧的惯性矩(the moment of inertia of the load side)。该系统由以下状态方程描述(以单位制表示),其中忽略了非线性现象,如间隙或摩擦:

w_1w_2是电动机(motor)和负载(load)速度,T_e, T_s, T_L是电磁(electromagnetic)扭矩、轴(shaft)扭矩和负载(load)扭矩[以单位制表示],\tau_1, \tau_2是电动机和负载机器的机械时间常数(mechanical time constants),\tau_c是刚度时间常数(stiffness time constant)。

图1:带有弹性联轴器以及从负载机器转速获取额外反馈的驱动系统

电驱动系统(electrical drive system)通常在经典的级联结构(cascade structure)中控制,该结构包括两个主要控制回路:

  1. 内环控制回路包含扭矩控制器(torque controller)、电源转换器(power converter)和电动机的电磁部分(electromagnetic part of the motor)。PI扭矩控制器通常根据著名的模量标准进行调整,以提供足够快速的扭矩调节,并且通常用小时间常数的一级滤波器进行近似。
  2. 外环控制回路包括驱动的机械部分(mechanical part of the drive)、速度传感器(speed sensor)和PI速度控制器(PI speed controller),通常根据对称准则(symmetry criterion)或极点配置法(pole placement method)进行调整。

这种经典结构仅对双质量系统的某些惯量比(T_2/T_1)有效。在负载机的机械时间常数低的情况下,系统的瞬态(transients)行为不合适,出现扭转扭矩和负载速度的一些振荡。为了改善驱动系统的动态性并抑制这些振荡,需要对经典级联结构进行修改。这可以通过从选定的状态变量向外部(速度)控制结构插入额外的反馈来实现,或者应用更先进的速度控制器。

本文采用以电机转速为基础反馈、负载转速为附加反馈的结构,如图1所示,可以获得较好的扭转振荡阻尼性能(torsional oscillation damping performance)。

外部速度控制回路的参数采用极点配置方法设计。因此,PI速度控制器的参数和来自负载速度的额外反馈增益如下:

其中\omega_r, \xi_r为假设的闭环系统的共振频率(resonance frequency)和阻尼系数(damping factor)。描述控制结构中若干增益的方程依赖于选择的阻尼系数\xi_r和系统的共振频率\omega_r。因此,可以设置电动驱动的动态性能。

负载侧转速神经网络估计器(NN estimator)的设计

在对双质量驱动系统的负载机械速度进行NN估计器的实现过程中,可以区分以下几个阶段:

  1. 从实际实验室驱动系统获取选定信号的测量,用于下一步的神经网络训练过程(电磁转矩、马达速度、负载速度,用于测试准备好的估计器)。NN估计器的第一个输入信号是电磁转矩(与电机电流成正比),第二个是驱动电机的角速度。两者都可以使用低成本传感器在工业驱动中简单测量。
  2. 所设计的NN估计器的结构基于对各种架构和训练方法的先前分析,使用Matlab-Simulink仿真软件
  3. 在LabVIEW软件中实现所开发的神经估计器
  4. 创建支持CompactRIO控制器的软件,考虑输入和输出之间的数据传输以及FPGA

基于测量的直流电动机(电枢电流)的电磁扭矩T_e、电动机速度w_1和负载速度w_2,在Matlab环境中进行与神经网络(NN)训练过程相关的仿真实验。神经网络的输出信号是负载机器的估计速度w_2。训练信号是根据被测驱动系统对参考速度和负载扭矩值各种变化的响应准备的。

选择了Levenberg-Marquardt算法作为训练方法。该算法中使用的神经网络权重矩阵的更新规则:\Delta \mathbf{w} = -(\mathbf{J}^T \mathbf{J} + \gamma \mathbf{I})^{-1} \mathbf{J}^T \mathbf{e}\mathbf{J}是成本函数相对于权重值的导数矩阵(Jacobian matrix),\mathbf{e}是训练数据的目标输出与网络输出之间的差异,\mathbf{I}是单位矩阵,\gamma是学习因子。

使用CompactRIO的神经网络估计器的FPGA实现

在LabVIEW环境中实现神经元的非线性激活函数

在LabVIEW中实现神经网络的基本问题是每个神经元的非线性激活函数(Nonlinear Activation Function)的实现(在我们的案例中是双曲正切函数)。为此,最常用的解决方案是使用查找表(LUT)在labVIEW应用额外的固定点数学库(Fixed Point Math Library)(例如CORDIC — COordinate Rotation DIgital Computer,坐标旋转数字计算机),在某些情况下引入了LUT元素之间的额外插值,文献中还描述了双曲正切的二阶近似(the second-order approximation of the hyperbolic tangent)或Elliott函数。

图2:神经元双曲正切激活函数的LUT

在我们的案例中,每个神经元的非线性激活函数是使用查找表(LUT)元素实现的。需要指出的是,LUT块不支持定点(fixed point(FXP))变量,因此它们必须被转换为16位无符号整数(如图2所示)。因此,数据必须被校准到适当的水平,以便正确计算输入值。输出数据再次被转换为定点类型,并使用这种表示进行其他计算。采用这种解决方案是因为权重系数可以直接从其他软件(例如,Matlab)导入到FPGA中实现的神经网络结构中。

LabVIEW FPGA代码实现

代码时序和FPGA存储优化有几种方法。单周期定时循环(Single Cycle Timed Loop(SCTL))是一个有用的工具,可以优化程序。在这个循环中实现程序的一部分可以消除在标准的While循环中使用的不必要元素,因此代码在FPGA中占用更少的空间,并且执行所需的时间更短。SCTL循环应用的另一个优点是可以在代码的不同部分增加或减少计算速度。

应用流水线技术(pipeline technique是提高算法效率的下一基本方法。该方法允许将算法分解为更小的部分,这些部分可以并行实现。这导致每次迭代中执行的代码缩短,因此整体应用实现所需的时间减少了。在NN估计器的实现过程中使用了这两种技术,即SCTL和流水线(例如,优化与大量乘法和加法权重系数及层输入值相关的代码部分,测量输入状态变量)。

该块图用于FPGA实现两个隐藏层神经网络的算法:

该算法由两个部分组成:主程序和子程序。

  1. NN结构(输入层、两个隐藏层和一个输出层的连接和节点)以及所有突触系数的值实现于程序的主要部分。
  2. 各层中每个神经元的计算在一个特殊的子程序中实现,该子程序被称为不可重入的子VI(nonreentrant subVI,即在程序调用多个相同的子VI时,无论该子VI的执行顺序如何,都是一次只能执行一个,执行完一个后再执行下一个)。这种解决方案意味着子程序在FPGA的空间中只插入一次,从而使程序经济地使用逻辑元件。该子程序用于对层的输入值和突触系数进行乘法运算,然后对结果进行加法并将其引入神经元的激活函数(查找表)。

在每一层的数据处理中,主程序会调用子程序(就像在中断期间),在同一时间并行计算来自所有神经元(在这一层)的输出值。一次调用子程序的最大节点数为6,但可以通过将权重值设置为零来减少这个数量。这样的算法可以保持神经网络中数据流的特定属性;网络层之间的计算是串行进行的,但在各个层中则进行并行处理。在开发的FPGA算法中,NN结构的更改是非常简单的,因为可以通过将适当的突触连接设置为零值来删除它们。

基于FPGA的神经估计器的控制结构的硬件实现

需要提到的是,为了进行数据采集和处理,C-RIO 控制器的程序是在两个层次上实现的:与 FPGA 相关的部分和与实时控制器(real-time controller)相关的部分。在可编程矩阵的层面上,直接与输入和输出端口进行通信,然而,控制器的主机部分负责分析信号的展示和数据的记录。两个控制器部分的同步保证了数据传输的效率和速度,通过直接内存访问 (DMA) 实现。这种技术使 C-RIO 组件之间的数据传输得以优化,同时在代码部分之间,利用 RAM 内存和先进先出 (FIFO) 队列。

图4:基于FPGA的神经速度估计器与基于DSP的弹性耦合直流电动机驱动控制系统相连接

在本文描述的项目中,来自真实驱动系统的测量数据(NN输入信号)被放置在C-RIO控制器的ROM内存中,然后引入到FPGA中实现的神经网络(NN)。为了并行实现神经网络,根据在NI LabVIEW FPGA模块中实现的算法,使用了可重入和不可重入的G代码部分执行方式。该工具允许充分利用FPGA的特性用于所开发的算法;因此,我们可以选择算法某些部分的合适执行顺序(在一个层中的并行计算,但在神经网络层之间的串行计算)。

所描述的解决方案对于实现多层神经网络是足够的,但当输入数据是在线测量时,任务就变得更加复杂,开发的神经网络结构需要在驱动控制系统中实时运行。在这种情况下,必须实施两个额外的循环:第一个是用于编码器支持(encoder support),第二个是用于电流测量(current measurements)。因此,在所描述的解决方案中,有三个子程序同时工作——并行,如图4所示:神经网络模块(NN module)、编码器接口模块(encoder interface module)和电流数据采集模块(current data acquisition module)。需要注意的是,这三个子程序的计算时间是不同的。它们之间的数据传输同步对于估算器输出的正确计算非常重要。在LabVIEW FPGA中有一些同步工具。更重要的有事件(occurrences)、中断(interrupts)和按顺序执行的循环(loops executed sequentially)。使用这些工具时,可以在其他代码执行时阻塞某些部分,或者设置循环之间数据传输的顺序。

实验结果显示,神经估计器在负载速度上的应用,已被引入闭环控制结构。为了进行这些测试,需要算法的一个额外部分,该部分与输入信号的测量以及将结果从FPGA传输到dSPACE(见图4)相关。由LEM传感器测量的电机电流信号被引入C-RIO控制器的模块NI9215的输入模拟通道(16位测量分辨率)。

通过NI9505模块引入编码器的几个信号(用于测量被驱动电机的转速),并在FPGA中计算电机转速w_1的值。神经网络计算的结果,经过缩放后,通过带有输出模拟通道(NI9263)的C-RIO模块发送到控制系统。获得的FPGA(所有测试)的最大时钟频率为~ 40 MHz。整个应用程序需要96%的SLICEs来自硬件资源。

NI9215

  • 功能:模拟输入模块,用于NI CompactDAQ及CompactRIO系统,可将模拟信号转换为数字信号。
  • 特点:包含4个同步采样模拟输入通道、逐次逼近寄存器(SAR)以及多个16位模数转换器(ADC),输入范围为±10.0V,精度高,适用于高精度信号采集。

NI9505

  • 功能:运动控制模块,主要用于与LabVIEW FPGA模块配合,实现电机驱动或执行器放大器的功能。
  • 特点:提供全H桥伺服电机驱动,内置编码器接口和电流传感器,支持单端或差分输入的编码器信号,可直接连接到执行器,如直流伺服电机、继电器等,能够实现位置、速度和电流控制。

NI9263

  • 功能:同步更新模拟输出模块,用于将数字信号转换为模拟信号。
  • 特点:具有过压保护、短路保护、低串扰、快速转换速率、高相对精度和可溯源至NIST的校准,适用于需要高精度模拟输出的应用场景。

参考文献:

FPGA Implementation of the Multilayer Neural Network for the Speed Estimation of the Two-Mass Drive System (2011)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值