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.

[参考译文] 有关 C28x FPU fastRTS 库中的正弦函数和使用 TMU 的正弦函数的信息

Guru**** 2034120 points
Other Parts Discussed in Thread: TMS320F28335, CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/625383/information-about-sincos-function-from-c28x-fpu-fastrts-library-and-sin-cos-functions-using-tmu

Thread 中讨论的其他器件:TMS320F28335controlSUITE

大家好、

我正在查找要在 TMS320F28335上使用的 C28x FPU fastRTS 库中有关 SINCOS 函数的文档。

源代码是否可用?


我想知道它是如何工作的。 表、功能..  是否需要将角度介于0和2*Pi 之间...

对于要在 TMS320F28377X 上使用的 TMU 模块的 SINUS 和 Cosinus fuion,还有同样的问题。

任何基准测试、文档都将不胜感激。

谢谢!

PA Nicoletti。

 

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

    有人能帮我解决上述主题吗?

    我需要有关 TMS320F28335 (C28x FPU fastRTS 库)上的 SINCOS 函数以及 TMS3290F28377D (包括 TMU)的 SINUS/Cosinus 函数的信息。

    这些数据是否有任何技术数据?

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

    你好

    我在控制套件中找到了快速 RTS 的源代码(C:\ti\controlSUITE\libs\math\FPUfastRTS\v100\source):

    Sincos (_sincos): ;输入时:R0H = Radian、XAR4 = PtrSin、XAR5 = PtrCos
    MOVIZ R1H、#0x42A2 ;R1H = 512/(2*PI)= 512/6.28318531 = 81.4873309
    MOVXI R1H、#0xF983
    
    MPYF32 R0H、R0H、R1H ;R0H = Radian * 512/(2*PI)
    || MOV32 *SP++、R4H ;将 R4H 存储在堆栈上
    
    MOVIZ R2H、#0x3C49 ; R2H=(2*PI)/512=6.28318531/512
    MOVXI R2H、#0x0FDB ; = 0x3C490FDB 或0.012271846644531
    F32TOI32 R1H、R0H ;R1H = int (Radian * 512/(2*PI))
    MOVL XAR6、#_FPUcosTable
    MOVL XAR7、#_FPUsinTable
    MOV32. ACC、R1H ;ACC = int (Radian *512/(2*PI))
    和 @AL、#0x1FF
    LSL AL、#1
    MOVZ AR0、@AL ;AR0 =“正弦/余弦”表的索引= k
    FRACF32 R0H、R0H ;R0H =帧(Radian*512/(2*PI))
    MOVIZ R1H、#0x3E2A ;R1H = 0.166667 (0x3E2AAAAB)
    MOVXI R1H、#0xAAAB
    
    MPYF32 R0H、R0H、R2H ;R0H = x =帧(Radian*512/(2*PI))*(2*PI)/512
    || MOV32 R3H、*+ XAR6[AR0];R3H = C (k)
    
    MPYF32 R2H、R1H、R3H ; R2H=0.166667*C(k)
    || MOV32 R4H、*+ XAR7[AR0];R4H = S (k)
    
    MPYF32 R1H、R1H、R4H ; R1H=0.166667*S(k)
    MPYF32 R2H、R0H、R2H ; R2H=x*0.166667*C(k)
    
    MPYF32 R4H、-0.5、R4H ; R4H=-0.5*S(k)
    MPYF32 R3H、-0.5、R3H ; R3H=-0.5*C(k)
    
    MPYF32 R1H、R0H、R1H ; R1H=x*0.166667*S(k)
    || SUBF32 R2H、R4H、R2H ; R2H=-0.5*S(k)-x*0.166667*C(k)
    
    MOV32. R4H、*+ XAR6[AR0];R4H = C (k)
    
    ADDF32 R1H、R3H、R1H ; R1H =-0.5*C(k)+x*0.166667*S(k)
    || MOV32 R3H、*+ XAR7[AR0];R3H = S (k)
    
    MPYF32 R2H、R0H、R2H ; R2H=x*(-0.5*S(k)-x*0.166667*C(k)
    MPYF32 R1H、R0H、R1H ; R1H=x*(-0.5*C(k)+x*0.166667*S(k))
    ADDF32 R2H、R4H、R2H ; R2H=C(k)+x*(-0.5*S(k)-x*0.166667*C(k)
    SUBF32 R1H、R1H、R3H ; R1H =-S (k)+x*(-0.5*C(k)+x*0.166667*S(k))
    
    MPYF32 R2H、R0H、R2H ;R2H = x*(C(k)+ x*(-0.5*S (k)- x*0.166667*C(k))
    || MOV32 R4H、*+ XAR7[AR0];R4H = S (k)
    
    MPYF32 R1H、R0H、R1H ;R1H = x*(-S (k)+ x*(-0.5*C(k)+ x*0.166667*S (k)))
    || MOV32 R3H、*+ XAR6[AR0];R3H = C (k)
    
    ADDF32 R2H、R4H、R2H ; R2H =S(k)+x*(C)+x*(-0.5*S(k)-x*0.166667*C(k))
    || MOV32 R4H、*--SP ;从堆栈恢复 R4H
    
    ADDF32 R1H、R3H、R1H ; R1H=C(k)+x*(-S(k)+x*(-0.5*C(k)+x*0.166667*S(k)))
    
    MOV32. *XAR4、R2H ;*正弦= R2H
    MOV32. *XAR5、R1H ;*PtrCos = R1H
    
    LRETR 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您找到了源代码。 除了注释、以下目录中还有文档:
    C:\ti\controlSUITE\libs\math\FPUfastRTS\v100\doc

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

    考虑到 TMU:使用单指令 SINPUF32、COSPU32计算正弦和余弦。

    在 C 代码中使用时、有编译器内在函数。 例如、"sina =__sin (angle);"函数"__sin ()"未在任何标头中声明、它是编译器的内置函数。 我的测试显示 TMU 比快速补数快~2倍。 此代码执行10个"ipark)函数。 在一种情况下、这些函数通过 FPU 补充实现、在另一种情况下-使用 TMU。 周期:966 (FPU)与438 (TMU)。

    timePrev = CpuTimer2Regs.TIM.all;
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    iparkf.calc(&iparkf);
    timePost = CpuTimer2Regs.TIM.all;
    timeFPU = timePrev - timePost;
    
    timePrev = CpuTimer2Regs.TIM.all;
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    iparkf.tmuCalc (&iparkf);
    timePost = CpuTimer2Regs.TIM.all;
    timeTMU = timePrev - timePost; 

    函数在 RAM 中执行(但从闪存中调用)。

    void Tiparkf_Calc (Tiparkf* p){
    float sin a;
    float cos_a;
    sincos (p->angle、&sin a、&cos_a);
    P->DS = p->DE * cos_a - p->QE * sin a;
    P->QS = p->DE * sin_a + p->QE * Cos_A;
    }
    
    
    
    void Tiparkf_TMU_CALC (Tiparkf* p){
    float sin_a =__sin (p->angle);
    float cos_a =__cos (p->angle);
    
    P->DS = p->DE * cos_a - p->QE * sin a;
    P->QS = p->DE * SIN_A + p->QE * COS_A;
    } 

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! P.S.:FPU.h 库中的"sincons()"看起来不起作用,但结果错误。 我想是因为表格。 我应该发现更多。

    是的、在此轮距中:  

    TI 说、FPU 表是从引导 ROM 中取出的、因此 FPU.h 中的 SINCOS()不像以前那样工作。 如果要使用它、应自行上传表格。 这是由于 MCU 中的 TMU、工作速度更快。

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

    非常感谢 Disona、

    当然、我在28377上使用 TMU 完全用于 Park 计算等。

    我需要源代码来检查正弦信号是否为 TMS 28335上的项目执行模2PI。

    就 FPU 而言、您 认为使用 FAST RTS 库执行模数"2Pi 的最快方法是什么?

    我不知道“FMod”是否 成为 图书馆的一部分。  

    非常有帮助,

    谢谢你。

    PA。

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

    我将在文档中查找更多答案。

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

    我很高兴能提供帮助。 老实说、我在 FPU 或 TMU 方面不太好。 在撰写前一篇帖子之前,发现了前一篇帖子中的所有内容=)
    关于函数"fmod ()"、它说:标准"fmod "使用除法、如果您要添加具有"fast division"的 Fast_RTS 库、则"fmod "将使用该快速除法。 因此、我认为您可以使用该库和标准 Fmod。 但是、由于 TMU 可以使用一条指令执行除法、因此最好不要使用此快速库。 相反、编译器建议为 FPU 打开"宽松模式"、而不是"严格"。 这应使编译器能够尽可能插入 TMU 指令。 因此、Fmod 可能会采用 TMU 快速除法。

    但我想、还有另一种方法。 例如、如果您的半径角为 A=154.213、这与 您的半径为3、4165 (模2Pi)相同。 在 PU 中、它是3.4165/2Pi = 0.543。

    例如、如果您的半径角为 A=154.213、这与 您的半径为3、4165 (模2Pi)相同。 在 PU 中、它是3.4165/2Pi = 0.543。 由于 TMU 正弦/余弦与 PU 一起工作、这将会实现。
    但我们可以在其他序列中获得相同的结果:154.213/2PI = 24.543pu。 现在使用"modulo 1"并得到0.543 -相同的结果。 TMU 通过 3个周期指令将数字除以2Pi;它还具有3个周期指令、可将数字乘以2Pi。 FPU 有一个取小数部分的指令。

    因此、我们可能可以使用如下代码所示的 smth。 但我真的怀疑,这将比“FMod”更快。 此外,所有这些都是我的想象,必须加以验证。

    角度= 22.15;//初始角度
    =__div2pif32 (角度);//转换为 pu
    角度=__fract32 (角度);//获取小数部分
    角度=__mpy2pif32 (角度);//转换回弧度