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.

[参考译文] TMS320F28027:可使用跳闸区域或数字比较来同步 PWM 吗?

Guru**** 2551370 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/629014/tms320f28027-can-trip-zone-or-digital-compare-be-used-to-sync-pwm

器件型号:TMS320F28027
主题中讨论的其他器件:TMS320F28379D

大家好、

我正在尝试将 PWM3B 同步到一个外部脉冲序列、这样外部信号的下降边沿将 PWM 时基计数器设定为零。  

我没有使用外部 SYNC 引脚、因为它已经被用于将 PWM1和2同步到 一个不同的同步方案。

我尝试通过数字比较模块处理 TZ1#以驱动同步事件信号、但由于某种原因、产生的 PWM 似乎在随机位置同步。 如果我注释掉设置的数字比较部分、问题就不存在(但当然没有同步)。

也许同步事件在外部信号为低电平时而不是第一次检测到为低电平时一直升高?

此时我的 PWM 设置代码:

GPIO_Handle GPIO = GPIO_init ((void *) GPIO_base_ADDR、sizeof (GPIO_Obj);
PWM_Handle PWM = PWM_init (PWM_ISHR_PWM_base_address、sizeof (PWM_Obj)));

//将 GPIO 配置为 TZ#输入。 /GPIO_setDirection
(GPIO、GPIO_Number_12、GPIO_Direction_Input);
GPIO_setPullup (GPIO、GPIO_Number_12、 GPIO_PULLUP_Enable);
GPIO_setLow (GPIO、GPIO_Number_12);
GPIO_setMode (GPIO、GPIO_Number_12、GPIO_12_Mode_TZ1_NOT);

//将 GPIO 配置为 PWM 输出。 /GPIO_setDirection
(GPIO、GPIO_Number_5、GPIO_Direction_Output);
GPIO_setPullup (GPIO、GPIO_Number_5、 GPIO_PULLUP_Enable);
GPIO_setLow (GPIO、GPIO_Number_5);
GPIO_setMode (GPIO、GPIO_Number_5、GPIO_0_Mode_EPWM1A);

/*时基子模块。 */
PWM_setSyncMode (PWM、PWM_SyncMode_Disable);
PWM_enableCounterLoad (PWM);
PWM_setPhase (PWM、0U);
PWM_setPeriodLoad (PWM、PWM_PeriodLoad_Immediate);
PWM_setPeriod (PWM、59999);
PWM_setCount (PWM、0U);
PWM_setCounterMode (PWM、PWM_CounterMode_Up);
PWM_setHighSpeedClkDiv (PWM、 PWM_HspClkDiv_BY_1);
PWM_setClkDiv (PWM、PWM_ClkDiv_BY_1);

//计数器比较子模块。 //
PWM_setCmpA (PWM、0U);
PWM_setCmpB (PWM、30000);//开始时占空比为50%。 /PWM_setShadowImage Mode_CMPB
(PWM、PWM_ShadowImage Mode_Shadow);
PWM_setLoadMode_CMPB (PWM、PWM_LoadMode_Zero);

/* Action 限定符子模块。 /PWM_setActionQUAL_Zero_PwmA
(PWM、PWM_ActionQual_Disabled);
PWM_setActionQual_CntUp_CMPB_PwmA (PWM、PWM_ActionQual_Disabled);
PWM_setActionQual_Period_PwmA (PWM、 PWM_ActionQUAL_Disabled);
PWM_setActionQUAL_Zero_PwmB (PWM、PWM_ActionQual_set);
PWM_setActionQual_CntUp_CMPB_PwmB (PWM、PWM_ActionQual_clear);

//跳匣区域子模块。 /PWM_setTripZoneState_DCAEVT1
(PWM、PWM_TripZoneState_DoNothing);
PWM_setTripZoneState_DCAEVT2 (PWM、PWM_TripZoneState_DoNothing);
PWM_setTripZoneState_DCBEVT1 (PWM、 PWM_TripZoneState_DoNothing);
PWM_setTripZoneState_DCBEVT2 (PWM、PWM_TripZoneState_DoNothing);
PWM_setTripZoneState_TZA (PWM、PWM_TripZoneState_DoNothing);
PWM_setTripZoneState_TZB (PWM、PWM_TripZoneState_DoNothing);

//数字比较子模块。 //
PWM_setDigitalCompareInput (PWM、PWM_DigitalCompare_A_High、PWM_DigitalCompare_InputSel_TZ1);//为 DCAH 输入选择 TZ1#。 //
PWM_setTripZoneDCEventSelect_DCAEVT1 (PWM、PWM_TripZoneDCEventSel_DCxHL_DCxLX);//将 DCAEVT 设置为 DCAH =低电平、DCAL =无关。 //
PWM_DisableDigitalCompareBlankingWindow (PWM);
//设置事件参数:使用未过滤的事件信号,信号不是异步的,不生成 SOC,生成同步信号。 /PWM_setDigitalCompareAEvent1
(PWM、false、false、false、true);

/*通过强制同步启动 PWM。 */
PWM_forceSync (ishrHandle->PWM); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Toby、
    您如何配置 PWM2的 SYNCO 脉冲? 如果它被启用、这个脉冲将被直接馈送到 ePWM3。

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

    您好、Cody、

    感谢您的回复。

    PWM 2在当前迭代中未使用、相关 GPIO 用于其他功能。 虽然 PWM 1和3的子模块时钟和时基时钟一样被启用、但我没有  PWM 2中专门禁用 SYNCO (如果 PWM 2子模块时钟未被专门启用、则设置它不会产生任何影响)。

    尽管外部同步线路已设置(以同步 PWM 1)、但 PWM 1具有以下特性、因此我认为应禁用下游同步输出。

    PWM_setSyncMode (pwm1、PWM_SyncMode_Disable); 

    PWM 1的完整配置如下所示、它还被配置为生成中断和 ADC SOC。

    GPIO_setDirection (GPIO、GPIO_Number_0、GPIO_Direction_Output);
    GPIO_setPullup (GPIO、GPIO_Number_0、 GPIO_PULLUP_Enable);
    GPIO_setHigh (GPIO、GPIO_Number_0);
    GPIO_setMode (GPIO、GPIO_Number_0、GPIO_0_Mode_generalPurpose);
    
    GPIO_setDirection (GPIO、GPIO_Number_1、 GPIO_DIRECTION _Output);
    GPIO_setPullUp (GPIO、GPIO_Number_1、GPIO_PULLUP_Enable);
    GPIO_setHigh (GPIO、GPIO_Number_1);
    GPIO_setMode (GPIO、GPIO_Number_1、GPIO_1_Mode_generalPurpose);
    PWM_setup2ChHiZ ((GPIO_Obj *) gpioHandle);
    
    /*时基子模块。 //
    //*设置立即加载。 /PWM_setPeriodLoad
    (pwm1、PWM_PeriodLoad_Immediate);
    PWM_setPeriod (pwm1、599);
    PWM_setPhase (pwm1、 0);
    PWM_setCount (pwm1、0);
    
    PWM_setCounterMode (pwm1、PWM_CounterMode_Up);
    PWM_setHighSpeedClkDiv (pwm1、PWM_HspClkDiv_BY_1);
    PWM_setClkDiv (pwm1、PWM_ClkDiv_BY_1);
    
    PWM_enableCounterLoad (pwm1);
    /*禁用 PWM2和 PWM3的下游。 /PWM_setSyncMode
    (pwm1、PWM_SyncMode_Disable);
    
    PWM_setPhase (pwm1、(2U - PHASE));
    
    /*计数器比较子模块。 /PWM_setCmpA
    (pwm1、0U);
    PWM_setShadowImage Mode_cmpA (pwm1、PWM_ShadowImage Mode_Shadow);
    PWM_setLoadMode_cmpA (pwm1、 PWM_LoadMode_Period);
    
    PWM_setCmpB (pwm1、0U);
    PWM_setShadowImage Mode_CMPB (pwm1、PWM_ShadowImage Mode_Shadow);
    PWM_setLoadMode_CMPB (pwm1、PWM_LoadMode_Period);
    
    /* Action 限定符子模块。 //
    PWM_setActionQual_Zero_PwmA (pwm1、PWM_ActionQual_clear);
    PWM_setActionQual_CntUp_CmpA_PwmA (pwm1、PWM_ActionQual_set);
    
    PWM_setActionQual_Zero_PwmB (pwm1、 PWM_ActionQual_Disabled);
    PWM_setActionQual_CntUp_CmpA_PwmB (pwm1、PWM_ActionQual_Disabled);
    PWM_setActionQual_Period_PwmB (pwm1、PWM_ActionQual_Disabled);
    
    /*死区子模块。 /PWM_setDeadBandInputMode
    (pwm1、PWM_DeadBandInputMode_EPWMxA_RISTing_and_FALLING);
    PWM_setDeadBandOutputMode (pwm1、PWM_DeadBandOutputMode_EPWMxA_RISTing_EPWMxB_FALLING);PWM_setDewamp1
    (PbandPoolarity) PWM_DeadBandPolarity_EPWMxB_Inverted);
    PWM_setDeadBandRisingEdgeDelay (pwm1、0U);
    PWM_setDeadBandFallingEdgeDelay (pwm1、0U); 

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

    Toby、

    我可以看到您是如何实现该假设的... 但我没想到这是真的。 PWM 同步链旨在以尽可能低的延迟工作、在该链中添加时钟触发器只会增加延迟。

    我通过使用不同的相位同步 PWM1和 PWM3、在启用和不启用 PWM2外设时钟的情况下测试了我的理论。 没有效果。  

    禁用 PWM2的 SYNCO 会产生所需的结果... PWM1和 PWM3不再同步。

    我的测试是在使用 SWFSYNC 的 TMS320F28379D 上完成的、但我希望它们在具有同步脉冲源的 F2802x 器件上是相同的。 请禁用 PWM2的 SYNCO 并确认我在 F2802x 器件上的发现!

    谢谢、此致、
    Cody