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.

[参考译文] MSP430F5529:PWM +相移

Guru**** 2522770 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/711716/msp430f5529-pwm-phase-shift

器件型号:MSP430F5529

您好!

我正在尝试生成5个方波、它们之间的偏移为72度。 我在比较模式下使用计时器 B。 我的问题是我无法初始化输出引脚的初始状态。 我希望其中两个信号从低电平开始、其他三个信号从高电平开始、以便能够实现所需的相移。

谢谢

Nitish

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

    初始化输出引脚的初始状态有点棘手。 您可以通过将 OUTx 位设置为所需状态来实现该目的、但如果您随后继续并配置输出模式、则在一个时钟后初始状态也将被覆盖至输出模式的初始状态。

    可以选择使用两种不同的输出模式(例如复位/设置和设置/复位)、但这会导致连续反相状态切换。 另一种选择是使用相同的输出模式(具有相同的初始状态)、但调整 CCRx 值以应对移位。

    这两个选项中的任何一个是否适合您? 您可以在 Timer_B 用户指南一章中找到更详细的说明。

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

    我尝试使用 OUTx 选项、但没有注意到波形的任何变化。 我无法使用重置/设置和设置/重置、因为它们不会为我提供50%的占空比、而使用 CCRx 值时、相移为0、72、144、不会超过该值。

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

    您好!

    您的发现很有意义、因为它显示了我所解释的内容:您的初始状态将被输出模式的默认初始状态覆盖。

    我可能有人建议如何解决您的问题、但这取决于您的申请、因此您必须在事后告诉我这是否对您可行:

    您可以将 Timer_B 与7个捕获/比较寄存器结合使用、CCR0将设置您的 PWM 周期、您可以使用剩余的 CCRx (或其中的5个)对不同的 PWM 信号进行相移并确定占空比。 我建议使用"切换"模式作为输出模式、并使用计时器的向上计数模式。  但是、需要的是、在 生成中断 并将其设置为下一个值后、重新配置每个 CCRx (例如、第一个 PWM 信号的 CCR1)。

    让我们以一个示例为例:

    您的 CCR0为2000 (PWM 周期)。

    CCR1最初为200、因此当 TBxR 达到200时、您将收到一个中断、OUT1置1。 现在您将 CCR1重新配置为1200、这样 OUT1将在 TBxR 达到1200时复位。

    CCR2最初为300、因此当 TBxR 达到300时、您将收到一个中断、OUT2被置位。 现在您将 CCR2重新配置为1300、这样 OUT2将在 TBxR 达到1300时复位。

    现在、您可以根据 自己的需求调整班次和 PWM 周期。 在我的示例中、TBxR 在到达 CCR0后被清零。

    注意:您必须注意有足够的时间来实际执行 CCRx 的重新配置。 这取决于所需的两个边沿和您为 Timer_B 使用的时钟之间的时间

    请告诉我这是否有帮助。

    此致、

    Britta

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

    谢谢你。 我会尝试一次。 我想放置两个36度和72度波形的"非"门。

    此致

    Nitish

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

    谢谢你。 我会尝试一次。 我想放置两个36度和72度波形的"非"门。

    此致

    Nitish

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能给我发送一个示例吗? 我尝试执行它、但从未调用过中断。 此外、现在我必须对移相75%占空比信号进行配置

    此致

    Nitish
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include 
    
    
    /**
    * main.c
    *
    
    / void main (void)
    {
    
    WDTCTL = WDTPW + WDTHOLD; //停止 WDT
    
    /*P1DIR |= BIT0; // ACLK 设置为引脚
    P1SEL |= BIT0;
    P2DIR |= BIT2; // SMCLK 设置为引脚
    P2SEL |= BIT2;
    P7DIR |= BIT7; // MCLK 设置为引脚
    P7SEL |= BIT7;*/
    
    P5SEL |= BIT2+BIT3; //端口选择 XT2
    P5SEL |= BIT4+BIT5; //端口选择 XT1
    
    UCSCTL6 &=~XT2OFF; //在
    UCSCTL6上设置 XT2 &=~XT1OFF; //在
    UCSCTL6上设置 XT1 |= XCAP_3; //内部负载电容
    
    UCSCTL1 = DCORSEL_5;
    UCSCTL2 = FLLD_1 +(218);
    
    // XT1默认开启、因为它是 FLL 的默认基准-内部负载电容?
    //循环直到 XT1、XT2和 DCO 稳定
    执行
    {
    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
    //清除 XT2、XT1、DCO 故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } while (SFRIFG1&OFIFG); //测试振荡器故障标志
    
    UCSCTL6 &=~XT2DRIVE0; //根据减少 XT2驱动
    //预期频率
    UCSCTL4 |= SELA_0 + SELS_5; //选择 SMCLK、ACLK 源和 DCO 源
    
    P5SEL |= 0x80;
    P5DIR |= 0x80;
    // P5OUT |= BIT7;
    P7SEL |= 0x50;
    P7DIR |= 0xFF;
    //P7OUT |= 0x50;
    P3SEL |= 0x60;
    P3DIR |= 0xFF;
    //P3OUT &=~(BIT4+BIT5);
    
    
    
    TB0CCR0 = 89;
    
    //TB0CCTL1 |= BIT2;
    // TB0CCTL2 |= BIT2;
    // TB0CCTL4 |= BIT2;
    TB0CCTL1 = OUTMOD_7;
    TB0CCR1 = 68;
    
    TB0CCTL2 = OUTMOD_4 + CCIE;
    TB0CCR2 = 18;
    
    TB0CCTL4 = OUTMOD_4 + CCIE;
    TB0CCR4 = 14;
    
    TB0CCTL5 = OUTMOD_4 + CCIE;
    TB0CCR5 = 32;
    
    TB0CCTL6 = OUTMOD_4 + CCIE;
    TB0CCR6 = 50;
    
    TB0CTL = TBSSEL_2 + MC_1 + TBCLR + TAIE;
    
    _bis_register (LPM0_Bits + GIE);
    
    
    
    
    
    
    while (1);
    
    
    
    
    }
    
    
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
    #pragma vector=TIMERB0_vector
    __interrupt void TIMERB0_ISR (void)
    #elif defined (_TIMERB0_TRIBERSIR_
    )(void)(void TI_BIMCU_)(void)(void TIMER0)(void TI_TRIBERST_TRIBERSIR_)(void)(void BI_TRIBERSIR_)(
    
    
    #endif
    {
    switch (__even_in_range (TB0IV、12))
    {
    案例4:
    如果(TB0CCR2 == 18)
    {
    TB0CCR2 = 86;
    }
    其他
    {
    TB0CCR2 = 18;
    }
    中断;
    案例8:
    如果(TB0CCR4 = 14)
    {
    TB0CCR4 = 36;
    }
    其他
    {
    TB0CCR4 = 14;
    }
    中断;
    案例10:
    如果(TB0CCR5 == 32)
    {
    TB0CCR5 = 54;
    }
    其他
    {
    TB0CCR5 = 32;
    }
    中断;
    情况12:
    如果(TB0CCR6 == 50)
    {
    TB0CCR6 = 72;
    }
    其他
    {
    TB0CCR6 = 50;
    }
    中断;
    默认值:
    中断;
    }
    
    }
    
    
    
    //中断似乎不起作用。 您能告诉我哪里出了问题吗?
    

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

    比这简单得多:在本例中、3通道输出、彼此相隔60度。

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

    您是否了解了 Danny 为您提供的内容?
    还有其他未结项目吗? 如果您仍有关于中断的问题、我建议您查看我们作为 TI Resource Explorer 的一部分提供的代码示例。

    请告诉我您的当前状态是什么。

    谢谢、此致、
    Britta