如图所示,上述是我用于测试SFRA的代码,现在对于plant的Bode图已经能正确绘制,然而当我加入闭环控制时,程序却跑飞了。
具体而言,该项目的f28004x_flash_lnk_eabi.cmd是从SFRA的例程example1_stb_f28004x_f32_eabi中直接复制而来,因此它理应运行在Flash上。
根据该cmd文件,dclfuncs应该在初始化阶段被移动到RAM中,查看编译后的.map文件也证明了这一点。
调试时的Memory Allocate也证明了这一点:
当我切换到ClosedLoop_Mode时,程序运行到DCL_runPI_C2函数时,程序立刻跳转到了interrupt_illegalOperationHandler
if (ClosedLoop_Mode == 1) { Uref_pu = Uref / U_NOMINAL; Uref_pu_Inject = SFRA_F32_inject(Uref_pu); // Duty_pu = DCL_runPI_C1(&Vout_PI, Uref_pu, Uo_pu); Duty_pu = DCL_runPI_C2(&Vout_PI, Uref_pu_Inject, Uo_pu); EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, (1.f - Duty_pu) * EPWM_getTimeBasePeriod(myEPWM1_BASE)); SFRA_F32_collect(&Duty_pu, &Uo_pu); }
我应该如何修改才能使其正常工作?
中断逻辑如下:
ePWM1向上向下计数,频率20kHz, 当CNT达到TBPRD时触发ADCA采样,ADCA的SOC0转换完毕触发控制中断。
您好
您的中断逻辑有效。 DCL_runPI 不会扰乱任何中断设置、因此我认为问题出在其它地方。
请确认以下两项、然后再进一步调试:
1.中断 ISR 是否有__interrupt 说明符来指示编译器的中断?
2.我看到您正在尝试在启动时为 isrcodefuncs 和 dclfuncs 加载闪存至 ram。 由于您在链接器脚本中未使用可复制表(编译器初始化例程负责可复制的复制)、您是否在程序启动时通过 memcpy 复制? 如下所示:
extern uint32_t __isrcodefuncsLoadStart; extern uint32_t __isrcodefuncsRunStart; extern uint32_t __isrcodefuncsLoadSize; memcpy((void*)& __isrcodefuncsLoadStart,(void*)&__isrcodefuncsRunStart,(uint32_t)__isrcodefuncsLoadSize);