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.

[参考译文] LAUNCHXL-F280049C:ePWM ADC SOCA 触发计数失败。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1113877/launchxl-f280049c-epwm-adc-soca-trigger-counts-fail

器件型号:LAUNCHXL-F280049C
Thread 中讨论的其他器件:SysConfig

您好!

ADC SOC 由源 ePWM 通过 CMPD 计数匹配触发、与 ISR 抽取时间相比没有时间限制。 将 CMPD 配置为匹配 ADC EOC 触发的 TBPRD 计数的代码对 ISR 空闲执行时间5µs 增加到25µs μ s 没有影响。 为250µs 匹配计数设置已配置的最小 SOCA 触发时间。 奇怪的是、TRM 图18.4.18-4 CTR=PRD 未显示内部视图、SOCA 如何成为任何 SOC#的 ADC EOC 的触发源。  

请参阅以下代码、在为 CMPD 配置的任何间隔匹配计数中、SOCA 不会触发 SOC 的 EOC。 25µs CMPD 2500匹配计数、SOCA 仍会触发 ADC EOC 以实现5µs 空闲、完全激活。 ISR 的250µs μ s 时间应受触发 ADC SOC 的 CMPD 的限制。 GPIO 抽取脉冲宽度(150µs μ s)、但包括 ISR 循环之外的死区时间、GPIO 脉冲是高电平有效周期。   

/*清除 ePWM 触发中断*/
ePWM_DisableInterrupt (obj->pwmHandle[0]);

//为周期设置 CMPD 影子加载  
EPWM_setCounterCompareShadowImage LoadMode (obj->pwmHandle[cnT]、
ePWM_COUNTER_COMPARE_D、
ePWM_COMP_LOAD_ON_CNTR_PERIOD);//ePWM_COMP_LOAD_ON_CNTR_ZERO

//设置 EPWM1触发脉冲,TBCTR=50µs μ s*5 μ s 或250µs 25µs μ s*1 CMPD-D
//设置事件触发器选择寄存器(ETSEL)
ePWM_setADCTriggerSource (obj->pwmHandle[0]、ePWM_SOC_A、ePWM_SOC_TBCTR_D_CMPD);

//启用 EPWM1以触发 ADC0采样事件
ePWM_enableADCtrigger (obj->pwmHandle[0]、ePWM_SOC_A);


//清除 INT 标志和事件触发器清除寄存器(ETCLR)
ePWM_clearEventTriggerInterruptFlag (obj->pwmHandle[0]);
ePWM_clearADCTriggerFlag (obj->pwmHandle[0]、ePWM_SOC_A);

//为 ADC 触发器写入值(20kHz SOC_Int*5TBCTR= 250µs μ s、1周期= 50µs μ s)
ePWM_setCounterCompareValue (obj->pwmHandle[0]、ePWM_COUNTER_COMPARE_D、5);

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

    您好!

    很抱歉耽误你的回答。 我已将您的问题转交给专家。 请耐心等待。

    此致、

    Aditya

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

    很抱歉、我找不到一个明确的问题。 您的 SOCA 未在 CMPD 上触发?

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

    你好 NEMA

    问题是、根据源 CNT=PRD 或源 CMPD、用于通过 SOCA 触发 ADC 的匹配计数 CMPD 实际上不起作用。

    至少在 CMPD 50µs 匹配计数的正确周期时间内、似乎不会触发 ADC。  当(TBCTR= 250µs 50µs μ s)周期时、甚至无法通过源时基子模块(CNT=PRD)触发为 μ s 设置的 SOCA。 下面的驱动程序库函数不会限制 SOCA 触发周期性计时。 设置 CMPD 匹配计数 >5对 EOC 寄存的 ISR 时间没有影响。 此外、设置 CMPD 比较2500匹配计数、但 ADC 触发源 SOCA 周期性 ISR 抽取时间从不会扩展到250µs μ s、它仍然是一个25µs μ s 脉冲周期。  

    为什么定期触发时间 SOCA 到 ISR 不会随匹配计数值的变化而变化?

    //设置 EPWM1触发脉冲,TBCTR=50µs μ s*5 μ s 或250µs 25µs μ s*1 CMPD-D
    //设置事件触发器选择寄存器(ETSEL)
    ePWM_setADCTriggerSource (obj->pwmHandle[0]、ePWM_SOC_A、ePWM_SOC_TBCTR_D_CMPD);// ePWM_SOC_TBCTR_PERIOD

    //为 ADC 触发器写入值(20kHz SOC_Int*5TBCTR= 250µs μ s、1周期= 50µs μ s)
    ePWM_setCounterCompareValue (obj->pwmHandle[0]、ePWM_COUNTER_COMPARE_D、5)

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

    您能否将 ADC 触发信号输出到 GPIO 以查看它是否实际上是触发信号?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="280106" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/111387/launchxl-f280049c-ePWM-ADC-SOCA-trigger-counts-fail/4131271#4131271"]您是否可以将 ADC 触发信号输出到 GPIO 中或引用不是触发信号?]

    ADC ISR 具有 GPIO 跟踪、用于确认 SOCA 被触发、但不是以下面配置的频率触发。 ADC 时钟为50MHz、ePWM 模块为100MHz。 SOCA 触发周期应该由 ePWM 周期(20kHz)或者 通过 CMPA TBPRD 25µs 向上、25µs 向下推导而来。  

    将 CMPD 设置为25到2500匹配计数不会改变 ADC 触发 ISR 抽取、SOCA 保持运行时25µs μ s。 CCS 调试寄存器视图验证 CMPD 是否具有匹配计数、但触发周期 SOCA 与 CMPD 无关、而是似乎通过 CMPA 触发。   

    //为 ADC 触发器写入值(20kHz SOC_Int*5TBCTR= 250µs μ s、1周期= 50µs μ s)
    ePWM_setCounterCompareValue (EPWM1_base、ePWM_COUNTER_COMPARE_D、2500)

    对于3个发生器的循环[cnT]加载、影子加载 CMPD 调用可能不起作用?

    //设置 CMPD 影子加载打开周期  
    EPWM_setCounterCompareShadowImage LoadMode (obj->pwmHandle[cnT]、
    ePWM_COUNTER_COMPARE_D、
    ePWM_COMP_LOAD_ON_CNTR_PERIOD);//ePWM_COMP_LOAD_ON_CNTR_ZERO   

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

    另一个问题是电机控制 SDK hal.c 将 CMPD 配置为 ADC 触发源。 下面的代码从 SOCA 触发的 ISR 中摘录调用、将 SOCA 触发源计数设置为1。 SOCA 触发器更改 CMPC 对 Instaspin 抽取约束进行了定义 USER_NUM_PWM_TICKS_PER_ISR_TICK 3.  

    //初始化电机1的 PWM 句柄
    obj->pwmHandle[0]= EPWM1_base;

    ePWM_setInterruptEventCount (obj->pwmHandle[0]、3);
    ePWM_setADCTriggerEventPrescale (obj->pwmHandle[0]、ePWM_SOC_A、3);

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

    您能否尝试使用 SysConfig 对此进行设置、以查看生成的代码是否与您的代码不同。 我认为这应该是一个小的编码错误。

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

    对于电机控制 HAL.c 文件、请启动新线程并提及您正在使用 MCSDK。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="280106" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/111387/launchxl-f280049c-ePWM-ADC-SOCA-trigger-counts-fail/4135345#4135345"]对于电机控制 HAL.c 文件、请提及您正在使用新的 MCSDK/thread [引用]。

    显然、硬件在驱动程序库影子调用方面存在问题。  SDK 项目不是问题、而是由 driverlib 调用引起的系统失效。 上述调用在 SOCA 触发 ADC 和 ePWM 中断计数时不起作用。 代码无法通过针对 ADC 触发间隔的 SOCA 中断来控制 EOC。

    [~ userid="280106" URL"/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/111387/launchxl-f280049c-ePWM-ADC-SOCA-trigger-counts-fail/4135344#4135344"]如果您的代码与 SysConfig 生成的代码不同、您是否可以尝试使用此代码进行设置。 [/报价]

    这将如何证明 driverlib 调用(如下所示)对于硬件触发配置是否有效?

    PWM 中断计数与触发 ADC 之间的时间受 TBPRD 周期的设置限制、无法将 SOCA 事件链接到 ePWM 发生器中断计数。 这可能是硬件问题、也可能只是 driverlib 调用的 EPWM 违规、这些调用不在通过 Time Base、Actions Qualifier 子模块触发的 SOCA 计数的同一控制范围内。

    driverlib 方法 (如下所示)用于累加 ePWM 中断间隔、以便在所有 PWM 发生器中禁用 ADC 的 SOCA 触发。 也就是说、当 ePWM 中断被禁用、从不配置且从不重新启用时、如何计算这些中断? 这甚至是驱动程序库调用应该执行的操作、还是完全执行其他操作? 我怀疑 ePWM 动作限定符子模块不能对禁用的中断进行计数是一种编码违反。 然而、事件触发子模块生成 EPWMxINT 中断或通过 CMPD 对 SOCA 事件进行计数。  

    /*清除 ePWM 触发中断*/
    ePWM_DisableInterrupt ( EPWM1_base);
    ePWM_DisableInterrupt ( EPWM2_base);
    ePWM_DisableInterrupt ( EPWM4_base);

    ePWM_setInterruptEventCount ( EPWM1_BASE、3);
    ePWM_setADCTriggerEventPrescale (EPWM1_BASE、3);

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

    事件触发子模块 TRM 18.10图18-45、18-46、18-47中讨论了通过 TBPRD 或 CMPD 触发的 ADC 的中断计数。 ETFRC[INT]位将使 INT[CNT]递增、当 INTCNT=INTPRD (μ 250µs)时需要清零。  下面是 driverlib 函数(ePWM.h)清除 INT[CNT]和 ADC 触发标志寄存器。 我曾在生成的 ISR 末尾处将这些添加到 ISR 清除 ACK 组中、但它不会增加计数。

    /*清除 EPWM1事件触发寄存器标志(ETCLR)*/
    ePWM_clearEventTriggerInterruptFlag (EPWM1_BASE);
    ePWM_clearADCTriggerFlag (EPWM1_base、ePWM_SOC_A);

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

    禁用 ePWM 中断会使 SOCA 事件触发中断驱动程序(图18-46)变得有点复杂。 SOCA 计数驱动器模式(图18-47)通过以下调用产生300µs μ s 触发转换。 尽管图18-46标签(ETCN)在实际的 driverlib 调用(在上面发布)和正在为中断触发设置的调试寄存器位的情况下看起来有点奇怪。

     在给定上述 driverlib 调用的情况下、如何清除 EPWMxINT ETFLG[INT](图18-46)中断或在未启用 EPWM 中断的情况下触发 ADC?

    如果中断被禁用、ETSEL[INTEN]= 0、或者中断标志被置位、ETFLG[INT]= 1、当 计数器达到周期值 ETPS[INTCNT]= ETPS[INTPRD 时、计数器停止计数事件

     /*设置 ADC 触发事件计数*/
    ePWM_setADCTriggerEventCountInitValue (EPWM1_base、ePWM_SOC_A、6);

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

    INTSELCMP 为0、它使用 CMPB 而不是 CMPD。

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

    您的 SOCASELCMP 也是如此。 如果未将其设置为1、则 CMPD 如何通过?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="280106" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/111387/launchxl-f280049c-ePWM-ADC-SOCA-trigger-counts-fail/4138072#4138072"]您的 SELCMP 为0,而不是使用 INTCMP[]。

    配置 计数模式时、中断被禁用。 这是中断模式禁用 ePWM 中断的程度。 然而、CMPD 已配置并触发 ADC 转换、但我明白您的观点、为什么寄存器为0x0?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="280106" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/111387/launchxl-f280049c-ePWM-ADC-SOCA-trigger-counts-fail/4138073#4138073"]如果未将其设置为1、则如何通过引用 CMP[/CMPD]进行传播?

    ETSEL (SOCASELCMP)在递减计数模式0x111中被使能 CMPD。 对我来说、配置使用具有禁用 ePWM 中断的中断触发模式是没有意义的。 有 driverlib 注释中断模式 EPWMnINT 只能触发3个计数。 计数模式可触发1-15个计数的整个范围。

    至于 SOCASELCMP 为0x0将再次检查寄存器、它可能是 CMPD 匹配计数的调试刷新周期处于活动状态。

    另请注意、SOCASEL 设置为 CTR=PRD 0x010、CMPD 向下计数零上的影子加载。  似乎我选择了 TBCTR=CMPD 而不是 TBCTR=ZERO。

    EPWM_setCounterCompareShadowImage LoadMode (EPWM1_BASE、
    ePWM_COUNTER_COMPARE_D、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);

    //设置事件触发器选择寄存器(ETSEL)
    ePWM_setADCTriggerSource (EPWM1_base、 ePWM_SOC_A、ePWM_SOC_TBCTR_D_CMPD);

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

    寄存器似乎是反向 CCS 调试;ETSEL:SOCASEL 和 SOCASELCMP。 也许即使是 driverlib 调用也会设置错误的寄存器位。

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

    我不认为 driverlib 会设置错误的寄存器。 更新寄存器值是否解决了这个问题?

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

    图18-47 ETSEL[SOCASELCMP]是寄存器 ETSEL 中的二进制位(1/0)、具体取决于 选择的 SOC A/B。 因此、与图18-47相比、调试视图有点令人困惑。 检查 TRM 寄存器的 ETSEL 位位置似乎 CCS 调试(红色框)正确(0xF10)。 不确定为什么中断发生 器模式在 CCS 寄存器视图中没有 CMPD 源。

    SOCASELCMP 仅是二进制位位置4、因此它必须是中断发生器模式、从而使 CMPB 匹配、尽管它未配置。  

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

    是的、您可能有另一个函数调用将此设置覆盖回零。

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

    脉冲发生器模式非常适合 ADC SOC 触发、即使 ETFLG [SOCA]是锁存脉冲继续。 Driverlib 调用提到了1-15个最大输入值、但它会将输入保持移位、最终导致存储在寄存器 ETCNTINIT 中的30个触发计数。   

    与清除中断 ETCLR[INT]相比、清除脉冲发生器 ETCLR[SOCA]也可能更好。 当 EOC 脉冲矢量进入 ISR 时、我试图找出导致电机暂时停止的原因。 奇怪的是、在前300ms 抽取脉冲之后会发生失速、因为 ISR 在循环时返回到启动状态。 循环会将全局更新发布到 CCS 调试监视窗口 Java 脚本并检查其他限制。

x 出现错误。请重试或与管理员联系。