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.
工具与软件:
各位专家、您好!
在双轴驱动器项目中、在 PWM 初始化函数内`HAL_setupMotorPWM ()`:
您能否告诉我为什么仅为计数器比较 A 启用影子加载模式? 为什么它没有为计数器比较 B 启用?
是否不需要、因为 CPRA 和 CMPB 配置为操作限定符的补充项?
您好!
死区子模块的配置方式可使 PWMA 和 PWMB 成为互补输出。 只需 在软件中使用 CMPA。
此致!
Kevin
感谢您的回复 Kevin。
我正在尝试将 ePWM 模块配置为充当制动斩波器、用于在再生扭矩期间通过电阻器耗散多余的能量。
CMPA 和 CMPB 是独立配置的。 CMPA 用于电机1、CMPB 用于电机2。
在这种情况下、是否建议 启用影子加载模式?
这是我的初始化函数:
// Sets up the PWMs (Pulse Width Modulators) for Brake chopper void HAL_setupBrCpPWMs(HAL_MTR_Handle handle) { HAL_MTR_Obj *obj = (HAL_MTR_Obj*) handle; //Configure clock EPWM_setClockPrescaler(obj->pwmHandle[3], EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_2); EPWM_setTimeBaseCounterMode(obj->pwmHandle[3], EPWM_COUNTER_MODE_UP); //Set period(Switching frequency : 5 KHz) EPWM_setTimeBasePeriod(obj->pwmHandle[3], 10000U); EPWM_setPhaseShift(obj->pwmHandle[3], 0U); //Enable compare shadow load mode EPWM_setCounterCompareShadowLoadMode(obj->pwmHandle[3], EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(obj->pwmHandle[3], EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); //Set duty cycle to 0. EPWM_setCounterCompareValue(obj->pwmHandle[3], EPWM_COUNTER_COMPARE_A, 0); EPWM_setCounterCompareValue(obj->pwmHandle[3], EPWM_COUNTER_COMPARE_B, 0); //Set up action qualifiers EPWM_setActionQualifierAction(obj->pwmHandle[3], EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(obj->pwmHandle[3], EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(obj->pwmHandle[3], EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(obj->pwmHandle[3], EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); // configure sync EPWM_setSyncOutPulseMode(obj->pwmHandle[3], EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); //configure interrupts EPWM_setInterruptSource(obj->pwmHandle[3], EPWM_INT_TBCTR_ZERO); EPWM_enableInterrupt(obj->pwmHandle[3]); EPWM_setInterruptEventCount(obj->pwmHandle[3], 1); }
谢谢!
AK
Hi AK、
CMPA 和 CMPB 都是独立配置的。 CMPA 用于电机1、CMPB 用于电机2。
那么、您还是要对电机1使用 ePWMx 通道 A、对电机2使用通道 B?
在这种情况下、您是否建议 启用影子加载模式?
在 发生 CNTR_ZERO 事件时、影子加载模式将影子 CMPA/B 寄存器加载到活动寄存器、以便同步 EPWM CMPA/B 更新。 您的 CNA 使用此模式、除非您需要为 再生扭矩 应用立即更新 CMPx。
此致!
Kevin
是的、正确。
影子加载模式将 在 发生 CNTR_ZERO 事件时将影子 CMPA/B 寄存器加载到活动寄存器、从而同步 EPWM CMPA/B 更新。 您的 CNA 使用此模式、除非您需要为 再生扭矩 应用立即更新 CMPx。
如果我们以影子加载为例、
如果时间周期(TBPRD)为10000、我们在进行计算
TBCTR 为1000时、我将 CMPA 写入500、然后写入
TBCTR 为5000、我将 CMPA 写入800、然后写入
TBCTR 为9000、我将 CMPA 写入100、然后当计数器 回滚 到零时
TBCTR 为 0、CMPA 值为100将被取?(之前的值800,500将被忽略?)
Hi AK、
是的、您描述的行为是正确的。 在配置的加载事件(TBPRS、零等)时、您写入的最新寄存器值将从影子寄存器移到活动寄存器。
此致!
Kevin