在计算 MainISR 中转换开始的下一个触发点时、我想对几个方面做一些说明。 我还阅读了 ePWM 模块的 spruge9e-datasheet、但我仍想了解几个说明。
InstaSPIN 库是否默认使用中心对齐(双边沿) PWM 脉冲?
CMPA (计数器比较 A 寄存器)和 CMPAM (计数器比较 A 寄存器镜像)之间的差异? CMPAM 是否读取当前活动的 CMPA 值,然后在计数器= 0时将该值更新为 HAL_writePwmData()中先前写入的 CMPA 值?
如果启用了影子寄存器、则它们充当缓冲寄存器、在计数器= 0时从该缓冲寄存器将新值加载到实际寄存器中? 如果禁用影子寄存器、那么写入 CMPA 等的新值将立即生效、这可能会导致干扰、具体取决于写入时间?
基于这些内容,我添加了一些注释来解释 HAL_SetTrigger()中采取的操作
//! \brief 在低侧脉冲的中间设置触发点
//! \param[in]处理硬件抽象层(HAL)句柄
//! \param[in]忽略应忽略的低侧分流
器//! param[in] midVolShunt 输出电压的中间长度
静态内联 void HAL_SetTrigger (HAL_Handle handle、const SVGENCURRENT_IgnoreShune_e ignoreShunt、
const SVGENCURRENT_VmidShobj)
{_Obobj
=(pwm_dpwm
=)*pwmpwmpwmj =pwmpwmpwm_wmpwmpwmp_wmp_wmpwmp1
;*pwmpwmpwmpwmpwmpwmp_wmpwmp_wmpwmp_wmpwmp_wmwmp_wmp_wmpwmwmp1)*pwmwmp1 pwmp_wmwmp_wmwmp_p1 pwmpwmp_wmwmp_wmp_wmwmpwmp1 // nextPulse=((计数器= 0时写入 CMPA 值)+(当前有效的 CMPA 值))/ 2
uint16_t nextPulse2 =(pwm2->CMPA + pwm2->CMPAM)/ 2;
uint16_t nextPulse3 =(pwm3->CMPA + pwm2->CMPAM)/ 2;uint16_t nextPulse3
if (ignoreShunt =use_all)//如果我们可以使用所有分流器、那么确定哪个 ePWM 模块具有最短的低电平脉冲、并使用该脉冲设置时间、以便在触发 ADC SoC 时所有3个输出都为低电平?
{
if ((nextPulse1 <= nextPulse2)&&(nextPulse1 <= nextPulse3))
{
PWM = pwm1;
}
否则、if (((nextPulse2 <= nextPulse1)&&(nextPulse2 <= nextPulse3))
{
PWM = pwm2;
}
其他
{
PWM = pwm3;
}
}
否则//如果我们不能在高占空比下使用全部3个分流器、但只能使用2个分流器、那么请再次确定哪个 EPWM 模块作为 SoC 时序的基础
{
if (midVolShunt = vmid_a)
{
PWM = pwm1;
}
否则、if (midVolShunt = vmid_b)
{
PWM = pwm2;
}
否则
{
PWM = pwm3;
}
if (PWM->CMPAM >=(PWM->CMPA + PWM->DBFED)
){
pwm1->CMPB =(PWM->CMPAM -(PWM->CMPA + PWM->DBFED))/ 2 + 1;//如果我们保留 CMPAM 寄存器、我会有点困惑为什么使用 CMPAM (续)。
PWM_setSockAPulseSrc (obj->pwmHandle[PWM_Number_1]、PWM_SockPulseSrc_CounterEqualCmpBDecr);//当前活动的 CMPA 用于计算 ADC SoC 的新触发点?
}
否则
{
pwm1->CMPB =((PWM->CMPA + PWM->DBFED)- PWM->CMPAM)/ 2 + 1;
PWM_setSocksseSrc(obj->pwmHandle[PWM_Number_1]、PWM_SockPulseSrc_CounterCmpBincr);
}


