我的应用需要1MHz 控制环路以及数据采集。 在我的当前代码中、ADC 会触发 CLA 任务和主 CPU 中的 ISR。 CLA 任务执行控制、而 ISR 执行数据采集。 根据 CPU 中的状态机、CLA 必须更改正在运行的控制算法的类型。 为了实现这一点、我在 CPU 到 CLA 消息 RAM 中定义整数、并将其用作 CLA 任务中一个 case 语句的标志。 我的问题是这种实施的结果不一致。 case 语句似乎有时起作用、但在其他情况下、我可以看到 CCS 中 flag 变量的值、但 CLA 似乎没有进入该 case。
我怀疑这个问题与 CLA 和 CPU 之间通过读取/写入标志变量的仲裁有关、但我不确定。 此策略是否存在明显的问题? 是否有更好的方法在 CPU 和 CLA 之间实现通信以确定实施了哪种控制算法。
CLA 任务中的代码如下(MODE_CLA 是在 CPU 至 CLA 消息 RAM 中定义的标志变量):
开关(MODE_CLA)
{
情况0://无控制,无正弦(空闲,伺服,预充电,BUCKUP, 错误)
RK = VBATT_VUBS;
RK2 = 0.0;
T = 0;
中断;
情况1://内部控制,无正弦(CTRLUP、ZTEST)
RK = VBATT_VUBS;
RK2 = 0.0;
T = 0;
UKI = DCL_runPIc (&ctrl_inner_pi、rk、AK);
UK_CMP =(long)(UKI * 6553600);
EPwm1Regs.CMPA.ALL = UK_CMP;
中断;
案例2://innter+Outer 控制、无正弦(EISSETUP、发送)
RK = VBATT_VUBS;
RK2 = 0.0;
T = 0;
uko = DCL_runPIc (&Ctrl_OUT_PI、RK2、YK);
UKI = DCL_runPIc (&ctrl_inner_pi、uko、AK);
UK_CMP =(long)(UKI * 6553600);
EPwm1Regs.CMPA.ALL = UK_CMP;
中断;
案例3://内部控制、正弦(ZTEST 运行)
fResult = CLAsin ((float) t*tcontrol*two_pi/Tperturb[0]);
RK = VBATT_VULBS + fResult*振幅;
rk2 =fResult*振幅;
最后= 3;
UKI = DCL_runPIc (&ctrl_inner_pi、rk、AK);
UK_CMP =(long)(UKI * 6553600);
EPwm1Regs.CMPA.ALL = UK_CMP;
中断;
案例4://内部+外部控制,正弦(运行)
fResult = CLAsin ((float) t*tcontrol*two_pi/Tperturb[0]);
RK = VBATT_VULBS + fResult*振幅;
rk2 =fResult*振幅;
uko = DCL_runPIc (&Ctrl_OUT_PI、RK2、YK);
UKI = DCL_runPIc (&ctrl_inner_pi、uko、AK);
UK_CMP =(long)(UKI * 6553600);
EPwm1Regs.CMPA.ALL = UK_CMP;
中断;
}