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.
您好、专家!
我正面临一个 wierd 问题,如果我在一个 PWM ISR(50 us time)内执行下面的函数, testCounterSpeedMA 会递增 多次,并且它会随机递增!
有时它会以2、11、7等增量递增。
同样的函数,如果我运行在较慢的任务,例如在一个10ms 计时器内,当速度发生变化时,它会正确地增加1。
为什么会发生这种情况?
我想从 PWM ISR 执行此函数、并且只要速度发生变化、就让计数器只递增一次。
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; } }
你好、
您需要回答的一些初始问题:
此致、
艾里森
尊敬的 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 模块相关的问题、但更像是一个算法问题。
volatile static
TYPE? 此致
艾里森
我发现了这个问题,奇怪! 但我比较了一个浮点变量和一个有符号的16位整数,一旦我把两者都更改为相同的类型,它工作正常。