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.
大家好、
我正在查找要在 TMS320F28335上使用的 C28x FPU fastRTS 库中有关 SINCOS 函数的文档。
源代码是否可用?
我想知道它是如何工作的。 表、功能.. 是否需要将角度介于0和2*Pi 之间...
对于要在 TMS320F28377X 上使用的 TMU 模块的 SINUS 和 Cosinus fuion,还有同样的问题。
任何基准测试、文档都将不胜感激。
谢谢!
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
考虑到 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。
我很高兴能提供帮助。 老实说、我在 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 (角度);//转换回弧度