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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1395974/tms570ls3137-when-the-coprocessor-is-used-to-output-pwm-the-waveform-is-inaccurate

器件型号:TMS570LS3137

工具与软件:

大家好、我使用 TMS570LS3137协处理器来输出 PWM 波形、代码如下:

  1. L01   PWCNT { next=L02、hr_LR=low、cond_addr=l02、en_pin_action=on、pin=20、action=PULSEHI、reg=none、data=0};
  2. L02   DJZ { next=pwm_in_Duty1、cond_addr=L03、reg=none、data=0};
  3. L03   MOV64 { next=L04、remote=l01、en_pin_action=on、cond_addr=L02、pin=20、comp_mode=ecmp、action=PULSEHI、reg=none、irq=on、data=0};
  4. L04   MOV64 { next=pwm_in_Duty1、remote=L02、en_pin_action=on、cond_addr=L03、pin=20、comp_mode=ecmp、action=clear、reg=none、irq=on、data=0};

在正常情况下、这个输出 PWM 没有问题、但是我发现如果主处理器正在改变其它 HET 引脚的输出(例如主处理器改变 HET4和 HET7引脚的输出、并且协处理器通过 HET20引脚输出 PWM)、输出 PWM 此时将是不正确的。 我使用以下代码进行了实验(协处理器代码未更改):

  1. drvSetABSyn ((FLOAT32) 0.5700 U);
  2. drvSoftwareDelayGomes(10000u);
  3. while (1)
  4.     hetREG1->DOUT &= (UINT32)(~(((UINT32) 1U) << 4));
  5.     hetREG1->DOUT |= ((UINT32) 1U) << 7;
  6.     hetREG1->DOUT |= ((UINT32) 1U) << 4;
  7.     hetREG1->DOUT &= (UINT32)(~(((UINT32) 1U) << 7));
  8. }

第一行通过修改协处理器的存储器输出占空比50%、频率700HZ PWM 波形、第二行延迟10秒、然后循环控制 HET 的第4和第7个管脚。 最终输出如下:

在黄线是 HET20引脚输出的 PWM 波形的地方、可以清楚地看到、在主处理器控制 HET 引脚前、波形没有问题、并且在控制之后 PWM 是异常的。

这种现象的原因是什么? 解决方案是什么?

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

    刘鹏先生:

    hetREG1->DOUT &= (UINT32)(~((UINT32) 1U) << 4);

    也许您认为上述说明只会影响 HET4对吗?

    实际上、上述指令将影响所有 HET 引脚。 我的意思是、上述指令将在 HET4上写入0、在所有其他 HET 引脚上写入1。

    我的意思是、例如、假设 HET20正在生成一个 PWM 波形、  并且在您执行这个指令之前、这个引脚处于逻辑低电平、如果处理器执行这个指令、它将立即强制地将 HET20拉至逻辑高电平。 这将意味着正确更改波形、我的意思是占空比也会正确变化?

    [报价 userid="584201" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1395974/tms570ls3137-when-the-coprocessor-is-used-to-output-pwm-the-waveform-is-inaccurate "]
    • hetREG1->DOUT |= ((UINT32) 1U) << 7;
    •     hetREG1->DOUT |= ((UINT32) 1U) << 4;
    •     hetREG1->DOUT &= (UINT32)(~(((UINT32) 1U) << 7));
    [报价]

    同样、这些说明也将改变 HET20波形。

    所以、在这些情况下、你不应该使用 DOUT 寄存器、而是最好使用 HETDSET (将一个引脚设定)和 HETDCLR (将一个引脚清零)寄存器。

    因此、如果您看到 HETDSET 寄存器、示例:

    您在其中写入1的位将只会被置位、其余位的状态将保持不变。

    相似地、对于 HETCLR 寄存器、你写入1的位将被清除、并且所有剩余的位将保持不变。

    ——
    谢谢、此致、
    Jagadish。

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

    hetREG1->DOUT &= (UINT32)(~(((UINT32) 1U) << 4));

    上述代码与以下代码具有相同的含义

    hetREG1->DOUT = hetREG1->DOUT &(UINT32)(~(((UINT32) 1U) << 4));

    此代码读取 hetREG1->DOUT 寄存器的状态、将 BIT4设置为0、不修改其他位的状态。 例如、BIT20之前为1、在 和之后仍然为1、1.BIT20之前为0、在和之后仍然为0。  

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

    刘鹏先生:

    此代码读取 hetREG1->DOUT 寄存器的状态、将 BIT4设置为0、并且不修改其他位的状态。 例如、BIT20之前为1、在1之后仍然为1 、1.BIT20之前为0、在 1之后和之后仍然为0。

    好的、  

    但是、这条指令涉及读-修改-写操作、对吧?

    如果在执行读取操作后引脚值发生变化、该怎么办?

    我的意思是、例如、在我们读取之前、假设 HET20为逻辑0、并且在我们读取假定之后、该值会变为逻辑1 (由于周期或占空比超时)。 但我们仍然有逻辑0、并将相同值写入 HET-20位值中、但根据 PWM、HET-20应该是逻辑1、但我们要使其成为逻辑0。  

    如果两个处理器独立工作、则会发生这种条件绕组。 因此、最好使用 HETDSET 和 HETCLR 寄存器、这些寄存器不会读取修改写入、它们只会写入为1的相应位。

    ——
    谢谢、此致、
    Jagadish。

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

    我明白了。 谢谢一百万。