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.

[参考译文] TMS320F280049C:TMS320F280049C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370403/tms320f280049c-tms320f280049c

器件型号:TMS320F280049C
主题中讨论的其他器件:C2000WARE、、、 DRV8323

工具与软件:

您好!
我将 TMS320F280049C 与 CCS v12结合使用。 我的项目基于 C2000_SDK_5_02_00_00的 is07项目 Ware_Motor。
硬件是基于 TMS320F280049C 的评估板和 DRV8323板的内部开发。 而是控制 BLDC 电机。 现在经常发生以下情况:电机以指定的速度运行、然后突然停止并且电流消耗快速增加。 如果你现在在 mainISR 中设置了一个断点、你会意识到代码不再被执行。 但是、for (;;)循环会继续运行、Timer_ISR、I2C_ISR 和模拟测量值也会更新、只有 mainISR ()不再执行。 软件序列从实验 is07中获取(PWM 触发 ADC、当 ADC SOC 就绪后、触发 mainISR)。 你是否知道如何调试这个错误(是否有 CCS 工具)、或者什么是原因?

已进行以下更改
- RX 数据的 SCI 中断例程
- I2C 中断例程
-在中断例程结束时确认 mainISR()

mainISR()

motorVars.pwmISRCount++;

//
//切换状态 LED
//
counterLED++;

#ifdef EVALBOARD
if (counterLED >(uint32_t)(USER_ISR_FREQ_Hz / LED_BLINK FREQ_Hz))

HAL_toggleLED (halHandle、HAL_GPIO_LED2);
counterLED = 0;
}
#endif
//
//确认 ADC 中断
//
// HAL_ackADCInt ( halHandle, ADC_INT_number1 );

//
//读取偏移量的 ADC 数据
//
HAL_readADCDataWithOffsets( halHandle,&adcData );


//
//强制触发 DMA 通道以保存数据
//
HAL_TRIGDlogWithDMA( halHandle, 0 );
HAL_TRIGDlogWithDMA( halHandle, 1 );
HAL_TRIGDlogWithDMA( halHandle, 2 );
HAL_TRIGDlogWithDMA( halHandle, 3 );
#endif // DATALOG_ENABLE

#ifdef _STEP_RESPONSE_EN_
//将预定义数据收集到数组中
Graph_data (&gGraphVars、&gStepVars);
#endif //_STEP_RESPONSE_EN__

//
//确认 ADC 中断
//
HAL_ackADCInt (halHandle、ADC_INT_number1);

返回;
}// mainISR()函数结束


此致

Thomas

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

    Thomas

    根据您的说明、似乎对于一个周期来说、ISR 执行时间长于 ISR 周期。 通过在函数末尾进行确认、这意味着第一次发生这种情况并且 ISR 没有及时到达此函数、则绝不会再次执行。

    我会降低 ISR 频率、缩短它、并且/或者将 ACK 移到开头。

    此致、
    Jason Osborn

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

    您好 Jason
    到目前为止、我的理解是、当触发中断时、来自该源的更多中断被禁用、然后代码跳转到 ISR、现在、如果同一个源产生更多中断、这些中断将保持挂起状态并保持禁用状态、直到中断确认到来。
    如果在 ISR 结束时触发确认、可以确保对 ISR 中的代码进行的处理不受干扰。
    当在 ISR 开始时设置确认时、可能会发生 ISR 未被处理的情况、当然、只有在 ISR 调用之间的时间短于 ISR 本身的执行时间时才会发生这种情况、实际上这不应该发生。

    所以这更多的是一个哲学问题-或者在 ISR 开始时放置确认有没有合理的优势呢?

    但在任何情况下、都不应取消或停止 ISR 的循环调用。

    此致
    Thomas

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

    您好、Thomas

    这更像是一个哲学问题吗-或者将确认置于 ISR 开头是否有合理的优势?

    然而、技术资源手册(TRM)规定应将组 ACK 放置在 ISR 末尾、这与 SDK 示例相反。

    此示例在 ISR 进入12.5µs 快速循环时清除了 ISR 并将 ACK 分组。 我们还将组 ACK 移至 ISR 末尾、类似于您的原始想法。  这种症状是否可能是由于另一个嵌套 ISR 随机干扰核心组优先级顺序? 同一 ADC 组内的 SCI 或 SPI 中断。

    BTW:仍然需要清除 ISR 的 ADC 中断顶部以停止重新进入大多数中断处理程序、在末尾处分组 ACK  

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

    Thomas and All,

    对不起,我过于简单化了,因为很容易解释——可能太多了! 问题的长而短(我理解)是 ADC 中断溢出、并且在一些已知情况下、ADC 中断溢出将导致器件无法触发额外的 ADC 中断-这种情况可能在 ADC 中断确认并同时发生下一个 ADC 中断触发时发生。

    请参阅以下器件芯片勘误表中的004x、章节标题"ADC:如果未设置 INTxCONT (继续中断模式)、中断可能会停止"

    https://www.ti.com/lit/er/sprz439h/sprz439h.pdf

    当 ack 被放置在中断开始时、这种情况变得明显不可能。 (或者、如勘误表章节标题所示、设置继续中断模式 也应避免这一特定问题。)

    此致、
    Jason Osborn

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

    首先、非常感谢、
    我‘s进一步研究了这种 (使用一些数字输出和一个示波器)、我只想知道"降低"系统所发生的情况。 事实证明、后台循环不能由 mainISR (有时)中断。 这是‘调用函数'ADC_getTemperatureC'造成的、在该函数中、会对 OPT 存储器进行两次调用(偏移和增益)。 如果你在初始化期间读取这些值一次、并且将它们保存在变量中、然后用这些变量来进行计算、那么一切都可以正常工作。

    再次感谢 ADC 中断的响应信息。 我会在开始时重新放置中断确认。
    此致
    Thomas