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.

[参考译文] TMS320F28379D:当以 PWM ISR ()运行时、计数器随机递增

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1339170/tms320f28379d-counter-randomly-increments-when-run-withing-pwm-isr

器件型号:TMS320F28379D

您好、专家!

我正面临一个 wierd 问题,如果我在一个 PWM ISR(50 us time)内执行下面的函数, testCounterSpeedMA 会递增 多次,并且它会随机递增!
有时它会以2、11、7等增量递增。
同样的函数,如果我运行在较慢的任务,例如在一个10ms 计时器内,当速度发生变化时,它会正确地增加1。

为什么会发生这种情况?
我想从 PWM ISR 执行此函数、并且只要速度发生变化、就让计数器只递增一次。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void checkForSpeedChange(MOTOR_Vars_t *pMotor)
{
volatile static int16_t prevSpeedMA = 0;
volatile static uint16_t testCounterSpeedLoopResetMA = 0;
if(prevSpeedMA != pMotor->speedRefRPM)
{
testCounterSpeedMA++;
//Log speed change
pMotor->speedChange = true;
//Store the previous value
prevSpeedMA = pMotor->speedRefRPM;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    你好、

    您需要回答的一些初始问题:

    1. 您如何测量/观察计数器递增? 如果你将一个断点放置在那个 ISR 中、并且单步执行代码至那个断点、并且继续检查计数器变量、你仍然看到它从2跳至11等等。?
    2. 你没有看到的预期结果是什么(例如 testCounterSpeedMA 应该在每次调用 checkForSpeedChange ()时递增1 ?)
    3. ISR 是如何由 PWM 触发的? 是否在已知/一致的时间进行?
    4. 如果您能解释您的计划的性质、这也会有所帮助-您正在努力实现什么? 您是否在改变 PWM 的速度、如果是、您当前是如何操作的?

    此致、

    艾里森

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

    尊敬的 Allison:

    1、我不 使用 任何断点、我只是看到 表达式窗口中的变量并检查它递增的次数。

    2.预期的结果是当速度设定点(speedRefRPM)改变时,计数器(testCounterSpeedMA)应该只增加一次。

    speedRefRPM 由用户设置(从"Expressions"窗口中)。 例如:我们说 speedRefRPM 最初为2000、然后我将其更改为5000。 函数(checkForSpeedChange)应该检测 speedRefRPM 和使 testCounterSpeedMA 递增一次的值的变化。 再次如果我将 speedRefRPM 从5000更改为1000、 testCounterSpeedMA 应该再次递增、依此类推。

    3. PWM 中断每50微秒产生一次。(恒定时间)

    4.我基本上是试图检测,如果用户已经指示控制系统改变电机转速,并进行某些功能(数据记录, LED 闪烁等),一旦检测到速度的变化。  这里的问题是,它必须只做一次,并 验证速度的变化确实只检测一次,我一直保持计数器,以验证它是否执行一次或多次...

    如果我从 PWM ISR 内部执行该函数、则计数器会递增多次、相同的函数如果我以10ms 计时器等较慢的任务执行该函数、则计数器每次速度改变时仅正确递增一次。

    如果您需要更多信息、请告诉我。

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

    你好、

    感谢您提供有用的信息。  

    您可以在 checkForSpeedChange ()函数中设置一个断点吗? 您可以在"testCounterSpeedMA++;"行中执行此操作、这样每次变量递增时、整个程序都将停止。 通过这种方式、您 确切地知道递增是何时发生的。  

    现在、你 只希望在手工改变 speedRefRPM 值时递增 testCounterSpeedMA 变量。 因此、如果您在更改 speedRefRPM 之前运行程序并命中断点、就可以检查 speedRefRPM 和 prevSpeedMA 值、看看 它们中的一个是否以某种方式发生了改变、并导致计数器递增。  请告诉我您是否能够这样做/您是否看到任何结果。

    此致、

    艾里森

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

    尊敬的 Allison:

    我确实在  testCounterSpeedMA++行设置了一个断点,是的,它在速度变化时会增加一次以上。

    我注意到以下行为:

    如果我将 speedRefRPM 从2000更改为3000,它将正确地递增一次。

    但是、假设我将 speedRefRPM 从2000更改为10000 、然后第一次遇到断点时、 speedRefRPM 的值为2004、下一次遇到 speedRefRPM 时 变为10000、为什么会发生这种情况?

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

    你好、

    这确实是奇怪的行为。 我认为、一旦您更改了该值、它就会跳至新值、ISR 将会赶上更改。 这看起来不是与 PWM 模块相关的问题、但更像是一个算法问题。

    1. 调试时、内存浏览器中的 prevSpeedMA 值是否正确?
    2. 我能不能问您为什么使用volatile static TYPE?
    3. 如何获取 pMotor 变量?

    此致

    艾里森

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

    我发现了这个问题,奇怪! 但我比较了一个浮点变量和一个有符号的16位整数,一旦我把两者都更改为相同的类型,它工作正常。