本文主要是介绍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库添加到项目中
- 在要运行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库:
- 添加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
…
- 为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[];
- 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与此无关。频率阵列初始化代码可以根据应用程序的需要替换为任何其他代码。
- 使用模块,在补偿器输入和输出附近将代码添加到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);
…..
}
- 后台任务:在慢速任务中调用后台函数。
SFRA_F32_runBackgroundTask(&sfra1);
- 更改链接器命令文件(*.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
- 还要确保数学表在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
- 对于具有TMU数学表不在ROM中的器件,必须分配给内存位置以避免链接器警告:
FPUmathTables : > FLASH1, PAGE =1
4. 添加对SFRA GUI的支持
添加对SFRA GUI的支持需要对CCS工程做一些修改。
- 在工程中添加“sfra_gui_scicomms_driverlib.c”。这可以在“工程”窗口中完成,方法是右键单击您的工程并选择“将文件添加到项目”,然后浏览到< sfra-installpath >/gui/source。
- 在项目的包含路径中添加“sfra_gui_scicomms_driverlib.h”。文件位于< sfra-installpath >/gui/include。
- 调用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);
- SFRA_GUI_SCI_BASE:这是用于SFRA通信的SCI的base。
- SFRA_GUI_SCIRX/TX_GPIO:用于SCI外设的GPIO引脚。例如在controlCARD上,FTDI芯片连接到串行链路,并使用GPIO-28和GPIO-29。
- GUI的设置是这样的:当GUI与主机建立连接时,它将闪烁一个LED。此LED可在SFRA_GUI_LED_GPIO中指定,还要确保适当更改SFRA_GUI_LED_GPIO_PIN_CONFIG。
- 确保SCI时钟已启用。时钟配置通常在setupDevice()->Device_init()函数中处理。对于powerSUITE解决方案,这些都在board.c文件中。
- 在服务速率为~10 ms的较慢任务中,调用以下例程以保持SFRA GUI连接处于活动状态。这通常可以保持接近SFRA 后台函数。
SFRA_GUI_runSerialHostComms(&sfra1);
- 该工程现在将连接到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 模块摘要的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!