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.

[参考译文] TMS320F280025C:PWM 与放大器的过压和欠压;CMPSS

Guru**** 2454880 points
Other Parts Discussed in Thread: C2000WARE, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1339603/tms320f280025c-over-and-under-voltages-with-pwm-cmpss

器件型号:TMS320F280025C
主题中讨论的其他器件:C2000WARESysConfig

您好、支持团队、

我可以使用 COMPH 或 COMPL 来设置 PWM 有效或无效。 但是、CMPSS 的迟滞对我来说是不够的。

我想知道我是否可以使用 COMPH 和 COMPL 来进行分解并启用 PWM 以实现更大的迟滞范围?

例如:

  • ADC < 1V => PWM 引脚始终设置为低电平
  • ADC > 2V => PWM 引脚可以工作

感谢您的支持、

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

    您好,Nguyen,

    请参阅下面的软件示例以了解 c2000ware 中的参考信息

    谢谢!
    普拉森

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

    Prarthan,您好!

    谢谢你的答复。

    我阅读了示例并使用电路板进行了验证。 我想这个例子不适合我。

    您只映射 CTRIPOUTH 至 PWM 交叉开关。 CTRIPOUTL 和 COMPL 不起任何作用。 仅应用1个阈值(VDD / 2)。 我想要一个具有2个阈值的示例

    实际上、上述示例应改写为以下内容:

    //! 当一个低输入( 小于 VDD / 2 )提供给 CMPIN1P,
    //!     -跳闸信号(GPIO14)输出为低电平
    //!     - PWM7B (GPIO13)提供 PWM 信号

    此致、

    夸伊

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

    同意的问题、这只是演示如何将 cmpss 与 ePWM 配合使用来跳闸、客户可以按其应用需求进行配置。

    谢谢!

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

    您好、Prarthan、

    我不知道如何为我的应用同时使用 COMPL 和 COMPH。 这就是为什么我创建这个主题、  

    正如我在第一个岗位上所说的那样。 我已经可以使用 COMPH 或 COMPL。 您的图示是不够的

    此致、Quy

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

    您好、Qy、

    根据第一篇文章、您似乎想要根据信号输入是否低于阈值来触发 PWM 信号。

    为此、您可以设置比较器的反相、以便 compl 逻辑将支持您需要的输出

    • ADC < 1V => PWM 引脚始终设置为低电平
    • ADC > 2V => PWM 引脚可以工作
    [/报价]

    因此、可以将 DAC 的负(-)引脚输入设置为所需的阈值、并在+ of compl 下提供输入

    当您使用 COMPCTL[COMPLINV]设置倒置时,以下逻辑将适用您想要的:  

    ->输入<阈值-比较输出为1 (0原始信号反相)

    ->输入>阈值-输出为0 (1 -原始信号反相)

    足够简单?

    请尝试一下、如果您需要其他支持、请告诉我

    谢谢。

    普拉森

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

    您好,普拉森,

    我的问题的关键是何时允许 PWM 再次工作、而不是当使用 CMPSS 设置它时

    根据您的指南、我的 PWM 将按以下方式工作:

    • ADC < 1V => PWM 引脚始终设置为低电平
    • ADC > 1伏 =>允许 PWM 引脚工作

    我想知道如何使用两个 CMPSS 设置可调迟滞、而不是使用每个 CMPH/L 中的内置迟滞

    此致、Quy

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

    您好、Qy、

    感谢您的耐心等待。

    下图显示了模块之间实现所需行为的连接:

     

    要将 cmpss 模块配置为窗口比较器电路、您需要执行以下步骤:

    1. 将基准2V 和1V 分别应用于高电平比较器 CMPH (Cmp1_HP)和低电平比较器 Cmpl (Cmp1_LP)的正引脚。
    2. 对低比较器 Cmpl 使用反相模式。 此处您可以看到使用 SysConfig 将低电平比较器反相:
    3. 配置 ePWM X-Bar 以传输获取两个信号 CTRIPH 和 CTRIPL 的逻辑或、并将其连接到 ePWM 模块。 下面您可以了解如何使用 SysConfig (您需要选择 CMPSS1 CTRIPH 或 L)执行此操作:

     

     此致、

    哈迪

     

     

     

     

     

     

    要将 cmpss 模块配置为窗口比较器电路、您需要执行以下步骤:

    1. 将基准2V 和1V 分别应用于高电平比较器 CMPH (Cmp1_HP)和低电平比较器 Cmpl (Cmp1_LP)的正引脚。
    2. 对低比较器 Cmpl 使用反相模式。 此处您可以看到使用 SysConfig 将低电平比较器反相:
    3. 配置 ePWM X-Bar 以传输获取两个信号 CTRIPH 和 CTRIPL 的逻辑或、并将其连接到 ePWM 模块。 下面您可以了解如何使用 SysConfig (您需要选择 CMPSS1 CTRIPH 或 L)执行此操作:
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hadi、您好!

    感谢您的 NEAT 示例。

    如果我理解正确、您的示例就很好地展示了"输入/输出范围电压"。 这意味着

    -如果 DACL < ADC < DACH => PWM 可以工作

    -否则、=> PWM 被设置为 High/Low/...

    我们也可以使用 TRIPOUTINV 恢复它:

    -如果 DACL < ADC < DACH => PWM 设置为高/低/...

    否则、=> PWM 可以工作

    但我的问题与此略有不同:

    如果 ADC > 2V、则允许 PWM 工作

    如果 ADC < 1V、PWM 设置为高电平/低电平...

    如果1V< ADC < 2V、PWM 保持其 OLD 状态(正在工作或切换到高电平/低电平)

    这是典型的迟滞问题。

    我认为我们必须分别处理具有 PWM TRIP 4的 CTRIPH 和具有 PWM TRIP 5的 CTRIPL、并以某种方式在 PWM Tripzone 中将它们组合在一起。

    但我没有任何其他想法。

    此致、

    夸伊

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

    您好、Qy、

    如果1V< ADC < 2V,则 PWM 保持其旧状态(正在工作或切换到高/低)

    在退出 CMPSS 配置功能之前以及发生跳闸事件后、手动或自动过程中、清除跳闸区域标志非常重要。 其他 MCU 类不允许在任一 CMPSSn 上设置迟滞、怀疑 x25也是如此。 逆变器接地反弹可能导致随机跳闸事件、尤其是在低电感电机上。 添加缓冲器有助于减少误跳闸事件。 或者、您可以将事件的 PWM 消隐配置到 CMPSS 中、以避免出现峰值事件的前端周期、低于地电平的峰值可能是有问题的。 因此、范围捕捉事件以确定原因很重要、例如正尖峰和/或负尖峰。  

    此致、

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

    尊敬的 Genatco:

    谢谢你的答复。

    很抱歉我的小姐。 "如果1V< ADC < 2V、PWM 保持其 OLD 状态(正在工作或切换到高电平/低电平)"是所需的行为。

    对于 x25、我们可以将1 CMPH/L 的迟滞配置为12/24/36/48 LSB、但对于我们的应用、我们需要一个可调节的更大值。

    目前、我仅使用1个 CMPH/L、将锁存输出映射到 PWM、并使用 PWM 跳闸 ISR 实现大迟滞。 我想知道是否有其他在运行时没有软件干扰的解决方案。

    此致、

    夸伊

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

    您好、Qy、

    利用 x25,我们可以将1 CMPH/L 的迟滞配置为12/24/36/48 LSB

    不知道您指的是 LSB 的内容。 我们为预期的 ADC 跳变计数设置 DACL/H、CMPSS 输入迟滞仅具有如此大的作用。 您可以相对于±2048 ADC 计数反相输出 DACL 设置 CMPSS_DACVAL_L/H 跳闸点、将跳闸点计数设置为大于加载相电流。 这纯粹是硬件、因为 DACVAL_L/H 可以设置 PWM 标志触发高阻抗输出、也可以使其成为 L/H、无论您配置的 PWM 模块是什么。

    /*设置比较器输入的3倍迟滞*/
    CMPSS_setHysteresis (obj->cmpssHandle[cn]、3);

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

    尊敬的 Genatco:

    根据 SPRSP45B、3个迟滞对应于36LSB

    这意味着如果我理解正确的话、HW 的最大迟滞是3.3V*48/4096 = 386mV。

    此致、Quy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我理解正确,则表示硬件的最大滞后为3.3V*48/4096 = 386mV。

    似乎它取决于可以配置的最大计数 DACVAL_L/H。

    注意 通用 MCSDK 示例设置 DACL/H 初始加载值2048计数、后续代码 设置默认跳闸点。 如果故障迟滞 x4仍跳闸、您可能需要将 DACVAL_L/H 跳闸点设置为更高的值。 或者、添加缓冲电容器。 焊接在每个半桥高侧漏极到低侧源极上、可有效阻止故障跳变接地反弹。 下面的代码剪贴将在 user_mtr1h.h 中设置实际跳闸值、默认值 motor1_drive.c

    #define USER_MOTOR1_OVER_CURRENT_A      (1.5f) //! A  

    objSets->dacCMPValH = 2048U + 1024U;//设置默认正峰值
    objSets->dacCMPValL = 2048U - 1024U;//设置默认负峰值

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

    您好、Qy、

    现在、我理解您的问题。  最简单的解决方案是将 外部比较器与运算放大器配合使用并使用 GPIO、这需要更改硬件。 此外、您还可以使用可配置逻辑块(CLB)来实现您所描述的算法。

    我将请我们的 EPWM 或 CLB SME 为您提供帮助。  

    此致、

    哈迪

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

    您好、Qy、

    如果您需要帮助以实现 CLB 算法来解决此问题、请告诉我。

    谢谢!

    卢克

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

    Luke、您好!

    感谢你的帮助。

    我是 CLB 的新手、现在我正在阅读 TI 的示例和 RM。

    我想我要通过 CMPH/L 设置2个电压电平、然后将 CTRIPx 映射到 CLB 输入交叉开关。

    之后我需要找出更多模块。

    如果您能给我提供示例的图表或告诉我应该使用 CLB 的哪些子模块和配置、将会非常有帮助。

    谢谢。此致、

    夸伊

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

    您好、Qy、

    我可以提供一个示例.syscfg 文件和描述来帮助您实现该功能。 我目前正在处理多个客户问题、因此可能需要几天的时间来创建此问题。 请告诉我此问题的紧迫性、以便我为您提供所需的支持。

    谢谢!

    卢克

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

    Luke、您好!

    谢谢你的答复。 我不着急。 花点时间吧

    此致、

    夸伊

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

    您好、Qy、

    下面简要介绍了如何使用 SysConfig 中的 CLB 工具来实现此目的。 您可以将本 指南 用作特定实施的参考。 我还附加了一个代码示例、您可以将其复制并粘贴到.syscfg 文件中、作为起点:

    1. 通过全局多路复用器将您想要跳闸的 EPWM 信号馈入 CLB。 如果您同步输入、通过 CLB 传递 PWM 将会增加几个周期延迟。因此、如果您关心是否将所有 PWM 同步到同一个 SYSCLK、我建议将它们提供给 CLB。
    2. 为您希望跳闸的 ePWM 输出启用覆盖输出。 请参阅 TRM 中的 CLB 输出信号多路复用器表、确定应覆盖哪些输出。
    3. 在 SysConfig 中添加两个 CLXBAR 模块、并选择 CMPSS 跳闸信号作为输入(每个 XBAR 一个)。 启用"Auto Enable Mux Setting from Source"、使其更容易找到输入
    4. 在 CLB GUI 中、选择 CLB XBAR 作为输入(它们标记为 AUXSIGx)
    5. 在 CLB GUI 中配置一个 FSM、其中 e0选择与 CTRIPL 对应的输入、e1选择与 CTRIPH 对应的输入
    6. 在 s0字段中输入以下公式: (S0和~e0)|(~s0和 e1)...这将创建一个状态机、当 CTRIPH 为 true 时、状态将变为1、当 CTRIPH 和 CTRIPL 均为 false 时、状态将变为0。
    7. 配置与您要覆盖的 EPWM 输出相对应的 OUTLUT (您选择的 OUTLUT 取决于您启用的输出"启用先前的覆盖输出")
    8. OUTLUT 方程应该是与您的 ePWM 输出相对应的输入、并与 FSM0 s0的状态进行与运算。 这将根据您描述的算法有效跳闸您的信号。

    如果您有任何进一步的问题、请告诉我。

    /**
     * Import the modules used in this configuration.
     */
    const clb      = scripting.addModule("/driverlib/clb.js", {}, false);
    const clb1     = clb.addInstance();
    const clbxbar  = scripting.addModule("/driverlib/clbxbar.js", {}, false);
    const clbxbar1 = clbxbar.addInstance();
    const clbxbar2 = clbxbar.addInstance();
    const TILE     = scripting.addModule("/utilities/clb_tool/clb_syscfg/source/TILE", {}, false);
    const TILE1    = TILE.addInstance();
    
    /**
     * Write custom configuration values to the imported modules.
     */
    clb1.$name                       = "myCLB0";
    clb1.attachTile                  = true;
    clb1.initTile                    = true;
    clb1.enableCLB                   = true;
    clb1.inputTypeCLB_IN0            = "GLOBAL";
    clb1.synchronizeCLB_IN0          = true;
    clb1.inputsUsed                  = ["CLB_IN0","CLB_IN1","CLB_IN2"];
    clb1.inputTypeCLB_IN1            = "GLOBAL";
    clb1.globalConfigCLB_IN1         = "CLB_GLOBAL_IN_MUX_CLB_AUXSIG0";
    clb1.synchronizeCLB_IN1          = true;
    clb1.inputTypeCLB_IN2            = "GLOBAL";
    clb1.globalConfigCLB_IN2         = "CLB_GLOBAL_IN_MUX_CLB_AUXSIG1";
    clb1.synchronizeCLB_IN2          = true;
    clb1.outputsToOverridePeripheral = ["CLB_OUT0"];
    
    clbxbar1.$name           = "myCLBXBAR0";
    clbxbar1.useSourceSelect = true;
    clbxbar1.sourceSignals   = ["CMPSS1_CTRIPL"];
    
    clbxbar2.$name           = "myCLBXBAR1";
    clbxbar2.auxInput        = "XBAR_AUXSIG1";
    clbxbar2.useSourceSelect = true;
    clbxbar2.sourceSignals   = ["CMPSS1_CTRIPH"];
    
    TILE1.$name              = "TILE0";
    clb1.tile                = TILE1;
    TILE1.BOUNDARY.$name     = "BOUNDARY0";
    TILE1.LUT_0.$name        = "LUT_0";
    TILE1.LUT_1.$name        = "LUT_1";
    TILE1.LUT_2.$name        = "LUT_2";
    TILE1.FSM_0.$name        = "FSM_0";
    TILE1.FSM_0.e0           = "BOUNDARY.in0";
    TILE1.FSM_0.e1           = "BOUNDARY.in1";
    TILE1.FSM_0.eqn_s0       = "(s0 & ~e0) | (~s0 & e1)";
    TILE1.FSM_1.$name        = "FSM_1";
    TILE1.FSM_2.$name        = "FSM_2";
    TILE1.COUNTER_0.$name    = "COUNTER_0";
    TILE1.COUNTER_1.$name    = "COUNTER_1";
    TILE1.COUNTER_2.$name    = "COUNTER_2";
    TILE1.OUTLUT_0.$name     = "OUTLUT_0";
    TILE1.OUTLUT_0.i0        = "BOUNDARY.in0";
    TILE1.OUTLUT_0.i1        = "FSM_0.S0";
    TILE1.OUTLUT_0.eqn       = "i0 & i1";
    TILE1.OUTLUT_1.$name     = "OUTLUT_1";
    TILE1.OUTLUT_2.$name     = "OUTLUT_2";
    TILE1.OUTLUT_3.$name     = "OUTLUT_3";
    TILE1.OUTLUT_4.$name     = "OUTLUT_4";
    TILE1.OUTLUT_5.$name     = "OUTLUT_5";
    TILE1.OUTLUT_6.$name     = "OUTLUT_6";
    TILE1.OUTLUT_7.$name     = "OUTLUT_7";
    TILE1.HLC.$name          = "HLC_0";
    TILE1.HLC.program0.$name = "HLCP_0";
    TILE1.HLC.program1.$name = "HLCP_1";
    TILE1.HLC.program2.$name = "HLCP_2";
    TILE1.HLC.program3.$name = "HLCP_3";
    TILE1.AOC_0.$name        = "AOC_0";
    TILE1.AOC_1.$name        = "AOC_1";
    TILE1.AOC_2.$name        = "AOC_2";
    TILE1.AOC_3.$name        = "AOC_3";
    TILE1.AOC_4.$name        = "AOC_4";
    TILE1.AOC_5.$name        = "AOC_5";
    TILE1.AOC_6.$name        = "AOC_6";
    TILE1.AOC_7.$name        = "AOC_7";
    

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

    Luke、您好!

    非常感谢您提供非常详细的指南。

    这些天我在学习模块 CLB、非常确信您的指南正是我需要的。 它与用户指南 CLB 工具中的示例"4.2.2示例2–GPIO 输入滤波器"类似。

    我还有一个问题。 寄存器 CLB_LUT4_FN1_0的值是使用 CCS 自动计算的、没有用于转换的显式公式。 这是否正确?

    例如、 "示例2–GPIO 输入滤波器"中的"(~s0 & e1)|(s0 &(~e0))"转换为 CLB_LUT4_FN1_0 = 0x5555

    我需要您确认记录和评论。

    谢谢、此致。

    夸伊

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

    您好、Qy、

    我不太熟悉 CLB 寄存器本身、因为我不是 CLB 专家、我的经验主要是使用 CLB GUI 工具、这从未导致我在正确配置 CLB 寄存器时出现问题。 不过、您可以通过打开生成的 clb_config.h 或 CLB_config.c 文件来跟踪 SysConfig 生成的代码到寄存器、以查看被调用的 driverlib 函数、并在 C2000Ware 中打开这些函数的内容。  有关 GUI 如何配置寄存器的更多详细信息、我将请您咨询我们的一位 CLB 专家。

    谢谢!

    卢克

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

    您好、Qy、

    寄存器 CLB_LUT4_FN1_0的值是使用 CCS 自动计算的、没有可用于转换的显式公式。 这是对吗?

    该值由 SysConfig 中的 CLB 工具自动计算、正确。

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

    您好、Omer:

    感谢您的确认。

    此致、

    夸伊