SFRA_F32/28379d_test_SFRA/SFRA/sfra_f32.h
2026-06-12 16:22:17 +08:00

183 lines
7.3 KiB
C

//###########################################################################
//
// FILE: sfra_f32.h
//
// TITLE: Prototypes and Definitions for the C28x FPU SFRA Library
//
// AUTHOR: Manish Bhardwaj (C2000 Systems Solutions, Houston , TX)
//
//#############################################################################
// $TI Release: C2000 Software Frequency Response Analyzer Library v1.50.02.00 $
// $Release Date: Tue Aug 26 14:08:13 CDT 2025 $
// $Copyright:
// Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/
//
// ALL RIGHTS RESERVED
// $
//#############################################################################
#ifndef SFRA_F32_H
#define SFRA_F32_H
#ifdef __cplusplus
extern "C" {
#endif
//*****************************************************************************
//
//! \addtogroup SFRA
//! @{
//
//*****************************************************************************
//
// the includes & defines
//
#ifndef C2000_IEEE754_TYPES
#define C2000_IEEE754_TYPES
#ifdef _TI_EABI_
typedef float float32_t;
typedef double float64_t;
#else // TI COFF
typedef float float32_t;
typedef long double float64_t;
#endif // _TI_EABI_
#endif // C2000_IEEE754_TYPES}}
#include <stdint.h>
#include <stddef.h>
#include <math.h>
#ifdef __TI_EABI__
#define SFRA_F32_inject __SFRA_F32_inject
#define SFRA_F32_collect __SFRA_F32_collect
#else
#define SFRA_F32_inject _SFRA_F32_inject
#define SFRA_F32_collect _SFRA_F32_collect
#endif
//! \brief Defines the SFRA_F32 structure
//!
//! \details The SFRA_F32 can be used to run a software based
//! frequency response analysis on power converters
//!
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 ISR frequency
float32_t freqStart; //!< Start frequency of SFRA sweep
float32_t freqStep; //!< Log space between frequency points (optional)
int16_t start; //!< Command to start SFRA
int16_t state; //!< State of SFRA
int16_t status; //!< Status of SFRA
int16_t vecLength; //!< No. of Points in the SFRA
int16_t freqIndex; //!< Index of the frequency vector
int16_t storeH; //!< Flag to indicate if H vector is stored
int16_t storeGH; //!< Flag to indicate if GH vector is stored
int16_t storeCL; //!< Flag to indicate if CL vector is stored
int16_t speed; //!< variable to change the speed of the sweep
}SFRA_F32;
//! \brief Resets internal data of SFRA_F32 module
//! \param SFRA_F_obj Pointer to the SFRA_F32 structure
//!
extern void SFRA_F32_reset(SFRA_F32 *SFRA_F_obj);
//! \brief Configures the SFRA_F32 module
//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure
//! \param isrFrequency Frequency at which SFRA routine in called,
//! typically the control ISR rate
//! \param injectionAmplitude Per Unit (PU) injection amplitude
//! \param noFreqPoints Number of frequency points sweeped
//! \param fraSweepStartFreq Start frequency of SFRA sweep
//! \param freqStep Multiplier used to keep frequency points log step apart
//! \param *h_magVect Pointer to array that stores plant FRA magnitude data
//! \param *h_phaseVect Pointer to array that stores plant FRA phase data
//! \param *gh_magVect Pointer to array that stores OL FRA magnitude data
//! \param *gh_phaseVect Pointer to array that stores OL FRA phase data
//! \param *cl_magVect Pointer to array that stores OL FRA magnitude data
//! \param *cl_phaseVect Pointer to array that stores OL FRA phase data
//! \param *freqVect Pointer to array that stores the freq points for the sweep
//! \param speed indiactes the speed of the sweep
//!
extern void SFRA_F32_config(SFRA_F32 *SFRA_F_obj,
float32_t isrFrequency,
float32_t injectionAmplitude,
int16_t noFreqPoints,
float32_t fraSweepStartFreq,
float32_t freqStep,
float32_t *h_magVect,
float32_t *h_phaseVect,
float32_t *gh_magVect,
float32_t *gh_phaseVect,
float32_t *cl_magVect,
float32_t *cl_phaseVect,
float32_t *freqVect,
int16_t speed);
//! \brief Initailizes the freq vectors with points that are log step apart
//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure
//! \param fra_sweep_start_freq Start frequency of SFRA sweep
//! \param freqStep Multiplier used to keep frequency points log step apart
//!
extern void SFRA_F32_initFreqArrayWithLogSteps(SFRA_F32 *SFRA_F_obj,
float32_t fra_sweep_start_freq,
float32_t freqStep);
//! \brief Resets the response data stored in the ol and plant
//! phase and mag vector
//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure pointer
//!
extern void SFRA_F32_resetFreqRespArray(SFRA_F32 *SFRA_F_obj);
//! \brief Updates injection amplitude
//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure
//! \param new_injection_amplitude Injection amplitude
//!
extern void SFRA_F32_updateInjectionAmplitude(SFRA_F32 *SFRA_F_obj,
float32_t new_injection_amplitude);
//! \brief Injects small signal disturbance into the control loop
//! \param ref refernce value on which the injection is added
//! \return Routine returns the reference plus the injection when SFRA sweep
//! is active, when SFRA sweep is not active that is if SFRA state is 0
//! it returns the the refernce without any change
//!
extern float SFRA_F32_inject(float ref);
//! \brief Collects the response of the loop because of small signal disturbance
//! injected
//! \param *control_output pointer to the variable where control output is saved
//! note though the parameter is passed by reference
//! it is unchanged by the module
//! \param *feedback pointer to the variable where control output is saved
//! note though the parameter is passed by reference
//! it is unchanged by the module
//!
extern void SFRA_F32_collect(float *control_output, float *feedback);
//! \brief Runs the background task, this routine executes the state machine
//! when a frequency sweep is started and is responsible for changing
//! the frequency points and saving the measured results in an array
//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure pointer
//!
extern void SFRA_F32_runBackgroundTask(SFRA_F32 *SFRA_F_obj);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif // extern "C"
#endif // end of SFRA_F32_H definition