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.

[参考译文] TMS320F28027F:基于中断的霍尔传感器换向

Guru**** 2586355 points
Other Parts Discussed in Thread: DRV8323, TMS320F28027F, MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/652579/tms320f28027f-interrupt-based-hall-sensor-commutation

器件型号:TMS320F28027F
主题中讨论的其它部件:DRV8323MOTORWARE

早上好、TI 社区、

我想实现基于中断的霍尔传感器换向、以便为我的电机实现非常高的 RPM。 我将 TMS320F28027F 与 DRV8323驱动器和霍尔传感器反馈配合使用。 我已经能够为我的设置配置 lab11e、并使用在 mainISR 中采样的基于 GPIO 的霍尔传感器反馈来驱动电机。 然而、这种方法在极高的 RPM 时失败、我需要以120000RPM 的转速驱动电机。 观察我的示波器、我可以看到、当霍尔传感器状态变化和 PWM 输出变化之间存在延迟时、控制会发生分离。 为了解决这一限制、我想为这些引脚实现硬件中断并在新的 ISR (例如 HALL_ISR)中切换霍尔状态。

我们实施了一些更改来根据引脚的状态变化启用此 HALL_ISR、但我们发现上升/下降沿之间以及触发中断时(基于在 HALL_ISR 中触发 GPIO 输出引脚)存在可变延迟。 该延迟从几微秒到~20微秒不等。 lab11中可能会运行哪些其他中断、这些中断可能会延迟执行 HALL_ISR 函数? 为什么我在上升/下降沿和触发此函数之间看到可变延迟?

下面是配置 ISR 的逻辑示例。 感谢您的支持!

/*将此 GPIO 设置为 TZ 输入、以便鉴定模式可以是异步*/
GPIO_setMode (obj->gpioHandle、GPIO_Number_29、GPIO_29_Mode_TZ3_NOT);
GPIO_setExtInt (obj->gpioHandle、GPIO_Number_29、CPU_ExtIntNumber_1);
PI_registerPieIntHandler (obj->压 电式、PI_GroupNumber_1、PI_SubGroupNumber_4、&hallISR);

PIE_ENABLE (obj->压 电式);
PI_enableExtInt (obj->压 电式、cpu_ExtIntNumber_1);
cpu_enableInt (obj->cpuHandle、cpu_IntNumber_1);

GPIO_setQualification (obj->gpioHandle、GPIO_Number_29、GPIO_Qual_异 步);
GPIO_setQualificationPeriod (obj->gpioHandle、GPIO_Number_29、0);
PI_setExtIntPolarity (obj->压 电极、cpu_ExtIntNumber_1、PI_ExtIntPolarity_RisingAndFallingEdge);
PI_enableInt (obj->压 电致、PI_GroupNumber_1、PI_InterruptSource_XINT_1);

这里是我的 HALL_ISR 函数:

//! 简要介绍实现电机控制的基于霍尔传感器的 ISR。
中断空 hallISR (空)

 PI_clearInt (halHandle->压 电筒、PI_GroupNumber_1);
 GPIO_toggle (halHandle->gpioHandle、GPIO_Number_28);

此致、

Chris

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

    我们已指派 TI 工程师来帮助解决您的问题。 由于假期,答复可能会延迟。 感谢您的耐心等待。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在由 ADC 触发的 lab11x 中只启用一个中断。 对于使用霍尔传感器进行高速运行的情况、您不能使用此示例检查实验室11中的霍尔传感器输入、该实验室检查霍尔输入的 GPIO 状态。 延迟取决于 ISR 代码执行时间和 ISR 频率、可能约为20~30us。 您应该使用为霍尔输入添加一个额外的中断来立即实现换向。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yanming、

    我已经创建了一个名为 HALL_ISR 的新 ISR、该 ISR 从 XINT1、XINT2或 XINT3触发、但看起来 MAIN_ISR 具有更高的优先级(与使用 ADCINT1时的优先级一样)。 我能否将 MAIN_ISR 移至 ADCINT9以便 XINT1和 XINT2具有更高的优先级? MAIN_ISR 是否是 lab11中配置的唯一中断?

    谢谢、

    Chris

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

    早上好、Yanming、

    我已经将 mainISR 移到了 ADCINT9、但它看起来仍然比 XINT1和 XINT2具有更高的优先级。 查看我的示波器,我可以看到在 ADCINT9/mainISR()完成之前,不会调用 XINT1中断函数。 您能否提供一些指导、说明为什么我看不到适当的优先级? 我已经复制了 hal.c 的部分、在这里我实现了从 ADCINT1到 ADCINT9的更改。 是否需要在不同的 CPU 优先级中设置它们、或者它们具有不同的 PIE 组优先级是否足够?

    //! \brief     初始化中断矢量表

    //! \details   将 ISR 指向函数 mainISR。

    //! \param[in] 处理 硬件抽象层(HAL)句柄

    静态 内联  void  HAL_initIntVectorTable (HAL_Handle handle)

      HAL_Obj * obj =(HAL_Obj *)句柄;

      PIE_Obj * PIE =(PIE_Obj *) obj->压 电式;

     

     

     ENABLE_PROTECTED 寄存器_WRITE_MODE;

     

    /* JCMII */

    #ifndef USE_ADCINT9

     PIe->ADCINT1 = mainISR;

    其他

     PIe->ADCINT9=mainISR;

    #endif

     

     disable_protected_register_write_mode;

     

      返回;

    } // HAL_initIntVectorTable()函数结束

     

     

    void  HAL_enableAdcInts (HAL_Handle handle)

      HAL_Obj * obj =(HAL_Obj *)句柄;

     

      //启用与 ADC 中断相关的 PIE 中断

    /* JCMII */

    #ifndef USE_ADCINT9

     PI_enableAdcInt (obj->压 电式、adc_IntNumber_1);

    其他

      PI_enableAdcInt (obj->压 电式、adc_IntNumber_9);

    #endif

     

      //启用 ADC 中断

    /* JCMII */

    #ifndef USE_ADCINT9

     adc_enableInt (obj->adcHandle、adc_IntNumber_1);

    其他

      adc_enableInt (obj->adcHandle、adc_IntNumber_9);

    #endif

     

      //为  ADC 中断启用 CPU 中断

    /* JCMII */

    #ifndef USE_ADCINT9

     cpu_enableInt (obj->cpuHandle、cpu_IntNumber_10);

    其他

      cpu_enableInt (obj->cpuHandle、cpu_IntNumber_1);

    #endif

     

      返回;

    } // HAL_enableAdcInts()函数结束

     

     

     

    void  HAL_setupAdcs (HAL_Handle handle)

    //配置中断源

    #ifndef USE_ADCINT9

     adc_disableInt (obj->adcHandle、adc_IntNumber_1);

     adc_setIntMode (obj->adcHandle、adc_IntNumber_1、adc_IntMode_ClearFlag);

     ADC_setIntSrc (obj->adcHandle、ADC_IntNumber_1、ADC_IntSrc_EOC7);

    其他

      adc_disableInt (obj->adcHandle、adc_IntNumber_1);

      adc_disableInt (obj->adcHandle、adc_IntNumber_9);

      adc_setIntMode (obj->adcHandle、adc_IntNumber_9adc_IntMode_ClearFlag);

      ADC_setIntSrc (obj->adcHandle、ADC_IntNumber_9ADC_IntSrc_EOC7);

    #endif

     

     

     

    中断   mainISR ()

    //确认 ADC 中断

    #ifndef USE_ADCINT9

     HAL_acqAdcInt (halHandle、ADC_IntNumber_1);

    其他

     HAL_acqAdcInt (halHandle、ADC_IntNumber_9);

    #endif

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有一个非常基本的问题、就是中断是否可以被其他中断(?)中断。 根据我的理解、如果该中断具有更高的优先级、则可以中断 mainISR。 例如、如果我将 ADCINT8和 CPU 中断10用于主 ISR、将 XINT1用于我的 hallISR、我是否能够中断主 ISR?

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

    尊敬的 Chris:

    默认情况下、不会完成中断嵌套。  但是、这是可能的-但在较低优先级 ISR 中需要一些额外的代码行。  请参阅以下 Wiki 文章:
    http://processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x

    本文使用连接寄存器的位字段方法与 Motorware 函数、但应该可以将该概念转换为 motorware 样式的代码。

    如果不是、您可能还需要考虑在 PWM 中进行寄存器更新的立即模式。

    希望这对您有所帮助!


    谢谢、
    Brett

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

    您好、Brett、

    谢谢你。 这正是我们需要实现的目标。 我们进行了更改、并使嵌套 mainISR 和 hallISR 正常工作。

    您能否为 PWM 中的寄存器更新提供有关立即模式的参考或更多详细信息? 我不熟悉这种方法。

    此致、

    Chris

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

    您好、Brett、

    另一个问题是、在我们的 hallISR 函数中设置 PWM 占空比后、我们会看到异常事件。 似乎两个通道的占空比设置正确、第三个通道设置为零、但在一段可变的时间段后、第三个通道也开始发送 PWM 数据。

    示波器 TEST 引脚上的顶部信号代表霍尔转换状态、您可以看到 PWM 占空比在这些转换时发生了正确变化。 奇怪的事件是、经过许多微秒后、它似乎恢复到其先前的 PWM 状态(在下一次霍尔转换之前、并调用 hallISR 函数)。 任何关于重新设置 PWM 输出的想法。 我们非常密切地跟踪了代码、找不到项目中设置 PWM 输出的任何其他地方。

    感谢您的反馈!

    此致、

    Chris

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

    尊敬的 Chris:

    我相信您看到的是使用影子模式而不是 ePWM 的立即模式的结果。  使用影子模式将使写入许多 ePWM 寄存器的操作仅发生在特定事件上、例如当 ePWM 的计数器达到0时-这可能不是您在这里想要的。  影子模式的优势在于确保所有寄存器写入同时生效(有助于确保不发生击穿情况等)、因此您现在可能需要更加注意代码中写入之间的距离。

    '02x/'03x ePWM 用户指南中详细介绍了这些功能-您需要触摸的寄存器也是如此:
    http://www.ti.com/product/TMS320F28027F/technicaldocuments#doctype6

    希望这对您有所帮助!


    谢谢、
    Brett

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

    尊敬的 Chris:

    我将假定我在上一帖子中的评论有助于解决该问题。  如果没有、请随时回复。


    谢谢、
    Brett

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

    您好、Brett、

    在主循环中最终出现了一行代码,在这里它启用了 PWM,并步进了我们对 halisr()函数的更改。 感谢您在这个问题上的所有帮助。 对线程重新进行优先级排序对改进我们的控制方法大有帮助。

    此致、

    Chris