主题中讨论的其他器件:PMP41017
工具/软件:
你好。
我正在开发基于 PMP41017 的 LLC。
PWM 在基本代码中按如下所示进行配置。
// pwm — 实例分配
#define LLC_SEC1_PWM_BASE EPWM4_BASE
#define LLC_PRI2_PWM_BASE EPWM2_base
#define LLC_sec2_pwm_base EPWM6_BASE
#define LLC_sec2_pwm_base_B EPWM7_base
#define LLC_CONTROL_PWM_BASE EPWM3_BASE
LLC_SEC1_PWM_BASE 为 EPWM4。
但 llc_sec2_pwm_base A 是 EPWM6、B 是 EPWM7。
我被告知原因可能是因为 A/B 输出需要更大的灵活性。
为了方便编码、我删除#define LLC_SEC2_PWM_BASE_B EPWM7_BASE并使用 EPWM6_BASE A/B 实现了代码
因此、我修改了 TILLC_HAL_updateActuation() 函数中的原始公式。
您能否查看更新后的公式以检查是否存在任何问题?
静态内联 void LLC_HAL_updateActivation (float32_t periodSet_pu、
float32_t dutySetPhase1_PU、
float32_t dutySetPhase2_PU、
uint16_t dbred_pri_ticks、
uint16_t dbfeed_pri_ticks、
float32_t phaseshift_pu)
{
静态 uint16_t tbprd_ticks = 0、tbprd_tics_int = 0;
静态 uint16_t cmpa_pri_1_ticks = 0、CMPB_pri_1_ticks = 0、CMPC_pri_1_ticks = 0;
静态 uint16_t cmpa_sec_1_ticks = 0、CMPB_sec_1_ticks = 0;
静态 uint16_t db_sec_1_ticks = 0;
静态 uint16_t DBRED_PRI_1_TICKS_DUTY = 0、dbFED_PRI_1_TICKS_DUTY = 0;
//
//钳制传递到函数的周期变量
//
GV_run (&periodSet_pu、LLC_PERIOD_MAX_PU、LLC_PERIOD_MIN_PU);
GV_run (&dutySetPhase1_pu、LLC_DUTY_MAX_PU、LLC_DUTY_MIN_PU);
GV_run (&dutySetPhase2_pu、LLC_DUTY_MAX_PU、LLC_DUTY_MIN_PU);
//
//计算临时值
//
tbprd_ticks =(LLC_PERIOD_MAX_ticks * periodSet_pu)* 0.5;// 120/100/2 * pu =最大值 (600)
if (tbprd_ticks <(0.325*llc_period_common_ticks))
{
tbprd_ticks_int = 3*tbprd_ticks;// 200k 中断两个周期限制
}
暴露
{
tbprd_ticks_int = 2*tbprd_ticks ;
}
CMPB_pri_1_ticks = dutySetPhase1_pu * tbprd_ticks;
cmpa_pri_1_ticks = tbprd_ticks - CMPB_pri_1_ticks;
dbred_pri_1_ticks_duty = dbred_pri_ticks + cmpa_pri_1_ticks;//使用 DB 调整占空比
dbfeed_pri_1_ticks_duty = dbfeed_pri_ticks + cmpa_pri_1_ticks;//DB->占空比控制 10+600*0.01 (2~6)= 16 ->130N
dbred_pri_ticks = dbred_pri_ticks + 12;//= 10+12 * 8.33 = 180n
if(tbprd_ticks >(llc_period_onorion_ticks * 0.5 ))///以下区域(对称)
{
CMPB_sec_1_ticks = tbprd_ticks - LLC_period_honion_ticks * 0.5;
cmpa_sec_1_ticks = llc_period_common_ticks * 0.5;
}
否则//above 区域 0.5 占空比
{
CMPB_sec_1_ticks = 0;
cmpa_sec_1_ticks = tbprd_ticks;
}
//中断和 ADC 设置
EPWM_setTimeBasePeriod (LLC_CONTROL_PWM_BASE、tbprd_ticks_int);
EPWM_setTimeBasePeriod (LLC_CLA_PWM_BASE、tbprd_ticks_int);
cmpc_pri_1_ticks = tbprd_ticks * 0.7;
EPWM_setCounterCompareValue (LLC_PRI1_PWM_BASE、EPWM_COUNTER_COMPARE_C、CMPC_PRI_1_TICKS);
//
//更新相位 1 PWM (HB)
//
LLC_HAL_updatePWM (LLC_PRI1_pwm_base、tbprd_ticks、cmpa_pri_1_ticks、
CMPB_PRI_1_TICKS、dbred_pri_1_TICKS_DUTY、dbfeed_pri_1_TICKS_DUTY);
LLC_HAL_updatePWM (LLC_SEC1_PWM_BASE、tbprd_ticks、cmpa_sec_1_ticks、
CMPB_sec_1_ticks、db_sec_1_ticks、db_sec_1_ticks);
静态 uint16_t cmpa_pri_2_ticks = 0、CMPB_pri_2_ticks = 0;
//静态 uint16_t cmpa_sec_2_tics_outA = 0、CMPB_sec_2_tics_outA = 0;
//静态 uint16_t cmpa_sec_2_tics_outb = 0、CMPB_sec_2_tics_outb = 0;
静态 uint16_t cmpa_sec_2_ticks = 0、CMPB_sec_2_ticks = 0;
静态 uint16_t db_sec_2_ticks = 0;
static uint16_t db_pri_2_duty = 0;//使用 DB 调整占空比
静态 uint16_t DBRED_PRI_2_TICKS_DUTY = 0、dbFED_PRI_2_TICKS_DUTY = 0;
静态 uint16_t phaseshift_ticks = 0;
而 (phaseshift_pu >= 0.5) phaseshift_pu = phaseshift_pu - 0.5;// phaseshift_pu = 0.25
phaseshift_ticks = tbprd_ticks * phaseshift_pu *2;
CMPB_pri_2_ticks = phaseshift_ticks;
cmpa_pri_2_ticks = tbprd_ticks - phaseshift_ticks;
dB_pri_2_duty = dutySetPhase2_pu * tbprd_ticks;// duty ->死区时间
dbred_pri_2_ticks_duty = dbred_pri_ticks + tbprd_ticks - db_pri_2_duty;
dbfed_pri_2_ticks_duty = dbfed_pri_ticks + tbprd_ticks - db_pri_2_duty;
db_sec_2_ticks = dbfeed_pri_ticks + 12;//= 10+12 * 8.33 = 180n
if(tbprd_ticks <(llc_period_common_ticks * 0.5 ))//以上
{
/*评论 SKIM 2025.06.25
cmpa_sec_2_tics_outa = phaseshift_ticks;
CMPB_sec_2_tics_outa = tbprd_ticks - phaseshift_ticks;
cmpa_sec_2_tics_outb = phaseshift_ticks;
CMPB_sec_2_tics_outb = tbprd_ticks - phaseshift_ticks;
*/
cmpa_sec_2_ticks = phaseshift_ticks;
CMPB_sec_2_ticks = tbprd_ticks - phaseshift_ticks;
}
否则 if(tbprd_ticks <(phaseshift_ticks +(llc_period_honion_ticks / 2 )))//低于 TR < tsw < 2Tr
{
// cmpa_sec_2_tics_outa = phaseshift_ticks;
// CMPB_sec_2_tics_outa = 2 * tbprd_ticks - LLC_PERIOD_COMMON-ticks * 0.5 - phaseshift_ticks;
// cmpa_sec_2_tics_outb = tbprd_ticks - phaseshift_ticks;
// CMPB_sec_2_tics_outb = LLC_period_common_ticks * 0.5 + phaseshift_ticks - tbprd_ticks;
cmpa_sec_2_ticks = phaseshift_ticks;
CMPB_sec_2_ticks = 2 * tbprd_ticks - LLC_PERIOD_COMION_ticks * 0.5 - phaseshift_ticks;
}
//
//更新相位 2 PWM (HB)
//
LLC_HAL_updatePWM (LLC_PRI2_pwm_base、tbprd_ticks、cmpa_pri_2_ticks、
CMPB_PRI_2_TICKS、dbred_pri_2_TICKS_DUTY、dbfeed_pri_2_TICKS_DUTY);
LLC_HAL_updatePWM (LLC_sec2_pwm_base、tbprd_ticks、cmpa_sec_2_ticks、
CMPB_sec_2_ticks、db_sec_2_ticks、db_sec_2_ticks);
/*评论由 SKIM 2025.06.27
LLC_HAL_updatePWM (LLC_sec2_pwm_base、tbprd_ticks、cmpa_sec_2_tics_outA、
cmpa_sec_2_tics_outb、db_sec_2_ticks、db_sec_2_ticks);
llc_HAL_updatePWM (llc_sec2_pwm_base_B、tbprd_ticks、cmpa_sec_2_tics_outb、
CMPB_sec_2_ticks_outb、db_sec_2_ticks、db_sec_2_ticks);
*/
//
//设置全局加载一次性锁存器、以便 PWM 行为在接下来更新
// TBCTR = 0 事件
//
EPWM_setGlobalLoadOneShotLatch (LLC_CONTROL_PWM_BASE);
}
谢谢。