尊敬的
我的客户电机运行速度范围为1880RPM; 计划在1000 RPM 内的 PWM 载波为10K、高于1000 RPM 则更改为8K;
目前、PWM 载波的初始配置执行一次、电机正常运行; 当电机运行速度达到1000 RPM 或更高时、PWM 载波的初始配置功能再次被调用(以修改载波频率)、无法实现;
需要解决的问题是、当电机速度达到1000RPM 时、除了通过配置 ePWM 周期寄存器(PWM -> TBPRD =周期)来修改载波频率之外、是否还有任何其他相关的寄存器配置或逻辑需要修改? 或者还有其他方法;
以下是 ePWM 初始配置函数、请参阅 InstaSPIN。 并提前告知您
void HAL_setupPwms (HAL_Handle handle、
const uint_least16_t systemFreq_MHz、
const float_t pwmPeriod_usec、
const uint_least16_t numPwmTicksPerIsrTick)
{
HAL_Obj * obj = (HAL_Obj *)句柄;
uint16_t half Period_cycles = (uint16_t)((float_t) systemFreq_MHz*pwmPeriod_usec) >> 1;
uint_least8_t cnt;
// clk_disableTbClockSync (obj->clkHandle);
// 关闭 EPWM 外设的输出 ,从而 放置 电源 开关
// 进入 高 阻抗 状态。
PWM_setOneShotscope (obj->pwmHandle[PWM_Number_1]);
PWM_setOneShotscope (obj->pwmHandle[PWM_Number_2]);
PWM_setOneShotscope (obj->pwmHandle[PWM_NUMBER_3]);
for (cnt=0;cnt<3;cnt++)
{
// 设置 时基 控制 寄存器 (TBCTL)
PWM_setCounterMode (obj->pwmHandle[cnT]、PWM_CounterMode_UpDown);
PWM_disableCounterLoad (obj->pwmHandle[cnt]);
PWM_setPeriodLoad (obj->pwmHandle[cnt]、PWM_PeriodLoad_Immediate);
PWM_setSyncMode (obj->pwmHandle[cnT]、PWM_SyncMode_EPWMxSYNC);
PWM_setHighSpeedClkDiv (obj->pwmHandle[cnt]、PWM_HspClkDiv_BY_1);
PWM_setClkDiv (obj->pwmHandle[cnt]、PWM_ClkDiv _BY_1);
PWM_setPhaseDir (obj->pwmHandle[cnT]、PWM_PhaseDir_CountUp);
PWM_setRunMode (obj->pwmHandle[cnt]、PWM_RunMode_FreeRun);
// 设置 基于定时器 的相位 寄存器 (TBPHS)
PWM_setPhase (obj->pwmHandle[cnt]、0);
// 设置 时基 计数 器寄存器 (TBCTR)
PWM_setCount (obj->pwmHandle[cnt]、0);
// 设置 时基 周期 寄存器 (TBPRD)
// 初始设置为零
PWM_setPeriod (obj->pwmHandle[cnt]、0);
// 设置 计数器比较 控制 寄存器 (CMPCTL)
PWM_setLoadMode_cmpA (obj->pwmHandle[cnt]、PWM_LoadMode_Zero);
PWM_setLoadMode_CMPB (obj->pwmHandle[cnt]、PWM_LoadMode_Zero);
PWM_setShadowImage Mode_cmpA (obj->pwmHandle[cnt]、PWM_ShadowImage Mode_Shadow);
PWM_setShadowImage Mode_CMPB (obj->pwmHandle[cnt]、PWM_ShadowImage Mode_Immediate);
// 设置 动作限定器 输出 A 寄存器 (AQCTLA)
PWM_setActionQual_CntUp_CmpA_PwmA (obj->pwmHandle[cnt]、PWM_ActionQual_set);
PWM_setActionQual_CntDown_CmpA_PwmA (obj->pwmHandle[cn]、PWM_ActionQual_clear);
// 设置 死区 发生器 控制 寄存器 (DBCTL)
PWM_setDeadBandOutputMode (obj->pwmHandle[cnt]、PWM_DeadBandOutputMode_EPWMxA_rising_EPWMxB_Falling);
PWM_setDeadBandPolarity (obj->pwmHandle[cnT]、PWM_DeadBandPolarity _EPWMxB_Inverted);
// 设置 死区 上升 沿 延迟 寄存器 (DBRED)
PWM_setDeadBandRisingEdgeDelay (obj->pwmHandle[cnt]、HAL_PWM_DBRED_CNT);
// 设置 死区 下降 沿 延迟 寄存器 (DBFED)
PWM_setDeadBandFallingEdgeDelay (obj->pwmHandle[cnT]、HAL_PWM_DBFED_CNT);
// 设置 PWM 斩波 器控制 寄存器 (PCCTL)
pwm_disableChopping (obj->pwmHandle[cnt]);
// 设置 触发 区 选择 寄存器 (TZSEL)
PWM_disableTripZones (obj->pwmHandle[cnT]);
}
// 设置 事件 触发 器选择 寄存器 (ETSEL)
PWM_DisableInt (obj->pwmHandle[PWM_NUMBER_1]);
PWM_setSockAPulseSrc (obj->pwmHandle[PWM_Number_1]、PWM_SockPulseSrc_EqualCounterZero);
PWM_enableSockpulse (obj->pwmHandle[PWM_NUMBER_1]);
// 设置 事件 触发 器预分频 寄存器 (ETPS)
if (numPwmTicksPerIsrTick == 3)
{
PWM_setIntPeriod (obj->pwmHandle[PWM_NUMBER_1]、PWM_IntPeriod_ThirdEvent);
PWM_setSockAPeriod (obj->pwmHandle[PWM_Number_1]、PWM_SockPeriod_ThirdEvent);
}
否则 、如果(numPwmTicksPerIsrTick == 2)
{
PWM_setIntPeriod (obj->pwmHandle[PWM_NUMBER_1]、PWM_IntPeriod_SecondEvent);
PWM_setSockAPeriod (obj->pwmHandle[PWM_Number_1]、PWM_SockPeriod_SecondEvent);
}
其他
{
PWM_setIntPeriod (obj->pwmHandle[PWM_NUMBER_1]、PWM_IntPeriod_FirstEvent);
PWM_setSockAPeriod (obj->pwmHandle[PWM_Number_1]、PWM_SockPeriod_FirstEvent);
}
// 设置 事件 触发 器清除 寄存器 (ETCLR)
PWM_clearIntFlag (obj->pwmHandle[PWM_NUMBER_1]);
PWM_clearSockAFlag (obj->pwmHandle[PWM_Number_1]);
// 同步 PWM 的第一步
clk_disableTbClockSync (obj->clkHandle);//2021.7.8
// 由于 PWM 配置 为 递增/递减 计数器, 因此周期 寄存器 设置 为 二分之一
所 需 PWM 周期的//
PWM_setPeriod (obj->pwmHandle[PWM_NUMBER_1]、half Period_cycles);
PWM_setPeriod (obj->pwmHandle[PWM_NUMBER_2]、half Period_cycles);
PWM_setPeriod (obj->pwmHandle[PWM_NUMBER_3]、half Period_cycles);
// 同步 PWM 的最后一步
clk_enableTbClockSync (obj->clkHandle);
返回;
} // HAL_setupPwms() 函数结束