-
SECTIONS
{
codestart : > BEGIN, PAGE = 0, ALIGN(4)
.text : >>FLASH_BANK0_SEC1 | FLASH_BANK0_SEC2 | FLASH_BANK0_SEC3, PAGE = 0, ALIGN(4)
.cinit : > FLASH_BANK0_SEC0, PAGE = 0, ALIGN(4)
.init_array : > FLASH_BANK0_SEC0, PAGE = 0, ALIGN(4)
.switch : > FLASH_BANK0_SEC0, PAGE = 0, ALIGN(4)
.const : > FLASH_BANK0_SEC0, PAGE = 0, ALIGN(4)
.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */.stack : > RAMM1, PAGE = 1
.data : > RAMLS0LS1, PAGE = 1
.bss : > RAMLS0LS1, PAGE = 1
.sysmem : > RAMGS2, PAGE = 1 -
上述代码是一个链接脚本文件,用于指定程序中各个部分的存储位置。其中,SECTIONS块定义了各个段的名称、存储位置和对齐方式等信息。具体解释如下:
- codestart:程序的起始地址,通常为0。
- .text:代码段,存放程序的指令。
- .cinit:C语言初始化代码段,存放C语言程序的初始化代码。
- .init_array:初始化函数指针数组,存放需要在程序启动时执行的初始化函数。
- .switch:存放switch语句的跳转表。
- .const:常量段,存放程序中的常量。
- .reset:复位向量,存放处理器复位时的跳转地址。下面是数据段的定义:
- .stack:栈段,存放程序的运行时栈。
- .data:数据段,存放程序中已初始化的全局变量。
- .bss:BSS段,存放程序中未初始化的全局变量和静态变量。
- .sysmem:系统内存段,存放操作系统的内存。SECTIONS块中的符号“>”表示将该段放在指定的存储区域中,而“>>”表示将该段放在多个存储区域中。PAGE表示该段所在的页码,ALIGN表示该段的对齐方式。FLASH_BANK0_SEC0、FLASH_BANK0_SEC1、FLASH_BANK0_SEC2、FLASH_BANK0_SEC3和RAMM1、RAMLS0LS1、RAMGS2都是存储区域的名称,具体的定义需要参考链接脚本文件中的其他部分。
-
GROUP
{
.TI.ramfunc
{
-l sfra_f32_tmu_eabi.lib
}
ramfuncs} LOAD = FLASH_BANK0_SEC6,
RUN = RAMGS0GS1,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
PAGE = 0, ALIGN(4) -
GROUP是一种用于将多个SECTION组合在一起的机制。在这个例子中,GROUP将.TI.ramfunc和ramfuncs这两个SECTION组合在一起,并将它们放在了LOAD和RUN中。LOAD和RUN分别指定了SECTION在Flash和RAM中的位置,LOAD_START、LOAD_SIZE、LOAD_END、RUN_START、RUN_SIZE和RUN_END则指定了SECTION在Flash和RAM中的地址和大小。PAGE和ALIGN(4)则分别指定了SECTION在Flash中的页和在RAM中的对齐方式。
-
SFRA_F32_Data : > RAMLS0LS1, ALIGN = 64, PAGE = 1
FPUmathTables : > FLASH_BANK0_SEC11, PAGE =0
.scratchpad : > RAMLS0LS1, PAGE = 1
.bss_cla : > RAMLS0LS1, PAGE = 1
controlVariables : > RAMLS0LS1, PAGE = 1.const_cla : LOAD = FLASH_BANK1_SEC8_9_10,
RUN = RAMLS2LS3LS4LS5,
RUN_START(Cla1ConstRunStart),
LOAD_START(Cla1ConstLoadStart),
LOAD_SIZE(Cla1ConstLoadSize),
PAGE = 0 -
#define BUCK_SFRA_INJECT(x) (x)
#define BUCK_SFRA_COLLECT(x, y) {}
#define BUCK_SFRA_GUI_RUN_COMMS(x) {}
#define BUCK_SFRA_RUN_BACKGROUND(x) {} -
这是一组C++宏定义,可能用于同步整流Buck的SFRA测试。具体而言,这些宏定义可能用于注入、收集和传输SFRA测试数据,以及在后台运行SFRA测试。其中,BUCK_SFRA_INJECT(x)可能用于注入测试信号,BUCK_SFRA_COLLECT(x, y)可能用于收集测试数据,BUCK_SFRA_GUI_RUN_COMMS(x)可能用于在GUI中运行通信,BUCK_SFRA_RUN_BACKGROUND(x)可能用于在后台运行测试。需要根据具体上下文来确定这些宏定义的确切含义和用途。
-
void BUCK_initProgramVariables(void)
{
BUCK_dutyTarget_pu = 0.0f;
BUCK_dutySlewed_pu = 0.0f;
BUCK_dacTarget_pu = 0.0f;
BUCK_dacSlewed_pu = 0.0f;
BUCK_vOutSet_pu = 0.0f;
BUCK_vOutTarget_pu = 0.0f;
BUCK_vOutSlewed_pu = 0.0f;
BUCK_vOutSensed_pu = 0.0f;
BUCK_kp = 0.0f;
BUCK_ki = 0.0f;
BUCK_kd = 0.0f;
BUCK_uk_pu = 0.0f;
BUCK_ek_pu = 0.0f;BUCK_adcSampleIndex = BUCK_AVG_ADC_SAMPLES;
do {
BUCK_adcSampleIndex--;
BUCK_vInSamples_Volts[BUCK_adcSampleIndex] = 0.0f;
BUCK_vOutSamples_Volts[BUCK_adcSampleIndex] = 0.0f;
BUCK_iLSamples_Amps[BUCK_adcSampleIndex] = 0.0f;
} while(BUCK_adcSampleIndex > 0);DCL_initLog(&BUCK_vOutLogFdlog, BUCK_vOutLog_Volts, BUCK_VOUT_LOG_SIZE);
DCL_initTCM(&BUCK_vOutLogTcm,
BUCK_vOutLogFdlog.fptr,
BUCK_VOUT_LOG_SIZE,
BUCK_VOUT_LOG_LEAD_SIZE,
BUCK_vOutSetRef_Volts - BUCK_VOUT_LOG_UNDER_V,
BUCK_vOutSetRef_Volts + BUCK_VOUT_LOG_OVER_V);BUCK_vOutLogRef.forceTrig = 0;
BUCK_vOutLogRef.armTrig = 0;
BUCK_vOutLogRef.leadSamples = BUCK_vOutLogTcm.lead;
BUCK_vOutLogRef.trigMin_V = BUCK_vOutLogTcm.trigMin;
BUCK_vOutLogRef.trigMax_V = BUCK_vOutLogTcm.trigMax;
} -
这段代码是一个初始化函数,用于初始化BUCK电路控制器的各种变量。其中包括占空比、DAC输出、输出电压等变量的初始化,以及一些采样数据的初始化。此外,还初始化了一个日志文件和一个触发器,用于记录输出电压的变化情况。
-
static inline void DCL_initTCM(TCM *q, float32_t *addr, uint16_t size, uint16_t lead, float32_t tmin, float32_t tmax)
{
// assign and clear capture frame, and initialize index to end of lead frame
DCL_initLog(&(q->captFrame), addr, size);
DCL_clearLog(&(q->captFrame));
q->captFrame.dptr = q->captFrame.fptr + lead;// assign lead & monitor frame pointers
DCL_initLog(&(q->leadFrame), addr, lead);
DCL_initLog(&(q->moniFrame), q->captFrame.lptr - lead + 1, lead);// load remaining TCM vars
q->lead = lead;
q->trigMax = tmax;
q->trigMin = tmin;
q->mode = TCM_idle;
} -
这段代码是一个函数,名为DCL_initTCM,它的作用是初始化一个TCM结构体。这个结构体包含了三个成员变量:captFrame、leadFrame和moniFrame,它们都是Log类型的结构体。在函数中,首先对captFrame进行了初始化,然后将其dptr指针指向了leadFrame的末尾,接着对leadFrame和moniFrame进行了初始化。最后,对结构体中的其他成员变量进行了赋值。这个函数的具体实现需要结合上下文才能确定。
-
float32_t BUCK_dutyTarget_pu;
float32_t BUCK_dutySlewed_pu;
float32_t BUCK_dacTarget_pu;
float32_t BUCK_dacSlewed_pu;
float32_t BUCK_vOutSet_pu;
float32_t BUCK_vOutTarget_pu;
float32_t BUCK_vOutSlewed_pu;
float32_t BUCK_vOutSensed_pu;
float32_t BUCK_kp;
float32_t BUCK_ki;
float32_t BUCK_kd;
float32_t BUCK_uk_pu;
float32_t BUCK_ek_pu;
DCL_ZPK3 BUCK_zpk3;
uint16_t BUCK_adcSampleIndex;
float32_t BUCK_vInSamples_Volts[BUCK_AVG_ADC_SAMPLES];
float32_t BUCK_vOutSamples_Volts[BUCK_AVG_ADC_SAMPLES];
float32_t BUCK_iLSamples_Amps[BUCK_AVG_ADC_SAMPLES];uint32_t MEP_ScaleFactor;
uint16_t BUCK_sfoStatus; -
这是一个包含多个变量的代码段,这些变量的含义如下:
- BUCK_dutyTarget_pu: Buck转换器的占空比目标值,单位为pu。
- BUCK_dutySlewed_pu: Buck转换器的占空比斜率,单位为pu/s。
- BUCK_dacTarget_pu: Buck转换器的DAC目标值,单位为pu。
- BUCK_dacSlewed_pu: Buck转换器的DAC斜率,单位为pu/s。
- BUCK_vOutSet_pu: Buck转换器的输出电压设置值,单位为pu。
- BUCK_vOutTarget_pu: Buck转换器的输出电压目标值,单位为pu。
- BUCK_vOutSlewed_pu: Buck转换器的输出电压斜率,单位为pu/s。
- BUCK_vOutSensed_pu: Buck转换器的输出电压感测值,单位为pu。
- BUCK_kp: Buck转换器的比例系数。
- BUCK_ki: Buck转换器的积分系数。
- BUCK_kd: Buck转换器的微分系数。
- BUCK_uk_pu: Buck转换器的控制输入,单位为pu。
- BUCK_ek_pu: Buck转换器的控制误差,单位为pu。
- BUCK_zpk3: Buck转换器的零极点信息。
- BUCK_adcSampleIndex: Buck转换器的ADC采样索引。
- BUCK_vInSamples_Volts: Buck转换器的输入电压采样值,单位为伏特。
- BUCK_vOutSamples_Volts: Buck转换器的输出电压采样值,单位为伏特。
- BUCK_iLSamples_Amps: Buck转换器的电感电流采样值,单位为安培。
- MEP_ScaleFactor: MEP比例系数。
- BUCK_sfoStatus: Buck转换器的SFO状态。 -
void BUCK_updateControllerCoefficients(void)
{
//
// Update the active DCL coefficients if requested by the user
//
if(BUCK_ctrlRef.ctrlUpdate != 0)
{
if(BUCK_ctrlRef.ctrlFormat == Format_PID)
{
//
// Store the scaled values into DCL PID format
//
BUCK_kp = BUCK_ctrlRef.ctrlPid.Kp / BUCK_ctrlRef.ctrlPid.Scale;
BUCK_ki = BUCK_ctrlRef.ctrlPid.Ki / BUCK_ctrlRef.ctrlPid.Scale;
BUCK_kd = BUCK_ctrlRef.ctrlPid.Kd / BUCK_ctrlRef.ctrlPid.Scale;BUCK_DCL_LOAD_PID(&BUCK_ctrl,
BUCK_kp,
BUCK_ki,
BUCK_kd,
BUCK_ctrlRef.ctrlPid.fc_Hz);
}
else if(BUCK_ctrlRef.ctrlFormat == Format_ZPK)
{
//
// Store the calculated values into the DCL ZPK3 format
// Z-P frequency values are converted to radians in Left Half-Plane
//
BUCK_zpk3.z1 = (-2 * BUCK_DCL_PI * 1000) *
BUCK_ctrlRef.ctrlZpk.Z0_kHz;
BUCK_zpk3.z2 = (-2 * BUCK_DCL_PI * 1000) *
BUCK_ctrlRef.ctrlZpk.Z1_kHz;
BUCK_zpk3.p1 = 0;
BUCK_zpk3.p2 = (-2 * BUCK_DCL_PI * 1000) *
BUCK_ctrlRef.ctrlZpk.P1_kHz;//
// Normalize Gain
//
BUCK_zpk3.K = BUCK_ctrlRef.ctrlZpk.Kdc *
BUCK_ctrlRef.ctrlZpk.P1_kHz /
BUCK_ctrlRef.ctrlZpk.Z0_kHz /
BUCK_ctrlRef.ctrlZpk.Z1_kHz /
(2 * BUCK_DCL_PI * 1000);BUCK_DCL_LOAD_ZPK(&BUCK_ctrl,
&BUCK_zpk3);
}
else if(BUCK_ctrlRef.ctrlFormat == Format_Coeff)
{
//
// Copy coefficients directly into DCL SPS structure
//
#if(BUCK_DCL_CTRL_TYPE == DCL_DF22)
BUCK_ctrl.sps->b0 = BUCK_ctrlRef.ctrlCoeff.B0;
BUCK_ctrl.sps->b1 = BUCK_ctrlRef.ctrlCoeff.B1;
BUCK_ctrl.sps->b2 = BUCK_ctrlRef.ctrlCoeff.B2;
BUCK_ctrl.sps->a1 = BUCK_ctrlRef.ctrlCoeff.A1;
BUCK_ctrl.sps->a2 = BUCK_ctrlRef.ctrlCoeff.A2;
#else
asm(" ESTOP0");
#endif
}DCL_REQUEST_UPDATE(&BUCK_ctrl);
BUCK_DCL_UPDATE(&BUCK_ctrl);
BUCK_DCL_RESET(&BUCK_ctrl);
BUCK_ctrlRef.ctrlUpdate = 0;
BUCK_isrDutyUpdateMarginClear = 1;
}//
// Store the active DCL coefficients for user observation
//
BUCK_ctrlRef.ctrlActiveCoeff.B0 = BUCK_ctrl.b0;
BUCK_ctrlRef.ctrlActiveCoeff.B1 = BUCK_ctrl.b1;
BUCK_ctrlRef.ctrlActiveCoeff.B2 = BUCK_ctrl.b2;
BUCK_ctrlRef.ctrlActiveCoeff.A1 = BUCK_ctrl.a1;
BUCK_ctrlRef.ctrlActiveCoeff.A2 = BUCK_ctrl.a2;
} -
这段代码是一个名为BUCK_updateControllerCoefficients的函数,用于更新控制器的系数。函数首先检查是否需要更新控制器系数,如果需要,则根据控制器的格式将系数存储到相应的数据结构中。如果控制器格式为PID,则将缩放后的Kp、Ki和Kd值存储到DCL PID格式中;如果控制器格式为ZPK,则将计算出的Z-P频率值存储到DCL ZPK3格式中;如果控制器格式为Coeff,则直接将系数复制到DCL SPS结构中。然后,函数请求更新控制器、更新控制器、重置控制器,并将控制器更新标志设置为0。最后,函数将活动DCL系数存储到控制器参考结构中以供用户观察。
【无标题】
最新推荐文章于 2023-12-15 12:03:17 发布