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.

[参考译文] TMS570LS0914:HET 指令集存在占空比和周期读取问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1619947/tms570ls0914-facing-issue-with-duty-and-period-reading-with-het-instruction-set

器件型号: TMS570LS0914

  1. Pin configured : N2HET[18]
  2. 通过 HET 指令集读取 PWM 占空比和周期

    void capGetSignal(hetRAMBASE-t * hetRAM、Uint32 CAP、hetSIGNAL_t *信号)

      uint32  pwmDuty =(hetRAM->指令[(CAP << 1U)+ 25U].Data)>> 7U;
      uint32  pwmPeriod =(hetRAM->指令[(CAP << 1U)+ 26U].Data)>> 7U;

      信号->占空比 =(pwmDuty * 100U)/pwmPeriod;

      if (htRAM == htRAM1)
      {
        信号->周期=((float64) pwmPeriod * 1066.667F)/ 1000.0F;
      }
      暴露
      {
        信号->周期=((float64) pwmPeriod * 1066.667F)/ 1000.0F;
      }
    }

  3. 它正在读取正确的实时值
  4. 但无法读取零/100 占空比  
  5. 如果 CP 关闭、它仍保持之前的占空比和周期值
  6. 此处提供了指令集
  7.   /* PCNT:捕获占空比 0
      *     -说明          = 25
      *     -下一个指令       = 26
      *     -有条件的下一指令= na.
      *     -中断           =不适用
      *     -引脚              = 0
      */
      {
        /*程序*/
        0x00034E00U |(Uint32)(Uint32) 0U << 6U) |(Uint32)(0U)、
        /*控制*/
        0x00000000U、
        /*数据*/
        0x00000000U、
        /*保留*/
        0x00000000U
      }、
      /* PCNT:捕获周期 0
      *     -说明          = 26
      *     -下一个指令       = 27
      *     -有条件的下一指令= na.
      *     -中断           =不适用
      *     -引脚              = 0 + 1
      */
      {
        /*程序*/
        0x00036E80U |(Uint32)((Uint32) 0U << 6U) |(Uint32)((0U)+ 1U)、
        /*控制*/
        0x00000000U、
        /*数据*/
        0x00000000U、
        /*保留*/
        0x00000000U
      }、

 

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

    Usha,

    感谢您联系 E2E。  我需要将其重新分配给团队中的正确工程师。  请再给我们一天时间来回答您的问题。

    此致、

    Matthew

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

    尊敬的 Usha Kumari:

    我们有一个内部 AI 可以分析此器件的所有相关文档、我从其中得到了一些建议。 因此、我建议您参考这些建议一次、如果这对您没有帮助、我将尝试进一步调试您的问题。

    根本原因分析

    N2HET 模块的捕获机制似乎存在此问题。 查看指令集:

    1. 说明 25 是一条配置为捕获占空比的 PCNT 指令
    2. 说明 26 是配置为捕获周期的 PCNT 指令

    PCNT 指令用于测量活动脉冲。 当:

    • 占空比为 0%:没有上升沿可触发捕获
    • 占空比为 100%:没有下降沿来触发捕获
    • 信号关闭:不会发生转换以更新捕获值

    推荐解决方案

    1.实施超时检测机制

    void capGetSignal(hetRAMBASE_t* hetRAM, uint32 cap, hetSIGNAL_t* signal)  
    {  
        static uint32 lastPwmData = 0;
        static uint32 noUpdateCounter = 0;
        
        uint32 currentPwmData = hetRAM->Instruction[(cap << 1U) + 25U].Data;
        uint32 pwmDuty = currentPwmData >> 7U;  
        uint32 pwmPeriod = (hetRAM->Instruction[(cap << 1U) + 26U].Data) >> 7U;
        
        // Check if data has been updated
        if (currentPwmData == lastPwmData) {
            noUpdateCounter++;
            if (noUpdateCounter > TIMEOUT_THRESHOLD) {
                // No updates for too long - assume signal is off or at 0/100% duty
                signal->duty = 0; // Or determine if it should be 100 based on pin state
                signal->period = 0;
                return;
            }
        } else {
            noUpdateCounter = 0;
            lastPwmData = currentPwmData;
        }
        
        signal->duty = (pwmDuty * 100U) / pwmPeriod;
        
        if (hetRAM == hetRAM1) {  
            signal->period = ((float64)pwmPeriod * 1066.667F) / 1000.0F;  
        } else {  
            signal->period = ((float64)pwmPeriod * 1066.667F) / 1000.0F;  
        }  
    }

    2.使用附加的 HET 边缘检测说明

    修改您的 HET 程序、以包括边缘检测指令、这些指令可以识别信号何时处于高电平或低电平。

    3.添加引脚状态监控

    void capGetSignal(hetRAMBASE_t* hetRAM, uint32 cap, hetSIGNAL_t* signal)  
    {  
        uint32 pwmDuty = (hetRAM->Instruction[(cap << 1U) + 25U].Data) >> 7U;  
        uint32 pwmPeriod = (hetRAM->Instruction[(cap << 1U) + 26U].Data) >> 7U;
        
        // Check pin state directly
        uint32 pinState = (gioGetBit(hetPORT1, cap) == 1);
        
        // If period hasn't changed for X cycles and pin is consistently high/low
        if (isSignalStatic(pwmPeriod)) {
            signal->duty = pinState ? 100 : 0;
            signal->period = 0;  // Or maintain last valid period
            return;
        }
        
        signal->duty = (pwmDuty * 100U) / pwmPeriod;
        
        if (hetRAM == hetRAM1) {  
            signal->period = ((float64)pwmPeriod * 1066.667F) / 1000.0F;  
        } else {  
            signal->period = ((float64)pwmPeriod * 1066.667F) / 1000.0F;  
        }  
    }

    4.使用不同的捕获配置

    考虑修改 HET 指令以使用边沿触发的中断、该中断可以在预期时间范围内检测是否存在转换。

    --
    此致、
    Jagadish。