工具/软件:
我真诚地希望您可以帮助我解决以下问题、我在配置 DPWMEV1时无法正确配置它。 将不同的值写入代码并从存储器中读取。、
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.
工具/软件:
我真诚地希望您可以帮助我解决以下问题、我在配置 DPWMEV1时无法正确配置它。 将不同的值写入代码并从存储器中读取。、
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 采样? 谢谢你。
您好:
根据您的代码、我假设您使用 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
您好 Liu、
您仍需要 在出现 EVENT2和 EVENT3的周期内设置一个值。 UCD3138FW-HSFB、 UCD3138FW-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