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.

[参考译文] MSP430F5172:当定时器 D0开始时、交错 PWM 重叠为高电平

Guru**** 2380860 points
Other Parts Discussed in Thread: MSP430F5172, CCSTUDIO
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1188236/msp430f5172-interleaved-pwm-overlapping-high-when-timer-d0-begins

器件型号:MSP430F5172
Thread 中讨论的其他器件: CCStudio

您好!

我使用 MSP430F5172在具有 CCR1和 CCR2的计时器 D0上创建交错 PWM。 D0分别在增/减模式下运行、CCR1/2分别在比较模式切换复位和切换设置下运行。

PWM 正被正确交错;然而、当定时器同时启动两个输出高电平时、第一个脉冲上会出现问题、这是我们尝试避免的情况。

下面是信号的图像、其中 D0.1是 TD0 CCR1、D0.2是 TD0 CCR2。

在 TI 的 CCStudio 示例代码教程中分析这些信号时、也会发生这种现象。 是否有办法解决这个问题? 是否存在潜在的配置问题?

TI 的文档指出、此 PWM 设置非常适合两个信号不应同时处于高电平的情况、但这种启动行为无法实现目标... 这使我认为我有配置问题。

下面是设置代码。

void init_timers(void)
{
    struct s_TLV_Timer_D_Cal_Data * pTD0CAL;  // Structure initialized in tlv.h
    uint8_t bTD0CAL_bytes;

    // Stop WDT
    WDT_A_hold(WDT_A_BASE);

    //Get TimerD0 Cal Values (instance 0)
    TLV_getInfo(TLV_TAG_TIMER_D_CAL, 0, &bTD0CAL_bytes, (uint16_t **) &pTD0CAL);

    if(bTD0CAL_bytes == 0x0)
    {
      // No TimerD free running cal data found
      while(1);                             // Loop here
    }

    /*
    * Configuration
    */
    // Setup TD0
    TD0CTL0 |= TDCLGRP_0 | CNTL_0 | TDSSEL_2 | MC__UPDOWN | ID_0 | TDCLR;
    TD0CTL1 |= TDIDEX_0  | TDCLKM_1;

    // Enable high resolution clock
    TD0HCTL0 = TDHEN + TDHM_1;
    TD0HCTL1 = pTD0CAL->TDH0CTL1_128;

    // Configure CCR modes
    TD0CCTL0 |= TIMER_D_OUTPUTMODE_OUTBITVALUE;
    TD0CCTL1 |= TIMER_D_OUTPUTMODE_TOGGLE_RESET;
    TD0CCTL2 |= TIMER_D_OUTPUTMODE_TOGGLE_SET;

    // Configure latching compare thresholds
    ...
}

感谢你的任何帮助。

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

    你好、Zach、

    CCR0、CCR1和 CCR2的值是什么? 我希望您希望使用反相占空比 来防止 PWM 同时处于高电平(此应用是否会有机会成为 H 桥?)

    此致、

    Luke

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

    您好、Luke、

    递增/递减计数器计数至1000 (因此1个周期为2000次计数)、当计数器达到450时 CCR1触发、当计数器达到550... 这样、我就可以在交替 PWM 脉冲之间使用一个100计数缓冲器、因此我在2个45%占空比信号之间有一个10%的死区、该死区180度相位差。

    CCR0不用于任何锁存切换。

    该应用是交错降压转换器。

    我实际上已经针对这个问题制定了一个权变措施。 以下代码+伪代码运行良好。

        TD0CCTL0 |= TIMER_D_OUTPUTMODE_OUTBITVALUE;
        TD0CCTL1 |= TIMER_D_OUTPUTMODE_TOGGLE_RESET;
        TD0CCTL2 |= TIMER_D_OUTPUTMODE_OUTBITVALUE;
        
        ... latch values ...
        
        ... start and clear TD0 counter ...
        
        __delay__cycles(200);
        TD0CCTL2 |= TIMER_D_OUTPUTMODE_TOGGLE_SET;
        ... clear TD0 counter ...
        

    老实说、我发现这是运气差... 但它运行良好、因为我的计数器周期为1000。 这就是我认为这是可行的原因。 我的基本时钟为25MHz、我们使用128MHz 高分辨率参考时钟作为计数器。 在仅 CCR1计数的情况下启动 TD0之后、I 将基准时钟延迟200个周期。 在1个基准时钟周期内、高分辨率时钟计数为5.12次。 在200个周期后、高分辨率计数器已达到1024、这是计数器的半个周期、即180度计数。 此延迟允许在计数器的不同阶段而不是在同一阶段启动 CMR、从而避免该第一个周期上的任何竞争抖动。 再说一次、这是我的假设、但我认为它在正确的轨道上。

    我很想听到您对此有何想法。

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

    你好、Zach、

    我继续操作、拉动了 MSP430F5172和 第一个 PWM 示例的示例代码。 直接运行代码我没有与输出重叠。

    #include <msp430.h>
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      // configure ports
      P1SEL |= BIT7;                            // P1.7, option select
      P1DIR |= BIT7;                            // P1.7 output
      P2SEL |= BIT0;                            // P2.0 options select
      P2DIR |= BIT0;                            // P2.0 output
      
      // Configure TD0
      TD0CCR0 = 128;                            // PWM Period/2
      TD0CCTL1 = OUTMOD_6;                      // CCR1 toggle/set
      TD0CCR1 = 32;                             // CCR1 PWM duty cycle
      TD0CCTL2 = OUTMOD_6;                      // CCR2 toggle/set
      TD0CCR2 = 96;                             // CCR2 PWM duty cycle
      TD0CTL0 = TDSSEL_2 + MC_3 + TDCLR;        // SMCLK, up-down mode, clear TDR
    
      __bis_SR_register(LPM0_bits);             // Enter LPM0
      __no_operation();                         // For debugger
    }

    我认为操作顺序是错误的。 在您设置 TD0CTLx 寄存器后、请尝试最后进行 TD0CTL0寄存器设置。 这将启动计时器、因此在您的情况下、计时器正在运行、然后配置捕获比较寄存器。

    此致、

    Luke

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

    很好的收获 这起作用了。 谢谢!