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.

[参考译文] UCD3138:无法正确配置寄存器

Guru**** 2382070 points
Other Parts Discussed in Thread: UCD3138, UCD3138A64, UCD3138064A, UCD3138128, UCD3138128A, UCD3138A, UCD3138FW-BIDI
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1496299/ucd3138-registers-cannot-be-configured-correctly

器件型号:UCD3138

工具/软件:

我真诚地希望您可以帮助我解决以下问题、我在配置 DPWMEV1时无法正确配置它。 将不同的值写入代码并从存储器中读取。

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

    您好:

    是在开环还是闭环中运行 UCD3138? 其他地方可能还有一些其他函数正在修改您的 DPWMEV1。  

    此外、当 DPWMEV1 = 290时、为什么 DPWMEV2 = 0? 这意味着 DPWM1A 上升沿位于 DPWM1A 下降沿之后、因此您不应该在 DPWM1A 上看到任何输出。

    此致、

    Jonathan Wong

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

    首先、感谢您的回复、我想在闭环控制模式下使用正常模式。 我看到 DPWM1B 的上升沿由 DPWMEV3-DPWMEV2控制、因此我想将 DPWMEV2设置为0。 这种控制是否合理? 谢谢你。

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

    void init_dpwm1 (void)// DPWM1B 用于驱动第一个相位

    Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 0;//全部禁用

    Dpwm1Regs.DPWMCTRL1.bit.GPIO_A_EN = 1;//立即关闭 DPWM1A
    Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN = 1;//立即关闭 DPWM1B

    //启用电流限制并设置最小占空比以进行验证。
    Dpwm1Regs.DPWMCTRL0.bit.bcbc_PWM_AB_EN = 1;//启用逐周期电流限制。
    Dpwm1Regs.DPWMCTRL0.bit.bcbc_ADV_CNT_EN=1;//正常模型  
    Dpwm1Regs.DPWMCTRL0.bit.BLANK_B_EN = 1;//启用消隐、因此我们可以看到 Curr lim、μ s 的最小脉冲
    Dpwm1Regs.DPWMCTRL0.bit.BLANK_A_EN = 1;//启用消隐、因此我们可以看到 Curr lim 的最小脉冲
    Dpwm1Regs.DPWMBLKBBEG.all =((SWITCH_FREQ_AMPLICERT/SWITCHING_FREQUENCY)<< 4)-1280;
    Dpwm1Regs.DPWMBLKBEND.all =((SWITCH_FREQ_AMPLERTER/SWITCHING_FREQUENCY)<< 4);
    Dpwm1Regs.DPWMBLKABEG.all = 0;
    Dpwm1Regs.DPWMBLKAEND.all = 0x0500;

    Dpwm1Regs.DPWMFLTCTRL.bit.B_MAX_COUNT = 2;
    Dpwm1Regs.DPWMFLTCTRL.bit.A_MAX_COUNT = 2;
    Dpwm1Regs.DPWMFLTCTRL.bit.ALL_FAULT_EN = 1;//针对 OVP、启用此功能

    Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG_1_EN = 1;//启用样本触发器1

    #if (PFC_TYPE ==交错)//这是交错 PFC
    Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 3;//三角模式
    // Dpwm1Regs.DPWMCTRL2.bit.sample_TRIG1_oversample = 0;//无过采样。
    Dpwm1Regs.DPWMCTRL1.bit.event_up_sel = 0;//update started
    #elif (PFC_TYPE == BRIDGELESS)//这是无桥 PFC
    Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 3;//三角模式
    // Dpwm1Regs.DPWMCTRL2.bit.sample_TRIG1_oversample = 0;//无过采样。
    Dpwm1Regs.DPWMCTRL1.bit.event_up_sel = 0;//update started
    #else //单相
    #if ((UCD3138A==1)||(UCD3138064A=1)||(UCD3138A64A==1)||(UCD3138A64A==1)||(UCD3138128A==1)||(UCD3138A64==1)||(UCD3138128==1))
    Dpwm1Regs.DPWMEV1.all = 132*4;//aviod 132ns 事件更新窗口
    Dpwm1Regs.DPWMEV3.all = 132*4;//aviod 132ns 事件更新窗口
    #else // non A 版本
    Dpwm1Regs.DPWMEV1.all = 290;
    Dpwm1Regs.DPWMEV2.all = 0;
    Dpwm1Regs.DPWMEV3.all = 290;
    Dpwm1Regs.DPWMEV4.all =((SWITCH_FREQ_AMPLERICE/SWITCHING_FREQUENCY)<< 4)-290;
    #endif //((UCD3138A==1)||(UCD3138064A==1)||(UCD3138A64A==1)||(UCD3138A64A==1)|(UCD3138128A==1))
    Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 1;//正常模式
    Dpwm1Regs.DPWMCTRL2.bit.sample_TRIG1_oversample = 3;//8倍过采样。
    Dpwm1Regs.DPWMCTRL1.bit.event_up_sel = 1;//在周期结束时更新
    #endif
    Dpwm1Regs.DPWMCTRL0.bit.cla_EN = 1;
    Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 1;//enable OK、因为在全局启用 DPWM 和前端之前不会发生任何情况
    }

    void SET_NEW_SWITCHING_FREQUENCY (void)

    IV.SWITCHING_PERIOD =(SWITCH_FREQ_AMPLERICER/SWITCHING_FREQUENCY)<< 4;
    Iv.period_times_2_14 = iv.SWITCHING_PERIOD << 14;
    IV.DITHER_max_period =(SWITCH_FREQ_AMPLERICER/(SWITCHING_FREQUENCY - 4))<< 4;
    IV.DITHER_MIN_PERIOD =(SWITCH_FREQ_AMPLERICER/(SWITCHING_FREQUENCY + 4))<< 4;
    Iv.DITHER_STEP =((iv.DITHER_max_period - iv.DITHER_MIN_PERIOD)<< 14)/DITHER_PERIOD;// step 表示抖动值

    #if (PFC_TYPE ==交错)//这是交错 PFC
    Dpwm1Regs.DPWMPRD.all = iv.SWITCHING_PERIOD;//新频率的新周期
    Dpwm2Regs.DPWMPRD.all = iv.SWITCHING_PERIOD;//新频率的新周期
    Dpwm1Regs.DPWMSAMPTRIG1.all =(iv.SWITCHING_PERIOD >> 1)+(iv.SAMPLE_TRIGGER_OFFSET * 4);//中途加一些、用于驱动程序延迟
    Dpwm2Regs.DPWMSAMPTRIG1.all =(iv.SWITCHING_PERIOD >> 1)+(iv.SAMPLE_TRIGGER_OFFSET * 4);//中途加一些、对于驱动程序延迟;
    Dpwm1Regs.DPWMPHASETRIG.all = iv.SWITCHING_PERIOD >> 1;下一个相位的//50%延迟
    #elif(PFC_type == single_phase )//如果这是单相 PFC
    Dpwm1Regs.DPWMPRD.all = iv.SWITCHING_PERIOD;//新频率的新周期
    //Dpwm3Regs.DPWMPRD.all = iv.SWITCHING_PERIOD;//新频率的新周期
    Dpwm1Regs.DPWMSAMPTRIG1.all = iv.SWITCHING_PERIOD -(iv.SAMPTRIGGER_OFFSET * 4);//周期结束时采样
    Dpwm1Regs.DPWMPHASETRIG.ALL = 0;//0下一个相位的延迟
    #elif (PFC_TYPE == BRIDGELESS)//这是无桥 PFC
    Dpwm1Regs.DPWMPRD.all = iv.SWITCHING_PERIOD;//新频率的新周期
    Dpwm2Regs.DPWMPRD.all = iv.SWITCHING_PERIOD;//新频率的新周期
    Dpwm1Regs.DPWMSAMPTRIG1.all =(iv.SWITCHING_PERIOD >> 1)+(iv.SAMPLE_TRIGGER_OFFSET * 4);//中途加一些、用于驱动程序延迟
    Dpwm2Regs.DPWMSAMPTRIG1.all =(iv.SWITCHING_PERIOD >> 1)+(iv.SAMPLE_TRIGGER_OFFSET * 4);//中途加一些、对于驱动程序延迟;
    Dpwm1Regs.DPWMPHASETRIG.ALL = 0;//0下一个相位的延迟
    #endif
    }

    您好、这是使用 UCD3138芯片的 DPWM1的初始配置、PFC_TYPE=单相。 根据输入电压(GPIO_A_EN 和 GPIO_B_EN=0)开启中断函数中的 DPWM1。 我想知道、如果环路配置正确并且生成了占空比、是否可以在正常模式图中获取波形? 顺便说一下、如何确定 DPWM1会触发 eADC 采样? 谢谢你。

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

    您好:

    我明天会作出回应。

    此致、

    Jonathan Wong

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

    您好:

    根据您的代码、我假设您使用 UCD3138PFCEVM-026 UCD3138FW-PFC。 PFC 示例代码配置中的 UCD3138  多模式 、非正常模式。 在多模式下、DPWMEV2和 DPWMEV4在固件中不会被设置、DPWM 下降沿由滤波器占空比决定。 UCD31xx 技术参考手册 的第36页展示了多模式的方框图。  

    例如、您可以转至 Insert →Code 并选择语言、将代码复制到 E2E 帖子中。 请参阅下面 PFC 固件中的示例 DPWM1初始化代码。

    void init_dpwm1(void) // DPWM1B is used to drive 1st phase 
    {
    	Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 0;  //disable everything
    
    	Dpwm1Regs.DPWMCTRL1.bit.GPIO_A_EN = 1; //turn off DPWM1A for now
    	Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN = 1; //turn off DPWM1B for now
    
        // Enable Current Limit and Set min duty cycle to verify.
        Dpwm1Regs.DPWMCTRL0.bit.CBC_PWM_AB_EN = 1; // Enable cycle by cycle current limit.
        Dpwm1Regs.DPWMCTRL0.bit.BLANK_B_EN = 1;      // Enable blanking so we can see a min pulse for curr lim
        Dpwm1Regs.DPWMBLKBBEG.all = 0x0000;
        Dpwm1Regs.DPWMBLKBEND.all = 0x0500;
    
    	Dpwm1Regs.DPWMFLTCTRL.bit.B_MAX_COUNT = 2;
    	Dpwm1Regs.DPWMFLTCTRL.bit.ALL_FAULT_EN = 1; //enable this for OVP
    
    	Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG_1_EN = 1; //enable sample trigger1
    
    #if(PFC_TYPE == INTERLEAVED)//if this is interleaved PFC
    	Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 3; //triangular mode
    //	Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG1_OVERSAMPLE = 0; //NO oversampling.
    	Dpwm1Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 0; //update right away
    #elif(PFC_TYPE == BRIDGELESS)//if this is bridgeless PFC
    	Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 3; //triangular mode
    //	Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG1_OVERSAMPLE = 0; //NO oversampling.
    	Dpwm1Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 0; //update right away
    #else //single phase
    #if ((UCD3138A==1)||(UCD3138064A==1)||(UCD3138A64A==1)||(UCD3138128A==1)||(UCD3138A64==1)||(UCD3138128==1))
    	Dpwm1Regs.DPWMEV1.all = 132*4; //aviod 132ns events update window
    	Dpwm1Regs.DPWMEV3.all = 132*4; //aviod 132ns events update window
    #else //non A version
    	Dpwm1Regs.DPWMEV1.all = 290;
    	Dpwm1Regs.DPWMEV3.all = 290;//aviod 72ns events update window
    #endif //((UCD3138A==1)||(UCD3138064A==1)||(UCD3138A64A==1)||(UCD3138128A==1))
    	Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 2; //multi mode
    //	Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG1_OVERSAMPLE = 3; //8X oversampling.
    	Dpwm1Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 1; //update at end of period
    #endif
    
    	Dpwm1Regs.DPWMCTRL0.bit.CLA_EN = 1;
    	Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 1; //enable OK here, because nothing will happen until DPWM and front end are globally enabled 
    }

    此致、

    Jonathan Wong

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

    您好、Jonathan Wong

    感谢您的答复。 我知道源代码配置为"多模式"、但我想实现一个在一个周期内 DPWM1A 和 DPWM1B 彼此相反的波形。 将其设置为正常模式。 如果 Filter Duty 为0、DPWM1B 是否会考虑几乎整个周期?

    此致、

    Liu

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

    您好 Liu、

    您仍需要 在出现 EVENT2和 EVENT3的周期内设置一个值。 UCD3138FW-HSFBUCD3138FW-PSFB 和 UCD3138FW-BIDI 都使用正常模式。 下面是 UCD3138FW-BIDI 的 DPWM0初始化、它基于 TIDA-00653 降压/升压设计。

    #define EVENT_2  ( DPWM_PERIOD >>2)
    #define EVENT_3   ( DPWM_PERIOD >>2 )
    
    inline init_dpwm0()
    {
    
    	    Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 0;     //disable locally for init
    		Dpwm0Regs.DPWMCTRL0.bit.CLA_EN = 1;		//default is 1 - use cla
    
    		Dpwm0Regs.DPWMCTRL0.bit.PWM_MODE = 0; //normal mode
    		Dpwm0Regs.DPWMPRD.all = DPWM_PERIOD;         //use .all for all values, make sure scaling matches.
    		Dpwm0Regs.DPWMEV1.all = (DEAD_TIME_1)+10;              //Put event 1 at start of period
    		Dpwm0Regs.DPWMEV2.all =EVENT_2;       //1/4 of period - divide is OK because it's all constants.
    		Dpwm0Regs.DPWMEV3.all = EVENT_3+(DEAD_TIME_2);       //1/2 of period
    		Dpwm0Regs.DPWMEV4.all = 10;
    		Dpwm0Regs.DPWMSAMPTRIG1.all =200 ;
    
    		Dpwm0Regs.DPWMCTRL2.bit.SAMPLE_TRIG_1_EN = 1; //enable 1 sample trigger
    		Dpwm0Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 1; //update at end of period
    
    		Dpwm0Regs.DPWMPHASETRIG.all=(DPWM_PERIOD)/4;
    		Dpwm0Regs.DPWMCTRL0.bit.MSYNC_SLAVE_EN=0;
    
    
    #ifdef HARD_SWITCHING
    		Dpwm0Regs.DPWMCTRL0.bit.MIN_DUTY_MODE=0;
    #else
    		Dpwm0Regs.DPWMCTRL0.bit.MIN_DUTY_MODE=2;
    #endif
    
    
    		//Dpwm0Regs.DPWMINT.bit.PRD_INT_EN=1;
    		Dpwm0Regs.DPWMINT.bit.PRD_INT_SCALE=5;
    
    }

    此致、

    Jonathan Wong

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

    感谢您的帮助。我将尝试设置 DPWMEV2和 DPWMEV3。