TMS320F280049C 学习笔记22 SFRA part 2 模块摘要

2023-11-21 00:20

本文主要是介绍TMS320F280049C 学习笔记22 SFRA part 2 模块摘要,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • SFRA库函数摘要
  • 工作原理
  • 标幺值形式
  • 浮点数(单精度)
    • 1. 对象定义
    • 2. 模块接口定义
    • 3. 将SFRA库添加到项目中
    • 4. 添加对SFRA GUI的支持
  • 频率响应输入及补偿设计脚本
  • SFRA GUI选项和如何运行

对应原文的第三章

SFRA库函数摘要

SFRA库由一些模块组成,这些模块允许用户在变换器中运行SFRA。表2列出了SFRA库中存在的模块以及SFRA库的每个指令集变量的执行周期数。
在这里插入图片描述
上表中数字是SFRA库函数使用的存储空间,用于存储频率响应数据的内存不包括在内,因为这是由用户指定的,并且取决于用户希望运行SFRA的频率点的数量。(下面这句不会翻译……)当正在进行扫描并处于最恶劣的情况时,将报告注入和采集的数目。如果没有进行扫描,程序将消耗明显较少的周期。
注意:

  • SFRA库是不可重复载入的(在一个特定的项目中仅支持一个SFRA库实例)。
  • 除非另有说明,否则报告的循环是针对运行中的最大/最坏情况路径。报告的周期包括指向例程的分支和返回到分支之后的下一条指令。在分支之前在堆栈上传递参数所用的周期不在此数字中计算,因为它可能因程序中的相邻代码而异。
  • 对于浮点库,不包括执行三角运算的RTS库调用的内存。
  • TMU提供额外的加速,提高了后台循环的性能。

工作原理

SFRA基于小信号正弦注入原理。如图3所示,在控制器的参考值上注入一个小信号,并计算反馈和控制器输出的频率响应,这提供了闭环系统的主回路频率响应和开环频率响应信息。
在这里插入图片描述

标幺值形式

SFRA库支持单精度浮点运算,标幺值通常用于控制程序中的变量,并由库使用。标幺值是通过将当前读数除以可以读取的最大值来获得的。例如,如果电压检测最大值为20 V,瞬时读数为5V,则标幺值为5/20=0.25。

浮点数(单精度)

以下说明适用于单精度浮点版本的SFRA库。这个库可以运行在任何具有单精度浮点单元的c2000 MCU上。下面的说明也适用于TMU版本的库,唯一的区别是TMU在SFRA运行中提供循环加速和更高的精度。

1. 对象定义

SFRA库定义了基于浮点的SFRA结构体,如下所述:

typedef struct{
float32_t *h_magVect; //!< 主回路幅值向量 Plant Mag SFRA Vector
float32_t *h_phaseVect; //!< 主回路相角向量 Plant Phase SFRA Vector
float32_t *gh_magVect; //!< 开环幅值向量 Open Loop Mag SFRA Vector
float32_t *gh_phaseVect; //!< 开环相角向量 Open Loop Phase SFRA Vector
float32_t *cl_magVect; //!< 闭环幅值向量 Closed Loop Mag SFRA Vector
float32_t *cl_phaseVect; //!< 闭环相角向量 Closed Loop Phase SFRA Vector
float32_t *freqVect; //!< 频率向量 Frequency Vector
float32_t amplitude; //!< 注入幅值 Injection Amplitude
float32_t isrFreq; //!< SFRA中断频率 SFRA ISR frequency
float32_t freqStart; //!< SFRA扫频起始频率 Start frequency of SFRA sweep
float32_t freqStep; //!< 频点对数间距(可选) Log space between frequency points (optional)
int16_t start; //!< SFRA启动指令 Command to start SFRA
int16_t state; //!< SFRA状态 State of SFRA
int16_t status; //!< SFRA当前状态 Status of SFRA
int16_t vecLength; //!< SFRA中的点数 No. of Points in the SFRA
int16_t freqIndex; //!< 频率向量索引 Index of the frequency vector
int16_t storeH; //!< H向量是否存储的标志位 Flag to indicate if H vector is stored
int16_t storeGH; //!< GH向量是否存储的标志位 Flag to indicate if GH vector is stored
int16_t storeCL; //!< CL向量是否存储的标志位 Flag to indicate if CL vector is stored
int16_t speed; //!< 扫频的速度 variable to change the speed of the sweep
}SFRA_F32;

2. 模块接口定义

在这里插入图片描述在这里插入图片描述

3. 将SFRA库添加到项目中

  1. 在要运行SFRA的项目的源代码中包括SFRA库。
#include “sfra_f32.h”

在项目属性下的包含路径中添加SFRA库 Project Properties → Build → C2000 Compiler →
Include Options.
在这里插入图片描述

  • 确切的位置可能因安装SFRA的位置和项目使用的其他库而异。
  • 必须包含FastRTS库。有关详细信息,请参阅FastRTS库文档,位于:<sdk_install_path>\C2000Ware\libraries\math\FPUfastRTS\c28

链接SFRA库:
在这里插入图片描述

  1. 添加SFRA的宏定义。SFRA_ISR_FREQ是SFRA中断服务程序的频率,SFRA_FREQ_START是SFRA分析的起始频率,SFRA_FREQ_LENGTH是SFRA分析的点数(长度),SFRA_FREQ_STEP_MULTIPLY是扫频的步长,SFRA分析的结束频率取决于起始频率,长度和步长。
#define SFRA_ISR_FREQ CONTROL_ISR_FREQUENCY
#define SFRA_FREQ_START 2
//
// SFRA step Multiply = 10^(1/No of steps per decade(40))
//
#define SFRA_FREQ_STEP_MULTIPLY (float32_t)1.105
#define SFRA_AMPLITUDE (float32_t)0.005
#define SFRA_FREQ_LENGTH 100
  1. 为SFRA数据存储定义SFRA_F32对象和数组。对于非TMU版本的库,为FPUsinTable添加一个extern来消除编译器警告。
SFRA_F32 sfra1;
float32_t plantMagVect[SFRA_FREQ_LENGTH];
float32_t plantPhaseVect[SFRA_FREQ_LENGTH];
float32_t olMagVect[SFRA_FREQ_LENGTH];
float32_t olPhaseVect[SFRA_FREQ_LENGTH];
float32_t clMagVect[SFRA_FREQ_LENGTH];
float32_t clPhaseVect[SFRA_FREQ_LENGTH];
float32_t freqVect[SFRA_FREQ_LENGTH];
//
//extern to access tables in ROM
//
extern long FPUsinTable[];
  1. SFRA模块的测试通过以下程序执行。这段程序需要在调用SFRA的ISR之前运行,为未存储的数组/向量传递NULL。
//
//Resets the internal data of sfra module to zero
//
SFRA_F32_reset(&sfra1);
//
//Configures the SFRA module
//
SFRA_F32_config(&sfra1,
SFRA_ISR_FREQ,
SFRA_AMPLITUDE,
SFRA_FREQ_LENGTH,
SFRA_FREQ_START,
SFRA_FREQ_STEP_MULTIPLY,
plantMagVect,
plantPhaseVect,
olMagVect,
olPhaseVect,
clMagVect,
clPhaseVect
freqVect);
//
//Resets the response arrays to all zeroes
//
SFRA_F32_resetFreqRespArray(&sfra1);//
// Initializes the frequency response array ,
// The first element is SFRA_FREQ_START
// The subsequent elements are freqVect[n-1]*SFRA_FREQ_STEP_MULTIPLY
// This enables placing a fixed number of frequency points
// between a decade of frequency.
// The below routine can be substituted by a routine that sets
// the frequency points arbitrarily as needed.
//
SFRA_F32_initFreqArrayWithLogSteps(&sfra1,
SFRA_FREQ_START,
SFRA_FREQ_STEP_MULTIPLY);

尽管在上面的代码中,数组是用对数阶跃频率初始化的,但是SFRA与此无关。频率阵列初始化代码可以根据应用程序的需要替换为任何其他代码。

  1. 使用模块,在补偿器输入和输出附近将代码添加到ISR以调用SFRA,如下所示:
    a、 在闭环系统中使用SFRA来获得环路增益(GH)和主回路(H)频率响应:
interrupt void PWM_ISR(void)
{.
//
// Read ADC and computer Fbk Value
//
Fdbk = (float32)Vout1R/(4096.0);
//
// Add FRA injection into the reference of the controller
//
Ref = SFRA_F32_inject(Vout1SetSlewed);
//
// Call the controller
//
Out=DCL_PI_C1(&dcl_obj,Ref,Fdbk);
//
// Update PWM value
//
EPwm1Regs.CMPA.half.CMPA = ((long)(BUCK_PWM_PERIOD))*Out;
SFRA_F32_collect(&Out,&Fdbk);}

b、 在开环系统中使用SFRA获得主回路(H)频率响应:

interrupt void PWM_ISR(void)
{.
//
// Read ADC and computer Fbk Value
//
Vout1_Read = (float32)Vout1R/(4096.0);
//
// Add SFRA injection into the duty cycle for the open loop converter
//
Duty_pu=SFRA_F32_inject(Duty_pu_DC);
//
// Update PWM value
//
EPwm1Regs.CMPA.half.CMPA=((long)(BUCK_PWM_PERIOD))* Duty_pu;
SFRA_F32_collect(&Duty_pu,&Vout1_Read);..
}
  1. 后台任务:在慢速任务中调用后台函数。
SFRA_F32_runBackgroundTask(&sfra1);
  1. 更改链接器命令文件(*.CMD):当从FLASH运行时为了获得更佳性能,注入和采集操作需要运行在RAM中。以下是对CMD文件的更改和添加,以实现SFRA库的包含和最佳性能。
.
ramfuncs : LOAD = FLASHD,
RUN = RAML0L1,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
{
--library=sfra_f32_coff.lib<SFRA_F32_inject.obj>
--library=sfra_f32_coff.lib<SFRA_F32_collect.obj>
}.
SFRA_F32_Data : > dataRAM1, PAGE = 1
  1. 还要确保数学表在ROM中位置定义正确。对于没有TMU的器件,这些位置在器件command文件中定义。请注意,以下位置适用于F28069。
/* FPU Math Tables in Boot ROM */
FPUTABLES : origin = 0x3FD860, length = 0x0006A0.
/* Allocate FPU math areas: */
FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD
  1. 对于具有TMU数学表不在ROM中的器件,必须分配给内存位置以避免链接器警告:
FPUmathTables : > FLASH1, PAGE =1

4. 添加对SFRA GUI的支持

添加对SFRA GUI的支持需要对CCS工程做一些修改。

  1. 在工程中添加“sfra_gui_scicomms_driverlib.c”。这可以在“工程”窗口中完成,方法是右键单击您的工程并选择“将文件添加到项目”,然后浏览到< sfra-installpath >/gui/source。
  2. 在项目的包含路径中添加“sfra_gui_scicomms_driverlib.h”。文件位于< sfra-installpath >/gui/include。
  3. 调用SFRA_GUI_config函数。连接时,GUI可以反转LED,如果使用此功能,则必须将其他配置参数传递给GUI配置例程,否则在这些参数中传递零。F28004x控制卡上使用的典型定义如下所示。如果硬件需要更改,请更改它们。目前,SFRA GUI支持绘制两个矢量,为绘图选项传递一个“1”表示主回路和开环矢量,传递2’绘制闭环和主回路传递函数。
#define SFRA_GUI_SCI_BASE SCIA_BASE
#define SFRA_GUI_VBUS_CLK 50000000
#define SFRA_GUI_SCI_BAUDRATE 57600
#define SFRA_GUI_SCIRX_GPIO 28
#define SFRA_GUI_SCITX_GPIO 29
#define SFRA_GUI_SCIRX_GPIO_PIN_CONFIG GPIO_28_SCIRXDA
#define SFRA_GUI_SCITX_GPIO_PIN_CONFIG GPIO_29_SCITXDA
//
// if the following #define is set to 1 SFRA GUI indicates status on an LED
// otherwise LED code is ignored
//
#define SFRA_GUI_LED_INDICATOR 1
#define SFRA_GUI_LED_GPIO 31
#define SFRA_GUI_LED_GPIO_PIN_CONFIG GPIO_31_GPIO31
.....
//
// configures the SCI channel for communication with SFRA host GUI
// to change SCI channel change #define in the sfra_gui_scicomms_driverlib.c
// the GUI also changes a LED status, this can also be changed with #define
// in the file pointed to above
//
SFRA_GUI_config(SFRA_GUI_SCI_BASE,
SCI_VBUS_CLK,
SFRA_GUI_SCI_BAUDRATE,
SFRA_GUI_SCIRX_GPIO,
SFRA_GUI_SCIRX_GPIO_PIN_CONFIG,
SFRA_GUI_SCITX_GPIO,
SFRA_GUI_SCITX_GPIO_PIN_CONFIG,
SFRA_GUI_LED_INDICATOR,
SFRA_GUI_LED_GPIO,\
SFRA_GUI_LED_GPIO_PIN_CONFIG,
amp;sfra1,
1);
  1. SFRA_GUI_SCI_BASE:这是用于SFRA通信的SCI的base。
  2. SFRA_GUI_SCIRX/TX_GPIO:用于SCI外设的GPIO引脚。例如在controlCARD上,FTDI芯片连接到串行链路,并使用GPIO-28和GPIO-29。
  3. GUI的设置是这样的:当GUI与主机建立连接时,它将闪烁一个LED。此LED可在SFRA_GUI_LED_GPIO中指定,还要确保适当更改SFRA_GUI_LED_GPIO_PIN_CONFIG。
  4. 确保SCI时钟已启用。时钟配置通常在setupDevice()->Device_init()函数中处理。对于powerSUITE解决方案,这些都在board.c文件中。
  5. 在服务速率为~10 ms的较慢任务中,调用以下例程以保持SFRA GUI连接处于活动状态。这通常可以保持接近SFRA 后台函数。
SFRA_GUI_runSerialHostComms(&sfra1);
  1. 该工程现在将连接到SFRA GUI。有关如何运行SFRA GUI的更多信息,请参阅第3.6节。

频率响应输入及补偿设计脚本

完成扫频后,SFRA GUI可以用频率响应数据填充逗号分隔CSV文件或excel表。当选择CSV格式(这是默认设置),可以将其保存为excel文件。excel文件数据可以用来拟合零极格式来提取传递函数。该传递函数可用于设计闭环主回路的补偿。在MATLAB上运行的这些操作的脚本如下所示:

SFRA/<version>/scripts

SFRA GUI选项和如何运行

SFRA GUI可用于启动频率扫描并显示测量的频率响应。下图展示了各个选项。

  • MATH Mode Selection Radio Button:此框必须根据MCU上使用的SFRA库版本进行适当选择。对于作为浮点设备的F28377和F28004x,必须选中“浮点”复选框。
  • Setup Connection Button:该按钮用于选择COM端口并设置波特率。点击此按钮,弹出窗口请求波特率选择,通常设置为57600。如果设备已连接,请单击“刷新组件”并选择目标正在使用的串行组件。
    –如果目标连接到的组件已知,请选择它。
    –如果没有,要找到有效的组件,请转到:
    • 控制面板→系统→设备管理器→端口(COM和LPT)
    • 如果使用直接连接到PC的串行端口,请查找显示为“通信端口”的组件,并在“设置连接”窗口中选择该组件。如果使用USB到串行适配器,请查找显示“USB串行端口”的组件,然后在“设置连接”窗口中选择此组件。
    取消选中“Boot on Connect”可将GUI与从RAM运行的CCS工程结合使用,或在使用已有工作的SFRA工程一起刷新的目标时使用。(此句不会翻)
  • Connect and Disconnect Button:一旦数学模式被适当地选择并且通信的COM端口被设置,点击这个按钮连接到MCU。此按钮也用于断开与MCU的连接。
  • Connection Status Indicator:这表示连接是否已成功建立或是否存在任何问题。
  • Frequentcy Vector Length Label:连接后,此标签显示在MCU上编程的SFRA向量的长度。
  • Start Frequency Text Box:此框显示SFRA扫描的开始频率。用户可以通过在文本框中输入值并单击“输入”来更改此设置。(注意,控制器侧的值仅在用户开始SFRA扫描时更新)。
  • Steps Per Decade Text Box:指定每十倍频程执行SFRA的频率点数。
  • Maximum SFRA Frequency Label:这是执行SFRA之前的最大频率。这是开始频率、每十倍频程点数和频率长度的函数。
  • Start Sweep Button:单击此按钮开始对控制器进行频率扫描。
  • Drop Down Menu to Select Open Loop or Plant Frequency:将显示在面板右侧的响应。
  • Closed Loop Performance Parameters Panel:如果在闭环系统上执行SFRA,此面板将显示闭环系统的带宽、增益裕度和相位裕度。
    在这里插入图片描述

这篇关于TMS320F280049C 学习笔记22 SFRA part 2 模块摘要的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/398474

相关文章

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.