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.

[参考译文] TMS320F28379D:当被配置为输出时、GPIO0-GPIO5在稳定前提供瞬态脉冲

Guru**** 2589265 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1181934/tms320f28379d-gpio0-gpio5-giving-transient-pulses-before-stabilizing-when-configured-as-output

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

您好!

我在环路设置中将 TI Launchpad 用于控制台风硬件。 我在内部有一个预充电算法、它基本上比较了这两个电压、当它们相等时、它通过 GPIO1发送一个使能信号。 但是、当我这么做时、它不是从0到1的稳定转换、而是先波动、然后稳定、因为在此期间、我的接触器会打开和关闭。

当我使用其他 GPIO 时不会发生这种情况、这些 GPIO 的次要用途是用作 ePWM、如果我使用这些 GPIO、使能信号非常漂亮。 不过、我认为初始化是正确的。 我将初始化代码与此代码以及随瞬变获取的波形连接起来。

GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;  //启用 GPIO1上的上拉
 GpioDataRegs.GPASET.bit.GPIO1 = 1;  //加载输出锁存器
     GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 12; // GPIO1 = GPIO1
     GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 12; // GPIO1 = GPIO1
     GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;  // GPIO1 =输出
     GpioDataRegs.GPADAT.bit.GPIO1 = 0;  //初始关闭

 //这是我使用 GPIO1获得的使能输出

 //这是我使用 GPIO16获得的使能信号

除了 GPIO0-GPIO5、我不能使用任何其他 GPIO、因为这些是在台风 HIL 器件内部映射的唯一引脚。

我希望您能帮助我了解正在发生的情况。

谢谢。

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

    您好 Hatif、

    我注意到您要将 GPAGMUX1和 GPAMUX1位设置为12、您这么做的原因是否具体? 如果您希望 GPIO1位被选为 GPIO1、则应将这两个位都设置为00。

    此致、

    Omer Amir

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

    我得到的结果与0相同。 我刚刚用12进行测试、正如技术手册中所说的、对于 GPIO 设置、GMUX1可以是0、4、8、12。 问题仍然存在、同时保持为"0"。

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

    您好 Hatif、

    您能否提供用于更改输出值的代码? 我们无法使用 launchpad 或 controlCARD 在我们的一侧重现此问题、您是否正在使用其他特定的硬件设置?

    此致、

    Omer Amir

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

    您好!

    好的、这个部分位于 main 中(对于循环、为无穷大)

    PVen_SIG = GPIO_ReadPin (24);
    PreChargeBleeder();                                        //执行预充电和泄放算法
    GpioDataRegs.GPADAT.bit.GPIO0 = PC_en;                   //在进入中断时设置为高电平(立即用于预充电)
    GpioDataRegs.GPADAT.bit.GPIO1 = conv_en;                     //在进入中断时设置为高电平(立即用于预充电)
    GpioDataRegs.GPADAT.bit.GPIO2 = BL_EN;                      //在进入中断时设置为高电平(立即用于预充电)

    PVen_sig 是我从硬件读取的主使能信号。 我已经用示波器以及 CCS 中的调试进行了交叉检查、这一点没有问题。

    PC_EN 是 PVen_SIG 变为高电平且电容器开始充电后立即打开的信号。 PreChargeBleeder 函数基于比较电容器电压和总线电压的逻辑、一旦达到 Vbus 电压的99%、PC_en 就会关闭、conv_en 应该会打开。 除了 conv_en 信号、这是我之前连接的信号、一切都正常。 它会脉动、然后打开。 提醒一下、当使用除 GPIO0-7之外的任何其他 GPIO 时、不会发生这种脉动现象。 (到目前为止、我认为这个问题只发生在那些 GPIO 被用作 ePWM 的次要用途时。

    这是预充电器 Bleeder 函数;

    void PreChargeBleeder()

       if (PVen_SIG=1)
       {
           if (Vcap_pre>=(0.9999*debug_V_bus))
           {
              conv_en=1;
              PC_en=0;
           }
           否则、如果(VCAP_PRE<(0.9999* DEBUG_V_BUS)&&VCAP_PRE>(0.90* DEBUG_V_BUS)&& Conven_PRE=1)
           {
               conv_en=1;
               PC_en=0;
           }
           否则、如果(VCAP_PRE<(0.9999* DEBUG_V_BUS)&&Conven_PRE=0)
           {
               conv_en=0;
               PC_en=1;
           }
       }
       其他
       {
           PC_en=0;
           conv_en=0;
       }

       if (PVen_SIG=0&conv_en=0&Vcap_pre>20)
       {
           bl_en=1;
       }
       其他
       {
           bl_en=0;
       }
       conven_pre=conv_en;
       PCen_pre=PC_en;
       VCAP_PRE=DEBUG_V_CAP;

    如果您需要其他东西、请告诉我。

    再次感谢。

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

    您好 Hatif、

    如果您注释掉该函数并对 GPIO 进行硬编码以进行切换、而不是通过该函数设置该值、您能否对输出进行范围控制并查看其是否存在差异?

    此致、

    Omer Amir

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

    您好 Omer、

    是的、即使我像下面那样注释泄放函数、并将调试窗口中的 conv_en 值从0更改为1和1更改为0、我仍然看到相同的脉动响应。

    PVen_SIG = GPIO_ReadPin (24);
    //PreChargeBleeder();                                        //执行预充电和泄放算法
    GpioDataRegs.GPADAT.bit.GPIO0 = PC_en;                   //在进入中断时设置为高电平(立即用于预充电)
    GpioDataRegs.GPADAT.bit.GPIO1 = conv_en;                     //在进入中断时设置为高电平(立即用于预充电)
    GpioDataRegs.GPADAT.bit.GPIO2 = BL_EN;                      //在进入中断时设置为高电平(立即用于预充电)

    -

    哈蒂夫

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

    您好 Hatif、

    我将联系我们的设计团队、看看他们是否知道导致这种情况的原因。 因为假期即将来临、我可能无法在1月3日之前得到回复、因此如果我不立即跟进、我会道歉。

    此致、

    Omer Amir

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

    您好 Omer、

    当然。 我要等待。

    谢谢

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

    您好 Hatif、

    为了更早地说明您的 GPIO 配置、您是否已将 GPIO1的 GPAMUX1和 GPAGMUX1都设置为0x0? 我之前没有提到过、但 GPIO 复用引脚表中的 GPIO 索引只是 GPAMUX1和 GPAGMUX1值的串联、 这就是你得到一个值12的方法(由于每个寄存器只有2位宽、所以你将两个寄存器组合成'GPIO 索引')。

    此致、

    Omer Amir

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

    您好、Omer、

    是的、我将其恢复为0、12只是当我尝试不同的东西时一次。 现在它就像这样。

         GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;  //启用 GPIO1上的上拉
         GpioDataRegs.GPASET.bit.GPIO1 = 1;  //加载输出锁存器
         GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1
         GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1
         GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;  // GPIO1 =输出
         GpioDataRegs.GPADAT.bit.GPIO1 = 0;  //初始关闭

    但它不会改变响应中的任何内容。

    -

    哈蒂夫

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

    您好 Hatif、

    我与之通信的设计专家说出来了、我将在收到他们的回复后回复。

    此致、

    Omer Amir

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

    您好 Hatif、

    我已经与设计专家交谈过、 他们建议您从代码中删除以下行并重试:

         GpioDataRegs.GPASET.bit.GPIO1 = 1;  //加载输出锁存器
         GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1
         GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1

    GPASET 似乎只有在 GPADIR 为高电平时才会生效。 请告诉我、如果您仍然遇到这方面的问题。

    此致、

    Omer Amir

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

    您好 Omer、

    我只是通过这种方式尝试了它、不幸的是、相同的脉冲仍然在这里。

    -

    哈蒂夫

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

    您好 Hatif、

    我已经尝试运行以下代码来切换电路板上的 GPIO0而没有问题:

    GPIO_setPadConfig(0, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(0, GPIO_QUAL_SYNC);
    GPIO_setDirectionMode(0, GPIO_DIR_MODE_OUT);
    GPIO_setControllerCore(0, GPIO_CORE_CPU1);
    
    while(1)
    {
        GPIO_togglePin(0);
    }

    如果此代码在您的电路板上不起作用、请告诉我。

    此外、这个问题只发生在 GPIO0的第一次切换还是每次切换上? 您是否尝试在另一个 F2837xD 器件上运行代码?

    此致、

    Omer Amir

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

    您好 Omer、

    我已经尝试过、虽然我已经包含了 gpio.h 文件、但我无法使用此语法。我可以在编写此代码时看到所有定义、但在编译此代码时、它仍然会显示"未解析符号保留"错误。

    是的、前面的一个问题每次都给我这个问题、而不仅仅是第一次。 是的、我已经尝试在两个板上使用它。 我不能得到的是、为什么我只在 GPIO 1-7 (也具有 EPWM 次级作用的 GPIO)上遇到此问题。 所有其他 GPIO 均正常工作。 我无法使用这些引脚、因为这些是唯一映射到"环状设备中的台风硬件"的引脚。 这令人沮丧。

    -

    哈蒂夫

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

    您好 Hatif、

    我了解调试电路板上的问题有多困难、尤其是在其他人之前没有注意到该问题的情况下。 我将尽力帮助您了解我们是否能找到这背后的原因。

    您是否尝试从 C2000Ware 导入其中一个空项目 driverlib 示例? 如果您复制并粘贴代码以替换主函数底部的 while 循环、它应该起作用、因为它会包含您所需的所有内容。

    此致、

    Omer Amir

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

    您好 Omer、

    我尝试从 driverlib 中打开一个空项目、但问题仍然是我的代码也使用 F28x_Project.h 文件、而这些文件在该文件中不可用。 在任何情况下、语法是否如此重要? 我是说我已经尝试过2种语法、我之前向您展示的语法、我也尝试过

      //GPIO_SetupPinMux (1、GPIO_MUX_CPU1、0);
      //GPIO_SetupPinOptions (1、GPIO_OUTPUT、GPIO_异 步);

    但是、我遇到了相同的问题。 您能否尝试上述方法并告诉我您是否获得相同的结果? 在运行期间将其设置为1或0时无脉冲。

    谢谢

    -

    哈蒂夫

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

    您好 Hatif、

    请勿复制您的旧代码、仅复制我在此处发布的代码。 我之所以要求这样做、是因为我想验证这是您的代码问题还是实际硬件本身的问题。 如果您使用旧代码、我们将不知道问题的来源。 当您为器件导入一个空的 driverlib 示例时、它应该已经设置了您所需的所有内容、因此无需使用您的旧代码、除非您需要配置有关硬件的自定义内容。 您唯一需要做的就是 将 GPIO 配置为切换。

    [引用 userid="547723" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1181934/tms320f28379d-gpio0-gpio5-giving-transient-pulses-before-stabilizing-when-configured-as-output/4467986 #4467986"]

    我是说我已经尝试过2种语法、我之前向您展示的语法、我也尝试过

      //GPIO_SetupPinMux (1、GPIO_MUX_CPU1、0);
      //GPIO_SetupPinOptions (1、GPIO_OUTPUT、GPIO_异 步);

    [/报价]

    这些功能与我在配置中包含的功能基本相同。 如果您使用 driverlib 版本进行测试、但不再出现脉冲问题、我将使用这些函数重新测试、以查看原因是否存在。

    此致、

    Omer Amir

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

    您好 Omer、

    我已使用下面提供的代码进行检查、但我没有遇到问题。 响应干净且正确。

    int OutVal = 0.0;
    //
    //主函
    //
    void main (void)

       GPIO_setPadConfig (1、GPIO_PIN_TYPE_STD);
       GPIO_setQualificationMode (1、GPIO_QUAL_SYNC);
       GPIO_setDirectionMode (1、GPIO_DIR_MODE_OUT);
       //GPIO_setControllerCore (0、GPIO_CORE_CPU1);
       OutVal=0;
       while (1)
       {
           GPIO_writePin (1、OutVal);

       }

    谢谢。

    -

    哈蒂夫

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

    您好 Hatif、

    听起来不错、我将关闭此主题并将其标记为 Resolved (已解决)。

    此致、

    Omer Amir

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

    您好 Omer、

    是的。 我已将其纳入我的代码中、现在一切都正常。

    非常感谢您的大力帮助和合作。 非常感谢。

    -

    哈蒂夫