请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:UCD3138A64 大家好!
我正在尝试使用 UCD3138A64芯片实现 PSFB。 目前、我们需要仅在开环模式下运行设置、并使用外部连接的 POT 或使用 UCD GUI 手动更改相移。
我还使用代码添加了死区时间、但无法获得正确的输出。 UCD 的输出似乎存在倾斜(前缘和后缘的零周期不同)。
黄色和蓝色波形分别是 DPWM0A 和 DPWM1A 的输出。 给出了一定的相移以获得大约40%的相移。 但正如红色波形(DPWM0A - DPWM1A)中所示、它是不对称的。
如果我使用50%相移(我在 DPWMPHASE TRIG 寄存器中输入了事件2值)、则输出似乎没有问题。 我将在下面附加我的代码片段。
//########################################################################### // // FILE: main.c // // TITLE: main // // NOTES: // 1) //########################################################################### // // Ver | dd mmm yyyy | Who | Description of changes // ======|=============|======|============================================== // 1.00 | 05 May 2015 | CH | // // Texas Instruments, Inc // Copyright Texas Instruments 2008. All rights reserved. //########################################################################### //Changing phase shift by hyperknob #define MAIN 1 #include "system_defines.h" #include "Cyclone_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_defines.h" #include "stdio.h" #define PCLK_PERIOD 4.0e-9 #define PERIOD_SECONDS 10.0e-6 #define PERIOD ((int)(PERIOD_SECONDS/PCLK_PERIOD)<<4) #define EVENT1 (int)(PERIOD*0.00+1000) //+2000 is deadtime added to the signal #define EVENT2 (int)(PERIOD*0.50-1000) #define EVENT3 (int)(PERIOD*0.50+1000) //+2000 is deadtime added to the signal #define EVENT4 (int)(PERIOD*1.00-1000) int temp; //int ram_event2; // comment for hyperknob [min=0, max=20000, step=1800] //step 1800=0.45us i.e. +1800 => 10% phase shift for 4.5us on time and 5.5us off time void init_dpwm0(void) { Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 0; // disable DPWM0 locally during initilization Dpwm0Regs.DPWMCTRL0.bit.CLA_EN = 0; // default is 1 (i.e. default is to use the filter output to control DPWM) Dpwm0Regs.DPWMCTRL0.bit.PWM_A_INV = 0; Dpwm0Regs.DPWMCTRL0.bit.PWM_B_INV = 0; Dpwm0Regs.DPWMPRD.all = PERIOD; // use .all for all values, so that the scaling matches Dpwm0Regs.DPWMEV1.all = EVENT1; // set EVENT 1 to 0% (start) of period Dpwm0Regs.DPWMEV2.all = EVENT2; // set EVENT 2 to 50% (start) of period Dpwm0Regs.DPWMEV3.all = EVENT3; // set EVENT 3 to 50% (start) of period Dpwm0Regs.DPWMEV4.all = EVENT4; // set EVENT 4 to 100% (start) of period //---------------------------------------------------------------------------------- // lab 2 tasks: // add initialization of DPWM events 2 through 4. // - set EVENT 2 to 25% of period // - set EVENT 3 to 50% of period // - set EVENT 4 to 75% of period Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 0; // disable DPWM0 locally during initilization Dpwm1Regs.DPWMCTRL0.bit.CLA_EN = 0; // default is 1 (i.e. default is to use the filter output to control DPWM) Dpwm1Regs.DPWMCTRL0.bit.PWM_A_INV = 0; Dpwm1Regs.DPWMCTRL0.bit.PWM_B_INV = 0; Dpwm1Regs.DPWMPRD.all = PERIOD; // use .all for all values, so that the scaling matches Dpwm1Regs.DPWMEV1.all = EVENT1; // set EVENT 1 to 0% (start) of period Dpwm1Regs.DPWMEV2.all = EVENT2; // set EVENT 1 to 0% (start) of period Dpwm1Regs.DPWMEV3.all = EVENT3; // set EVENT 1 to 0% (start) of period Dpwm1Regs.DPWMEV4.all = EVENT4; // set EVENT 1 to 0% (start) of period Dpwm0Regs.DPWMPHASETRIG.all = EVENT2*0.5; //Phase shift LoopMuxRegs.DPWMMUX.bit.DPWM1_SYNC_SEL = 0; Dpwm1Regs.DPWMCTRL0.bit.MSYNC_SLAVE_EN = 1; //---------------------------------------------------------------------------------- Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 1; // enable DPWM0 locally LoopMuxRegs.GLBEN.bit.DPWM0_EN = 1; // enable DPWM0 globally Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 1; // enable DPWM0 locally LoopMuxRegs.GLBEN.bit.DPWM1_EN = 1; // enable DPWM0 globally } void main() { // enable JTAG MiscAnalogRegs.IOMUX.all = 0; //--------------------------------------------------------------------------- // 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(); } #if (UCD3138|UCD3138064) MiscAnalogRegs.CLKTRIM.bit.HFO_LN_FILTER_EN = 0; MiscAnalogRegs.CSTRIM.bit.RESISTOR_TRIM =23; //28; #endif init_pmbus(0x58); // initialize PMBus handler init_dpwm0(); // initialize DPWM0 //ram_event2 = Dpwm0Regs.DPWMPHASETRIG.all ; // initialize hyperknob for(;;) { pmbus_handler(); //Dpwm0Regs.DPWMPHASETRIG.all = ram_event2; // put hyperknob value into register } } void c_int00(void) { main(); }
如果需要如何操作才能获得正确的输出、请提供相关指南。
谢谢你。