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.

[参考译文] TMS320F28069F:从闪存与调试器运行时、InstaSpin 的行为有所不同

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1364091/tms320f28069f-instaspin-behaves-differently-when-running-from-flash-vs-debugger

器件型号:TMS320F28069F

大家好、
设计电动牙科手机(钻孔)。
基本上有2种模式- 1种模腔准备模式、通常高速运行、不需要太多扭矩;
另一种称为 Endo 模式,用于根管治疗(主要是根管治疗)。
我在 Endo 模式下遇到问题
有3个 Endo 功能、所有这些功能都取决于称为扭矩限制或扭矩阈值的参数。
1.自动停止-当超过扭矩阈值时停止电机。
2.自动反转-当超出扭矩限制时,它会将 Bur (我们是如何指钻头)从其所处的任何位置后退。
3.自动反转/前进-当超过扭矩限值时、将电机反转3秒钟;然后再向前运行。
扭矩阈值从最小0.3nCM 到最大3.0nCM (牛顿-厘米)不等。
速度可设置为100 rpm 到40,000 rpm 之间的任意值。
当调试器连接后、我正在从 Code Composer 中运行程序时、所有这三个功能的效果都很好。
但是、当程序作为独立器件从闪存运行时、其行为截然不同。

当我选择自动停止时:
当调试器运行时、对0.3 NCM 扭矩做出反应的最小速度为500rpm。 电机不会因施加的电压而停止
直至转速达到500rpm 或更高。 换句话说、除非电机正在运转、否则不能超过0.3Nm 的阈值
500rpm 或更快。 这不是理想的情况、但它只是电机的一个限制。 我可以忍受。

当从闪存执行代码且选择0.3nCM 作为扭矩阈值时、每个速度不仅会对施加的负载做出反应、
但停止响应仅由手柄本身提供的负载。 东西不会移动、除非我改变扭矩
限制为0.7nCM 或更高。

我可以理解系统在从调试器运行时与独立运行时的反应方式的一些差异、但这种情况有些极端。
我觉得肯定做错了事、否则模数转换所提供的值会大不相同、具体取决于代码是否
正在调试中或从闪存部署。

除了上面描述的异常之外还有另一个异常。
我们不能让训练在启动时向后运行,当它被告知前进时(反之亦然)。 我不想详细介绍
严格执行高频注入(我不认为我理解它无论如何)。
因此、我们选择了受控停止、以便电机始终在零位置或接近零位置结束。 这样、控制就知道它在哪里
并且它可以快速上升至正确的方向。
当调试器连接好并运行该展示时、效果非常好。 当我作为独立器件为系统加电时、就会得到
而是在电机启动时来回跳动。

可以帮帮我吗?
谢谢!
Dave

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

    为了进行推广-我要问的是、代码的闪存版本与 Debug 版本有何不同? 它们在文本上是相同的;它们是如何不同的行为呢? 替代方案是它们接收不同的从 A 到 D 的数据、这也没有意义(也可能不适用于上述第2个异常情况(启动时转向错误的方向))。

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

    Dave、您好!

    从调试脉冲器中移除 JTAG 并执行代码时出现不同编程行为的情况并不少见、而执行代码的速度比实时 CPU 的速度慢得多。 您所描述的听起来像是一个子或多个子例程执行得过快、或者 ISR 可能比其他子例程具有更高的优先级。 您必须使用#pragma 语句通过优化来控制您可能认为有问题的函数、从而进行确定。 实际上、C2000编译器可以通过在可疑函数上方添加的#pragma 语句、指示更改一个或多个函数的速度。 要快速放大问题、请尝试降低项目优化级别和速度。

    e2e.ti.com/.../0247.TI_2D00_C2000-Optimizing-C_2C00_C_2B002B00_-Compilers-spru514y.pdf

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

    尊敬的 Genatco:

    感谢您的建议。 当调试器不可用时、执行速度会有所不同。

    我尝试了从工程属性中大致摆弄优化级别、方法是更改优化级别以及速度与大小之间的权衡。 这没有明显的效果。

    如何使用#pragma 语句更改子例程的速度?

    谢谢!

    Dave

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

    Dave、您好!

    此语法位于上面发布的编译器指南 PDF 中。 只需将上述语句添加到可疑函数上、然后清理/编译项目。 同样的指南也可能包含在编译器版本下的"Documents"文件夹中。 BTW 是编译为 eabi 或旧版 Coff 的工程也可能存在一些意外情况、每种方法都有不同的编译器链接器开关集。

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

    尊敬的 Genatco:

    我正在使用 Coff ABI。

    不限 #pragma 语句? 或者是否有用于减慢函数的特定指令? 如果有、则在"...优化..."中并不明显 你给我发的文件。

    谢谢!

    Dave

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

    Dave、您好!

    它位于 FUNCTION_OPTIONS 内部(请参阅第6.9.14节)

    #pragma FUNCTION_OPTIONS (MyFunctionName、"-opt_level=1 --opt_for_speed=2")

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

    "我现在就要你了。"

    谢谢 Genatco!

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

    结果是完全是别的东西。 两种不同的算法正在争夺 Flag_Run_Identify。 停止电机并将其保持在"初始"位置的方案需要始终启用 Flag_Run_Identify。 但释放脚踏板后、另一个用于停止电机的功能是将其设置为 false。 不清楚这为什么独立模式与调试模式会导致不同的行为、但至少它是修复的。 感谢您的帮助。

    Dave