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:占空比变化

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1044602/msp430f5172-duty-cycle-variation

器件型号:MSP430F5172

您好!  

我的代码中生成的占空比有问题。 我在我的电源转换器中使用此代码、但在本例中、我只提供固定的占空比值、并且仅打开栅极驱动器电源(不运行转换器)。  但是、我会随机变化占空比、即使它是固定的、这也是我在闭环运行转换器时遇到尖峰的原因。 我在 下面插入了主代码的一个片段以及用于设置周期和占空比的函数。  

我正在删除代码的子部分、并尝试找出问题所在。 对我来说、没有意义的是、当我只设置占空比值并调用函数时、代码运行良好、但添加代码行"Vbuck_new=3;"可实现随机切换。   

    while (1){
        /*
        P1OUT = 0b0;
        adc_chan=7;
        ADC10MCTL0 = (ADC10MCTL0 & ~ADC10INCH_1) | ADC10INCH_7;
        GetADC(); // Vin_temp

        Vin_3=Vin_2;
        Vin_2=Vin_1;
        Vin_1=Vin_0;
        Vin_0=Vin_temp;
        Vin=(Vin_0+Vin_1+Vin_2+Vin_3)>>2;
        __delay_cycles(10);
        __no_operation();

        Vin_new=Vin/52;
        */
        
        Vbuck_new=3; //Vbuck_temp/57;

        D_buckH=85;//333*(Vbuck_new/Vin_new);

        if (D_buckH>280){
            D_buckH=280;
        }

        else if (D_buckH<75){
            D_buckH=75;
        }

        D_buckL=D_buckH+1;

        __delay_cycles(10);                   // Delay between sequence convs

        SetDuty_Buck (D_buckH, D_buckL);
        __no_operation();

    }
    
    
    void SetPWM(unsigned int tbuck, unsigned int tboost){
    // Configure TimerD in Hi-Res Regulated Mode - for TD0
    TD0CTL0 = TDSSEL_2;                    // TDCLK=SMCLK=25MHz=Hi-Res input clk select
    TD0CTL1 |= TDCLKM_1;                   // Select Hi-res local clock
    TD0HCTL1 |= TDHCLKCR;                  // High-res clock input >15MHz
    TD0HCTL0 = TDHM_0 +                    // Hi-res clock 8x TDCLK = 200MHz
            TDHREGEN +                     // Regulated mode, locked to input clock
            TDHEN;                         // Hi-res enable

    // Configure TimerD in Hi-Res Regulated Mode - for TD1
    TD1CTL0 = TDSSEL_2;                    // TDCLK=SMCLK=25MHz=Hi-Res input clk select
    TD1CTL1 |= TDCLKM_1;                   // Select Hi-res local clock
    TD1HCTL1 |= TDHCLKCR;                  // High-res clock input >15MHz
    TD1HCTL0 = TDHM_0 +                    // Hi-res clock 8x TDCLK = 200MHz
            TDHREGEN +                     // Regulated mode, locked to input clock
            TDHEN;                         // Hi-res enable

    while(!TDHLKIFG);                      // Wait until hi-res clock is locked -  frequency lock Interrupt Flag
    TD0CTL0 |= TDCLR;                      // Reset timer for TD1
    TD0CCR0 = tbuck;                       // Period Register - 200MHz/(100kHz)= 2000 - using high resolution clock
    TD1CTL0 |= TDCLR;                      // reset timer for TD1
    TD1CCR0 = tboost;                      // Period Register - 200MHz/(100kHz)= 2000 - using high resolution clock
}

void SetDuty_Buck (unsigned int dbuckH, unsigned int dbuckL) {
    TD0CTL0 |= TDCLR;                      // reset timer for TD1
    TD0CCTL1 |= OUTMOD_2 + CLLD_2;           // CCR1 toggle/reset
    TD0CCR1 = dbuckH;                         // CCR1 PWM duty cycle of 1000/2000 = 50%
    TD0CCTL2 |= OUTMOD_6 + CLLD_2;           // CCR2 toggle/set
    TD0CCR2 = dbuckL;                         // CCR2 PWM duty cycle of 500/2000 = 25%
    TD0CTL0 |= MC_3 + TDCLR;                 // up/down-mode, clear TDR, Start timer

}

下面的前两幅图显示了开关波形、最后一幅图显示了由于这种随机开关而发生的电压瞬态。  

谢谢你。

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

    正如我所理解的(?)、您关注的是示波器迹线中的这些间隙。

    在 SetDuty 中、您将使用 TDCLR 清除计数器(两次)。 我想您不想这么做。  清零计数器会将其返回到0、但不会触发 EQU0事件、因此它会使用清零时发生的任何输出来运行周期的第一部分。 使用切换模式会使这种效果变得更加复杂。 (我怀疑添加该赋值语句会改变元周期、从而 TDCLR 在"不良"时间更频繁地发生。)

    通常、您应该只让 PWN 运行。 CLLD 机制将在安全的时间(通过 CCRn 寄存器)更新 CLN 寄存器、从而避免更新毛刺。

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

    非常感谢。 是的、这就是问题所在、移除 TDCLR 有助于消除这些干扰。 函数中的第一个 TDCLR 实际上被注释掉。 我没有注释它是为了绕过代码、但主要问题是代码" TD0CTL0 |= MC_3 + TDCLR;"这一行中的 TDCLR

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

    那么、我理解、为什么在设置占空比时示例代码会添加 TDCLRthis? (例如:MSP430F51x2_td0_21.c)

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

    该示例仅在计数器启动之前设置一次占空比寄存器(始终)。 在首次启动 PWM 时清除计数器并不不合理(但在典型的实践中没有必要)。

    您的 SetDuty 函数用于(a)首次启动 PWM、以及(b)更新占空比寄存器、从而重复执行一些首次操作(OUTMOD、CLLD)。 将这两个函数分解为两个函数可能不太麻烦,一个函数是执行(a)函数,另一个函数是执行(b)函数。

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

    感谢您的澄清!