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.

[参考译文] HAL_SetTrigger()阐述

Guru**** 2535750 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/605942/hal_settrigger-clarification

在计算 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);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SIMO、

    我对您的问题没有全部答案、但我可以回答一些问题。

    [引用用户="Simo Sihvonen"]

    CMPA (计数器比较 A 寄存器)和 CMPAM (计数器比较 A 寄存器镜像)之间的差异? CMPAM 是否读取当前活动的 CMPA 值,然后在计数器= 0时将该值更新为 HAL_writePwmData()中先前写入的 CMPA 值?

    [/报价]

    正确、CMPAM 显示活动值、而 CMPA 显示写入 CMPA 的最后一个值。 使用重影时、CMPA 将根据 CMPCTL[LOADAMODE]...CTR = 0、CTR = PRD 等中的值进行更新。有关详细信息、请参阅您参考的文档。

    [引用用户="Simo Sihvonen"]

    如果启用了影子寄存器、则它们充当缓冲寄存器、在计数器= 0时从该缓冲寄存器将新值加载到实际寄存器中? 如果禁用影子寄存器、那么写入 CMPA 等的新值将立即生效、这可能会导致干扰、具体取决于写入时间?

    [/报价]

    同样、它在计数器= 0时可能加载、也可能不加载、这取决于 CMPCTL[LOADAMODE]的值。 是的、如果您不使用影子寄存器、则可能会发生干扰。 可能也会发生比预期更长的低电平时间或高电平时间。

    此致、
    Cody

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还想知道、它使用 HAL_SetTrigger 函数中这两行的中心对齐 PWM 脉冲:

    PWM_setSockAPulseSrc (obj->pwmHandle[PWM_Number_1]、PWM_SockPulseSrc_EqualCounterCmpBDecr);

    PWM_setSockAPulseSrc (obj->pwmHandle[PWM_Number_1]、PWM_SockPulseSrc_CounterEqualCmpBIncrr);

    Other 将在计时器的递增计数时设置 SoC:PWM_SockPulseSrc_CounterEqualCmpBincr

    另一个在递减计数时:           PWM_SockPulseSrcEqualCmpBDecr

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SIMO、

    很棒! 这是否回答了您对此问题的所有问题?(请用"验证答案"按钮标记有用的帖子)

    如果您对其他内容有另一个问题、请随意开始另一个主题。

    此致、
    Cody

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    InstaSPIN 库是否默认使用中心对齐(双边沿) PWM 脉冲?
    答:默认情况下、CMPA 为递增和递减计数模式和影子模式、如您所述、使用中心对齐(双边缘)。 CMPA 控制 PWM 的 PWM_H 和 PWM_L 输出是带死区的补码模式、当时基计数器等于0时、CMPA 将从 CMPAM 加载。
    计算在 hal_setTigger 中使用立即模式的 CMPB、而 CMPB 仅用于 TRIG ADC、不控制 PWM 输出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我确实理解了 ePWM1的 CMPB 被用作整个 ADC 序列转换开始的触发器。

    最后我想听到的是在第二个到最后一个 if ()语句中计算实际触发点的逻辑。

    if (PWM->CMPAM >=(PWM->CMPA + PWM->DBFED))
    {
    pwm1->CMPB =(PWM->CMPAM -(PWM->CMPA + PWM->DBFED))/ 2 + 1;
    PWM_setSockpAPulseSrc (PWM->pcmHandle[PWM-1>PwmPwm]+PwmPwmPwmPwmPwmPn1
    
    
    
    )+
    1;PWM=p_sockp_sock1 (PWM1- 1)+ PwmPwmPwmPwmPwmPwmPwmPwmPwp1)+ 1)+ PwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwmPwp
    

    使用 CMPAM 和即将到来的 CMPA + DBFED 来设置触发点而不仅仅是 CMPA + DBFED 值似乎有点奇怪?

    我制作了一个小图来显示每个 if () case 语句中触发点的行为。

    IF (CMPAM >=(CMPA + DBFED))

    if (CMPAM <(CMPA + DBFED))(else()案例)

    重点是、为什么不仅仅使用一个简单的 CMPB = CMPA + DBFED +"小常数来增加一点延迟"并在上升计数时设置它? 还是只需将 CMPB = TBPRD 设置为恰好在中心位置? 为什么要进行这种奇怪的计算、其好处是什么?

    实际上、看看图。 为什么计数器零点附近的触发点?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在我了解触发点为何位于零点计数器点附近。

    我仔细看了 HAL_writePwmData、现在看到 TI 为其 PWM 输出使用反向逻辑电平。 AKA 高电平 MOSFET 输出启动低电平(计数器= 0)、并且在 CMPAM 上变为高电平。

    HAL_writePwmData 中的计算会生成一个介于 Iq (0.0)和 Iq (1.0)之间的值、然后将其与周期寄存器值相乘以进行缩放、然后将其写入 CMPA。 gPwmData->TBC.value[cnT]包含 Iq (-0.5)和 Iq (0.5)之间的值,但计算会导致 Iq (-0.5)输入变为 Iq (1.0),Iq (0.5)变为 Iq (0.0)。 逻辑上考虑 gPwmData->TBC.value[cnT]值是否接近 IQ (-0.5)、这意味着您需要始终打开低侧 MOSFET、 但考虑到 HAL_writePwmData 随后将设置 CMPA =周期、这必须意味着正 MOSFET 输出需要低电平启动才能实现该结果。

    不过,我刚才的问题仍然存在。 如果您可以将触发点设置为计数器零、为什么在 HAL_SetTrigger 中进行奇怪的计算?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了便于进行过调制以轻松对电流进行采样、您可以参阅 InstaSPIN 实验室指南中的 lab10a 以了解详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦、我忘了查看 instaspin_labs.pdf 指南、谢谢!

    我将参考它来计算触发点时序的逻辑。

    我觉得我已经找到了答案了。 感谢你们的帮助!