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.

[参考译文] UCD3138A:在谐振模式下 UCD3138A、PWM0B 有时表现良好、有时表现为高电平。

Guru**** 2526700 points
Other Parts Discussed in Thread: UCD3138ACCEVM149, UCD3138, UCD3138064, UCD3138A

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1002397/ucd3138a-ucd3138a-at-resonant-mode-the-pwm0b-sometimes-is-good-some-times-is-hi-level

器件型号:UCD3138A
主题中讨论的其他器件: UCD3138UCD3138064

您好!

我使用的是 UCD3138ACCEVM149、可用于驱动 LLC 电路。

我从培训实验3中修改了演示程序。  

通过更改 cpusample 值、我可以看到输出 PWM 信号从500kHz 变为2MHz、这正是我所期望的(PWM0模块)。

而问题是什么  

PWM0A 引脚始终正常、  

但 PWM0B 有时是良好的、有时是高电平。  

我的意思是、在500kHz ~ 2MHz 的频率下、Pwm0B 在某些频率下是良好的、但在其他频率下输出 HI 电平。

我很困惑、  

请您就原因向我提供一些建议吗?  

非常感谢!

吴晓峰

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

    您好 Xioafeng、

     您是否将 UCD3138ACCEVM149与 LLC EVM ( https://www.ti.com/tool/UCD3138ALLCEVM150 )配合使用?

    如果不知道 Lab03的更改、则很难调试该问题。 从 LLC EVM 固件开始可能更容易( https://www.ti.com/tool/UCD3138FW_LLC )。

    此致、

    Swami

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

    您好!  

    感谢您的快速回答、  

    我仅使用  UCD3138ACCEVM149、没有 EVM150。  

    n`t、当我从 UCD3138FW_LLC 开始时、由于没有适当电压的输入、它无法工作

    你的一位同事建议我从培训 LABs 开始、这就是故事。

    以下 是我的代码、请您看一下吗?

    秘书长的报告

    //######################################################################################################################
    //
    //文件:main.c
    //
    //标题:main
    //
    //注释:
    // 1)

    //######################################################################################################################
    //
    // Ver| dd mmm yyyy | WER |更改说明
    //=== =================== =========== ================================================================================================
    // 1.00 | 2021年5月5日| CH |
    //
    // Texas Instruments、Inc
    //版权所有德州仪器2008。 保留所有权利。
    //######################################################################################################################
    #define main 1.

    #include "system_defines.h"
    #include "Cyclon_Device.h"
    #include "PMBus_commands.h"
    #include "PMBus_common.h"
    #include "PMBus_topology.h"
    #include "variables.h"
    #include "functions.h"
    #include "software_interrupts.h"
    #include "cyclone_defination.h"
    #include "stdio.h"

    #define PCLK_PERIOD 4.0e-9 //基准时钟4ns、高分辨率时钟250ns
    #define PERIOD_Seconds 2e-6 //最小频率500kHz、最大周期2us
    #define 句点((int)(period_seconds/PCLK_period)<<4)// 500*16 = 8000 250ns/1
    #define EVENT1 (int)(PERIOD*0)/0
    #define EVENT2 (int)(PERIOD*0.4)// 3200 0.8us
    #define EVENT3 (int)(period*0.5)// 4000 1.0us 死区时间1 = 0.2us
    #define EVENT4 (int)(period*0.9)// 7200 1.8us 死区时间2=0.2us

    int ram_cpu_sample;
    // HyperKnob 的注释[min=0、max=255、step=8]

    void init_dpwm0 (void)

    Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 0;//针对初始化在本地禁用
    Dpwm0Regs.DPWMCTRL0.bit.CLA_EN = 1;//默认为1 -使用 CLA

    Dpwm0Regs.DPWMPRD.All =周期;//对所有值使用.all,以便缩放匹配
    Dpwm0Regs.DPWMEV1.ALL = EVENT1;//设置事件1
    Dpwm0Regs.DPWMEV2.ALL = EVENT2;//设置事件2
    Dpwm0Regs.DPWMEV3.ALL = EVENT3;//设置事件3
    Dpwm0Regs.DPWMEV4.ALL = EVENT4;//设置事件4

    Dpwm0Regs.DPWMCTRL2.bit.sample_trig_1_EN = 1;//启用1个采样触发器
    Dpwm0Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 1;//在周期结束时更新
    // Dpwm0Regs.DPWMCTRL0.bit.PWM_MODE = 0;//正常模式(这不是默认值)
    Dpwm0Regs.DPWMCTRL0.bit.PWM_MODE = 1;//谐振模式(由 WU 20210514编辑)

    Dpwm0Regs.DPWMCTRL0.bit.CBC_ADV_CNT_EN =0;//选择操作的逐周期变为0,由 WU 来执行
    //正常模式
    // 0 = CBC 被禁用(默认)
    // 1 = CBC 被启用
    //多谐振模式和谐振模式
    // 0 = PWM-A 和 PWM-B 独立运行(默认)
    // 1 =启用 PWM-A 和 PWM-B 脉冲匹配
    Dpwm0Regs.DPWMCTRL1.bit.HiRes_DIS = 0;//0 =启用高分辨率逻辑
    Dpwm0Regs.DPWMCTRL1.bit.CHECK_OVERRIDE = 0;//禁用数学检查,硬件中存在错误


    //将占空比设置为按可调频率进行滤波的稳压器
    Dpwm0Regs.DPWMCTRL2.bit.filter_Duty_SEL = 2;//(由 WU 20210517添加)
    //0最大滤波器输出提供100%占空比
    //1最大滤波器输出提供事件2占空比
    /2最大滤波器输出提供谐振占空比寄存器的值(用于 LLC)
    //3不适用

    Dpwm0Regs.DPWMPHASETRIG.bit.PHASE_TRIGGER = 0;//8nsec 相位延迟//由 WU 更改为0

    //Dpwm0Regs.DPWMSAMPTRIG1.ALL =(周期* 3)/4;//3/4周期
    Dpwm0Regs.DPWMSAMPTRIG1.ALL = 32;//(由 WU 20210517添加)

    Dpwm0Regs.DPWMPRD.All =周期;

    /* LLC 拓扑中使用寄存器谐振占空比来生成正确的滤波器占空比输出。 滤波器输出为
    乘以该寄存器即可计算滤波器占空比。 在 LLC 参考固件(UCD3138LLCEVM-028)中、它是
    设置为最大所需周期的1/2。 在本例中、位13-0用作无符号数。 更改为
    启用此模式、DPWM 必须处于谐振模式、中的 FILTER_BUITY_SEL 字段
    DPWMCTRL2必须设置为2.*/

    Dpwm0Regs.DPWMRESDUTY.bit.谐 振占空比=((周期>> 4)+ 1)>> 1;//
    //该寄存器用于 LLC 拓扑中以生成正确的滤波器占空比输出。
    //滤波器输出乘以该寄存器来计算滤波器占空比。
    //

    //作为谐振模式下的滤波器输出乘法器。
    Dpwm0Regs.DPWMCTRL0.bit.min_Duty_mode = 0;

    Dpwm0Regs.DPWMCTRL0.bit.CBC_PWM_AB_EN =1;//设置故障 CBC 是否改变 PWM-A 和 PWMB 的输出波形
    //0 = PWM-A 和 PWM-B 不受故障 CBC 的影响(默认)
    //1 = PWM-A 和 PWM-B 受故障 CBC 影响

    Dpwm0Regs.DPWMCTRL1.bit.CBC_BSIDE_ACTIVE_EN =1;//设置当 PWM-B 处于活动状态时 CBC 是否响应故障 CBC,
    //仅在多模式和重新开启模式下可用
    // 0 = PWM-A 激活时对故障 CBC 的响应(默认)
    // 1 = PWM-A 或 PWM-B 激活时对故障 CBC 的响应

    Dpwm0Regs.DPWMCTRL1.bit.global_Period_EN = 1;
    Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 1;//本地启用 DPWM0

    void init_filter0 (void)

    // CPU 样本的特殊设置-除 P 以外的所有系数均为零
    Filter0Regs.FILTERCTRL.bit.USE_CPU_SAMPLE = 1;//启用 CPU 样本

    Filter0Regs.FILTERCTRL.bit.FORCE_START = 1;//在固件控制下启动滤波器计算
    // 0 =未开始计算(默认)
    // 1 =计算开始

    Filter0Regs.CPUXN.bit.CPU_SAMPLE = 34;//设置为1/4
    ///--------------------------------------
    //实验3任务:
    //将值放在三个滤波器系数(Kp、Ki 和 Kd)和 Kalpha 上
    //-初始化 Kp,使 Xn 通过原产分支时保持不变
    //-初始化 Ki 和 Kd、因为积分和差分分支被禁用
    //-初始化 Kalpha、以便 Kalpha 极点对差分分支没有影响
    //也将值放在积分器 KDALPHA 系数上
    ///--------------------------------------
    Filter0Regs.FILTERKPCOEF0.bit.KP_COEF_0 = 0x7fff;// XN 值完全通过。
    Filter0Regs.FILTERKICOEF0.bit.KI_COEF_0 = 0;
    Filter0Regs.FILTERKDCOEF0.bit.KD_COEF_0 = 0;
    Filter0Regs.FILTERKDALPHA.bit.KD_alpha_0 = 0;


    Filter0Regs.FILTERYNCLPHI.bit.YN_CLAMP 高电平= 0x799999;// 95%最大占空比0.95us = 47.5% 500kHz
    //Filter0Regs.FILTERYNCLPHI.bit.YN_CLAMP 高电平= 0x199999;//最大占空比为20%
    //Filter0Regs.FILTERYNCLPLO。BIT.YN_CLAMP 低电平= 0x0;// 0%最小占空比
    Filter0Regs.FILTERYNCLPLO.bit.YN_CLAMP 低电平= 0x1FFFFF;// 25%最小占空比0.25us = 12.5% 2MHz

    Filter0Regs.FILTEROCLPHI.bit.output_CLAMP 高电平= 0x3FFFF;
    //Filter0Regs.FILTEROCLPHI.bit.output_CLAMP 高电平= 0x0CCCC;//最大占空比为20%
    Filter0Regs.FILTEROCLPL1.bit.output_CLAMP 低电平= 0;// 0%最小占空比

    //设置连接到滤波器的最大占空比/周期。

    Filter0Regs.FILTERCTRL.bit.PERIOD_MULT_SEL = 1;//(由 WU 20210517添加)
    用于过滤最大占空比的//输入来自 DPWM
    Filter0Regs.FILTERCTRL.bit.output_MULT_SEL = 3;

    Filter0Regs.FILTERCTRL.bit.output_scale = 0;//无移位

    Filter0Regs.FILTERCTRL.bit.FILTER_EN = 1;
    //此处启用 OK,因为在全局启用 DPWM 和前端之前不会发生任何情况

    // Filter0Regs.FILTERCTRL.bit.output_MULT_SEL = 1;//输出乘法器使用周期。


    //处理击穿的更好选择-使用全动态范围的滤波器
    // LoopMuxRegs.FILTERKCOMPA.bit.KCOMP0 =(周期/2)>> 4;// KCOMP 为4ns、周期为250ps
    // Filter0Regs.FILTERCTRL.bit.output_MULT_SEL = 0;//为输出乘法器选择半周期 kcomp

    void init_loop_mux (void)

    LoopMuxRegs.FECTRL0MUX.bit.DPWM0_FRAME_SYNC_EN = 1;//从 DPWM 0帧启用 DPWM 触发
    //同步到前端控制
    //0 = DPWM 0帧同步未路由到前端控制(默认)
    //1 = DPWM 0帧同步路由到前端控制


    //将哪个 DPWM 输出作为输入连接到滤波器
    //DPWM-0连接到滤波器以实现谐振占空比
    LoopMuxRegs.FILTERMUX.BILTER0_PER_SEL = 0;//(由 WU 20210517添加)

    //设置过滤器 KCOMP 值(这是最大周期)
    //Use value in KCOMP-0 register (使用 KCOMP-0寄存器中的值)
    LoopMuxRegs.FILTERMUX.BILTER0_KCOMP_SEL = 0;//(由 WU 20210517添加)
    用于过滤周期最大值的//输入来自环路多路复用器(KCOMP)
    LoopMuxRegs.FILTERKCOMPA.bit.KCOMP0 =(周期)>> 4;// KCOMP 为4ns、周期为250ps KCOM =周期
    LoopMuxRegs.PWMGLBPER.All=周期;

    LoopMuxRegs.DPWMMUX.bit.DPWM0_FILTER_SEL = 0;//对 DPWM 0使用滤波器0

    //将过滤器0连接到前端0
    LoopMuxRegs.FILTERMUX.BILTER0_FE_SEL = 0;//(由 WU 20210517添加)

    LoopMuxRegs.SAMPTRIGCTRL.bit.FE0_TRIG_DPWM0_EN = 1;//使用 DPWM0进行滤波器0采样触发

    void global_enable (void)

    UNION GLBEN_REG glben_store;//收集全局使能位以供同步使用
    glben_store.all = 0;
    glben_store.bit.DPWM0_EN = 1;
    glben_store.bit.FE_CTRL0_EN = 1;
    LoopMuxRegs.GLBEN = glben_store;

    void main()

    //启用 JTAG
    杂项 AnalogRegs.IOMUX.ALL = 0;

    ///-------------------------------------------------------
    //重要:阅读下面的内容,否则代码可能无法正确执行
    ///-------------------------------------------------------
    //将引脚 FAULT3接地以实现正常运行
    //将引脚 FAULT3连接到3.3V 以清除校验和
    if (GioRegs.FAULTIN.bit.FLT3_IN = 1)

    clear_integration_word_();

    #IF (UCD3138|UCD3138064)
    杂项 AnalogRegs.CLKTRIM.bit.HFO_LN_FILTER_EN = 0;
    杂散 AnalogRegs.CSTRIM.bit.ITARM_TRIM =23;//28;
    #endif

    init_PMBus (0x58);//初始化 PMBus 处理程序
    init_dpwm0 ();//初始化 DPWM0
    init_filter0();
    init_loop_mux();
    global_enable();
    RAM_CPU_SAMPLE = Filter0Regs.CPUXN.bit.CPU_SAMPLE;//初始化 HyperKnob
    for (;;)

    PMBus_handler ();
    Filter0Regs.CPUXN.bit.cpu_sample = ram_cpu_sample;//将 HyperKnob 值放入寄存器中


    //#pragma 中断(c_int00、复位)

    void c_int00 (void)

    main();

    小部分

    (二

    此致!

    小芬

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

    您好、Xiaofeng、

    感谢您提供代码。 我正在尝试重复您的问题。 让我明天检查并更新您。

    此致、

    Swami

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

    你好,Swami

    非常感谢、期待您的结果。

    此致

    小芬

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

    您好、Xiaofeng、

    我运行过您的代码很多次、但我无法重复此问题。 以下是我的结果(蓝色线为0A、黄色线为0B):

    RAM_CPU_SAples = 255:

    RAM_CPU_SAples = 0:

    您可以看到、信号看起来正常。 在我的案例中、我没有看到0B 保持高电平的实例。

    我只能考虑其他几个原因来解决这个问题:

    1.有一段代码可从死锁状态中恢复:

    //---------------------------------------------------------------------------
    // IMPORTANT: READ BELOW, OR CODE MAY NOT EXECUTE CORRECTLY
    //---------------------------------------------------------------------------
    // tie pin FAULT3 to ground for normal operation
    // tie pin FAULT3 to 3.3V to clear checksum
    if(GioRegs.FAULTIN.bit.FLT3_IN == 1)
    {
        clear_integrity_word();
    }

    如果 FAULT3未接地、则代码可以复位、看起来0B 可能会保持高电平。 您能否租赁检查 FAULT3是否接地?

    2.硬件中有一些问题。 如果您有其他 EVM、是否可以尝试它?

    此致、

    Swami

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

    您提到它在某些频率下失败、但在其他频率下失败。  您能为我们提供成功和失败的运行的准确顺序吗?  您是更改代码中的频率还是使用内存调试器?   

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

    你好、Swami

    非常感谢您的确认。 代码在您的 EVM 板上运行良好、这让我感到惊讶。

    您的问题如下:

    当然、我将 FAULT3接地、如果不接地、代码将无法输出信号。

    2.我需要花几天时间才能拿到另一个 EVMboard。

    因此、为了确认硬件问题、我想知道您是否可以向我发送在 EVM 中下载的.x0文件、这将非常有帮助。

    这里是问题的波形。

    顺便说一下、我发现了另一个问题。

    在我的情况下、即使 PWM0B 良好、死区时间看起来也是零、这也与您的结果不同。

       

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

    您好、Bower

    再次感谢您!

    我在上面的回复中粘贴了2个波形、希望它能帮助您了解我的问题。

    我始终在 UCD3xxx GUI 的存储器调试器中更改频率。

    我想知道、如果代码相同、并且硬件没有问题、那么构建配置可能是原因。  

    你有其他想法吗?

    此致!

    小芬

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

    Xiaofeng、您能告诉我一个您加载到内存调试器中、持续导致 PWMB 保持低电平的特定值、以及一个持续加载且始终有效的值吗?  这样我就不必进行搜索。  还要告诉我您要写入的寄存器。  您是写入位字段还是.all (整个寄存器)?  我不认为整体编译设置会产生效果。  除非您使用 UCD3138设置而不是 UCD3138A。  您可能需要在 CCS 中右键点击工程、然后选择"show build"设置。  单击列表顶部的常规、您将看到配置。  点击 Manage configurations、将 UCD3138A 设为活动配置并重建项目。  我不知道这是否会起作用、但如果您为 UCD3138编译、则切换到 UCD3138A 配置可能会有所帮助。   

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

    您好、Bower

    非常感谢、实际上我找到了原因。 这将感谢您对 UCD3138A 不同于 UCD3138的了解。

    然后我找到以下信息

    这意味着 UCD3138A 中的所有死区时间均由  EVENT_1决定。  因为我的代码中的 EVENT_1设置为0、 所以死区时间 Δ1~4全部为0。 这使得 PWM0A 的下降边沿与 PWM0B 的上升边沿同时出现。 时间误差将决定 PWM0B 击穿与否。

    因此、当我按如下方式修改代码时、问题得到了解决。

    #define EVENT1 (int)(周期*0.1)

    感谢您的支持!

    晓峰