This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/LAUNCHXL-F28377S:DCL PI 控制器汇编版本 C1出现问题

Guru**** 2563250 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/639306/compiler-launchxl-f28377s-issue-with-dcl-pi-controller-assembly-version-c1

器件型号:LAUNCHXL-F28377S

工具/软件:TI C/C++编译器

你(们)好

我必须调节通过 TMM320F28377S DSP 的 PWM 驱动的多个 H 桥的输出电压。 我使用的是 TI DCL 库版本2.01.0。

起初我想使用 PI 控制器的汇编版本(DCL_runPI_C1),但我发现它对我来说并不是很实用。 我不知道如何从 C 代码调用汇编函数、或者我的一些编译器设置错误。 问题是汇编函数似乎没有正确保存寄存器上下文。 这是从 DCL 库复制的汇编器函数。 您可以看到、在某个时候、它使用0xA 加载寄存器 AR1。 该寄存器不会保存在函数开始时的上下文保存中。

问题是、我的调用 C 函数使用 XAR1将索引保存到数组中、以保存汇编 PI 控制器的计算结果。 这意味着从汇编函数返回后、索引会丢失、并且始终指向错误的数组元素。

_DCL_runPI_C1:
.asmfunc
;上下文保存

MOV32* SP++、R4H
MOV32* SP++
、R6H

;伺服错误
SUBF32R4H、R0H、R1H;R4H =


KP;比例路径 MOV32 R5H、R6H =
R32

;R5H = R4H、R32+ R32];R5H = R4ARV2;R4ARV+ R32+ R4V2、R32[积分路径 R32]
R5H = Ki
MPYF32R4H、R5H、R6H;R4H = v3
MOVAR1、#0xA;AR1 = 10
MOV32R5H、*+ XAR4[AR1];R5H = i6
MPYF32R3H、R4H、R3H =
10
、R4H、R4V4V4、R32[ARV4V]R5H = v4
零R1H;R1H = 0.0f
MOV32*+XAR4[4]、R5H;保存 I10

;控制
ADDF32R0H、R5H、 R6H;R0H = v5
ADDF32R5H、R1H、#1.0;R5H = 1.0f
MOV32R3H、*+ XAR4[6];R3H = Umax
MINF32R0H、R3H;如果(v5 > Umax) R0H = Umax 否则 R0H =|||RM32 R0H、R3H;如果(v5 > Umax) R0H = Umax;
R5ARV
= 0H = 0H = Umax;R5V、R5H = R5H = R5H;R5AR0 = 8
MOV32R3H、*+ XAR4[AR0];R3H = Umin
MAXF32R0H、R3H;if (v5 < Umin) R0H = Umin 否则 R0H = v5
||MOV32R5H、R1H;R5H = 0.0f

;anti-wdup * ARV3H;RESTOR-32+
MOV32[开槽
2、R32];RESTORE + ARV3+ AR32]保存 i6
MOV32R5H、*- SP、UNCF
MOV32R4H、*- SP、UNCF

LRETR
.endasmfunc

.end 

void clcCalcControl (const uint16_t c、float ref、float fb)
{
浮点 pContraut;

pConttrOut = DCL_runPI_C1 (&piController[c]、ref、fb);
控制[c] =(ref + piContrOut)/ ref;
}

如果我在       汇编函数的开头添加一个 MOVL *SP++、XAR1、在       末尾添加一个 MOVL XAR1、*--SP、它就可以正常工作。

这是汇编函数中的错误、还是我可以通过设置编译器选项或优化级别来解决的问题?

谢谢、

Jens

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jens、

    感谢您的介绍。  乍一看、这看起来像是一个错误。  XAR1不受 C28x 上自动上下文保存的保护、因此在使用之前、它应该已经被压入堆栈。  由于某种原因、未能在测试中显示该信息。

    正确的解决方案是添加两个移动指令、就像您所做的那样。  我将确保在下一个版本的库中修复此问题。   

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jens、

    同一问题也会影响 PID_C4和 PI_C1控制器。 在使用前、应按照上述说明修改所有源。

    C2000Ware 中将于12月13日发布更新后的库、并进行了这些更正。 感谢您指出这一点。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、谢谢。 我很高兴能提供帮助。