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.

[参考译文] TMS570LS3137:PWM 捕获代码工作不正常

Guru**** 2553450 points
Other Parts Discussed in Thread: TMS570LS3137, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1288745/tms570ls3137-pwm-capturing-code-is-working-incorrectly

器件型号:TMS570LS3137
主题中讨论的其他器件: HALCOGEN

大家好!

我将 TMS570LS3137微处理器用于我们的项目。

我们必须使用 TMS570 HET 端口捕获 PWM 频率。 为此、我们使用了 Halcogen 生成的 HET 库。 但 capGetSignal 无法正常工作。 我们意识到它的工作方式是这样的:

持续测量高达特定频率的值、如下所示:

应用的 PWM 频率           捕获的 PWM 频率

90kHz 100.4kHz                                

92kHz 100.4kHz                                

96kHz 100.4kHz                                

98kHz 100.4kHz                                

99kHz 100.4kHz                                

100kHz 100.4kHz                              

102kHz 117.187kHz                              

104kHz 117.187kHz                              

106kHz 117.187kHz                              

108kHz 117.187kHz                              

110KHz                             117.187kHz

120kHz 140.652kHz                              

它似乎在特定范围内仅输出一个频率。

我们不明白为什么这段时间会这样?

我们的测试代码如下:

谢谢。

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

    您好、Ali、

    我们已开始处理您的问题、并将尽快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    很高兴能看到你

    谢谢!

    此致、

    是的。

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

    您好、Ali、

    是否可以共享该项目、可能不是原始项目、至少是有问题的示例项目?

    因为这将有助于对其进行测试和调试。

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    是的、可行。 这里是一个用于 PWM 捕获的项目。 我们使用了该示例项目。

    另一方面、我们使用示波器测量并批准生成的 PWM 信号。 但生成的信号和捕获的信号不匹配。

    谢谢!

    此致。

    是的。

    e2e.ti.com/.../PWM_5F00_Signal_5F00_Capture.zip

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

    您好、Ali、

    很抱歉我的答复出现延误。

    我被其他问题困扰着、没有足够的时间来解决这个问题。  

    您是否仍然受困于此问题?

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    没问题。 我知道你有多忙。

    是的、我仍然坚持这个问题。

    谢谢!

    此致。

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

    您好、Ali、

    我刚刚测试了条件120kHz、我得到了与您的140.6kHz 值相同的值。 我现在只是分析代码、我会尽快为您提供更新。

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    我们为此制定了临时解决方案、但我们不确定它是否能够可靠地工作。

    您能否控制这段代码? 我们用此修改了 capGetSignal 函数(将右移7更改为0)

    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) >> 0U;
    
        signal->duty   = (pwmDuty * 100U) / pwmPeriod;
        signal->period = pwmPeriod;
    }

    接下来,我们通过这个计算得到了接收频率:
    fFrequency =(((1.0F / pwmperiod)* 1000000.0F)/ 11.10F)* 1000;

    希望这对您有所帮助

    谢谢。

    此致

    是的。

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

    您好、Ali、

    您的临时权变措施是否适用于整个频率范围?

    实际上、我了解了问题的真正原因。 问题是由于 Lr (环路分辨率)时间过长造成的。

    在本例中、Lr 时间等于1.422uS。 实际上、我们看到的值不是错误的值、它们只是预期值。

    在这里、通过使用循环分辨率、 我的意思是、如果我们需要测量两个上升沿之间的周期、那么我们将在第一个上升沿后开始使寄存器值递增、并且我们在每个环路后继续使寄存器值递增、该过程将继续、直到达到另一个上升沿。

    现在、period = register_count (循环分辨率数)*一个循环分辨率周期。

    如果分析上面的公式、应该最多可能有一个环路分辨率周期误差、我的意思是

    Measured_Period =(Actual_Period)至(Actual_Period  + One_Loop_Resolution_)。

    例如、如果您尝试测量120kHz 频率 (8.33uS 周期)、那么想象一下、如果您的环路分辨率在8.29uS 处进行采样、那么它将再次在8.29 + 1.422处进行下一个采样以计算周期。

    因此、Measured_Period = 8.33至(8.33 + 1.422)

    因此、 测量值可以是 8.33uS 到9.752uS 之间的任何值

    如果您将此转换为频率、它可以在120kHz 至144.759kHz 之间。 这就是我们在测量120kHz 时达到140kHz 的原因。

    因此、测量精确频率的唯一方法是缩短环路分辨率周期。 但是、 我们仍然不能根据需要减少太多、因为循环应该有足够的时间来执行程序中最大的路径。  

    在 HALCoGen 生成的代码中、我们有58条指令、

    并且每条指令的执行频率为90Mhz、因此最小的 LRP 可能为58*(1/90Mhz)= 644nS。  

    您可以尝试以下配置:

    在某个扩展点上、它将减少误差。

    但如果您想进一步减小 HET、则应选择 HET IDE、您可以在此处生成最小代码、如下所示:

    参阅此处、我刚刚使用了3条指令来测量引脚30上波形的占空比以及周期和占空比。 由于我们只有3条指令、只需要33nS 即可执行。 在本例中、我仅配置了88nS 并执行了操作、我获得了非常准确的结果。

    我附加了代码供您参考。

    e2e.ti.com/.../PWM_5F00_Signal_5F00_Capture-_2800_2_2900_.zip

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    谢谢大家的参与。

    您的临时变通办法是否适用于整个频率范围?

    这是您正在更改的 LR 预分频参数。 此更改与我们找到的变通办法相同。 我们在没有意识到它的情况下找到了解决方案:)

    您能控制此代码吗? 我们使用此项修改了 capGetSignal 函数(将右移7更改为0)

    看看这个、我们删除了7位右移运算、并且将乘法从1422更改为11.1。 此版本的结果与将环路时间设为0的结果相同。 如下所示:

    我完全明白了。 非常感谢。

    很棒

    此致、谢谢。

    阿里