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.

[参考译文] AM263P4:如何触发单个 ePWM 时基模块周期、然后将其停止

Guru**** 2539500 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1538277/am263p4-how-to-trigger-a-single-cycle-of-epwm-time-base-module-and-then-stop-it

器件型号:AM263P4
主题:SysConfig 中讨论的其他器件

工具/软件:

您好:

我试图做一些听起来微不足道的事情,但我还没有成功。

例如、我希望在软件触发时从 ePWM 输出生成单个脉冲  

EPWM_setTimeBaseCounterMode(CONFIG_EPWM0_BASE_ADDR, EPWM_COUNTER_MODE_UP); 

然后、ePWM 模块应该自行创建、不带任何中断 ISR/软件交互 、返回“冻结“模式。 我不想使用任何 ISR 的原因是、本次练习的重点是消除 ISR、该 ISR 在当前实现中由计时器触发、用于切换同一引脚并生成相同的脉冲。 该 ISR 会中断应用控制逻辑、并与电机电流传感器时序相混淆。

换言之、我想使用动作限定器并仅在单个 0-TBPRD 周期内操作 ePWM 输出引脚、然后 TBCTR 应复位为 0 并保持该状态或保持在 TBPRD、直到另一个软件调用再次触发相同的行为。

是否可以通过 SYSCFG 或其他方式进行配置?  

到目前为止、我尝试过的所有操作(包括单触发全局加载配置和其他类似选项)都得到了几乎相同的结果、即三个脉冲和一个脉冲的组合。

这是我的配置:

谢谢!

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

    尊敬的 Manos:  

    我可以询问为什么不使用 GPIO 来实现这一点而不是 ePWM 吗?

    此致。
    阿克什特

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

    您好、Akshit、

    因为我不知道如何将 GPIO 设置为高电平、然后没有计时器触发的 ISR、当然也不知道如何使用计数器阻断 CPU、所以 GPIO 会自动设置为低电平、以实现特定的脉冲持续时间。

    我的要求如下:

    • 针对单个 GPIO/ePWM 输出触发单个高电平脉冲、例如 EPWM1A。
    • 该脉冲应由软件在计划中的特定时刻定期触发。
    • 软件将负责为每次脉冲迭代指定脉冲宽度。
    • 脉冲应在外设级别产生和控制、无需软件进行任何交互、例如、它不应依赖计时的 ISR 来了解何时从高电平转换为低电平。  
    • 单次触发脉冲的脉冲宽度为 10us 或 50us、由触发软件为任何特定迭代指定。

    此致、
    Manos

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

    您好:

    关于我对该主题的支持请求是否有任何更新?

    此致、

    Manos

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

    尊敬的 Manos:  

    对不起,我受伤,并在医疗假了几个星期。

    让我明天再向您提出一个解决方案。

    非常感谢您的耐心!

    此致、
    阿克什特

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

    嗨、Manos、I  

    我认为初始脉冲可能是由于从 drivers_open() 中的 sysconfig 开始的时基计数器。  

    您可以尝试将时基计数器模式设置为停止 — 冻结并在应用程序代码本身中启动计数器,而不是这样做。

    // set the counter as 0 before starting
    EPWM_setTimeBaseCounter(baseAddr, 0);
    
    // trigger the one-shot sync event
    EPWM_startOneShotSync(baseAddr);
    
    // set the counter to run as UP-COUNT mode. It will now run for exactly one period
    //    and then stop because the one-shot sync event is done.
    EPWM_setTimeBaseCounterMode(baseAddr, EPWM_COUNTER_MODE_UP);

    请告诉我、如果这不能解决问题、我们可以尝试禁用 SysConfig 中的所有全局加载设置、仅使用时基同步事件。

    此致、
    阿克什特

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

    只是保持这张票活着,因为我正在接管这个主题从 Manos。

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

    您好、Manos、  

    感谢您的耐心! 让我们尝试快速解决问题。

    通过将单次同步与冻结时基相结合、您应该能够从 ePWM 获得单个软件触发脉冲。 关键是使 TBCTR 保持停止状态、直到我们显式启动一个“周期“、然后让它在该周期结束时自动再次停止。

    - EPWMxA 的动作限定器: 将 ZRO 的输出设为高电平, 在 CMPA 上清除输出(向上计数)

    -阴影:在 ZRO 上加载 CMPA 时使用阴影。

    -禁用全局加载单次触发。

    为了确保已知的空闲、您可以在 init 时将输出强制为低电平一次:

    EPWM_forceActionQualifierSWAction(uint32_t base, EPWM_ActionQualifierOutputModule epwmOutput)

    确保计数器冻结并从已知点开始:

    EPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_STOP_FREEZE);
    EPWM_setTimeBaseCounter(base, 0);
    EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A, cmpa_ticks);
    EPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_UP);
    
    
    

    触发单次触发同步、使 TBCTR 只会运行一个周期:

    EPWM_startOneShotSync(base);

    请告诉我这是否解决了问题。

    此致、

    Masoud