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.

[参考译文] MSP430F2122:PWM 启动初始脉冲与采用增/减配置的第二个 PWM 脉冲重叠

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/991387/msp430f2122-pwm-startup-initial-pulse-overlap-with-second-pwm-pulse-in-up-down-configuration

器件型号:MSP430F2122

当器件最初上电时、第一个脉冲始终比所需的设定点长很多。 一旦器件运行并输入、将其引导回主代码的开始、脉冲宽度始终正确。 我只会看到第一个脉冲的启动问题。   

//Setup Timer for PWM
	TACCR0 = 360 - 1;                       // Pulse Frequency
	TACCR1 = 0;                             // Pulse Width - 0 is OFF ?
	TACCTL1 = OUTMOD_2;                     // TA0CCR2 toggle mode
	TACCTL2 = OUTMOD_6;                     // TA0CCR2 toggle mode
	TA0CTL = TASSEL_2 + MC_0;               // SMCLK, up/down mode
	TACCR2 = (TACCR0 - TACCR1);             // Set Hi/Lo Pulse Equal

//function called to start PWM output

volatile int Test_Volt(volatile int m)
{
    volatile int i = 0;
    TACCR1 = 25;                        // Set width value
    TA0CTL = TASSEL_2 + MC_3;           // Start 
    TACCR2 = (TACCR0 - TACCR1);
    for (i=0;i<10;)                     // Code to loop
    {
    while ((TACTL & CCIFG) == 1)
    {i++;
    break;
    }
    }

    TACCR1 = 0;
    TACCR2 = (TACCR0 - TACCR1);
    TA0CTL = TASSEL_2 + MC_0;           // Stop pulses for test
    TA0CTL = TASSEL_2 + MC_3;
    for (i=0;i<60;)                     // Code to loop
        {
        while ((TACTL & CCIFG) == 1)
        {i++;
        break;
        }
        }


    ADC10CTL1 |= INCH_1;                //Select Analog Input
    ADC10CTL0 |= ENC + ADC10SC;         // Sampling and conversion start
    __bis_SR_register(CPUOFF + GIE);
           if (ADC10MEM < 512)
           {
           P1OUT &= ~BIT0;              // Turn off 1 LED
           P1OUT |=BIT1;                // Turn on 2 LED
           ADC10CTL0 &= ~ENC;           // Stop ADC
           ADC10CTL1 &= ~ INCH_15;      // Clear ADC Pin Select
           m = 1;
           return m;
           }
           else{
           P1OUT |= BIT0;               // Turn on 1 LED
           ADC10CTL0 &= ~ENC;           // Stop ADC
           ADC10CTL1 &= ~ INCH_15;}     // Clear ADC Pin Select
           m = 0;
           return m;
}
	

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

    Josh、您好!

    我不确定"输入会将其返回到主代码的开头"是什么意思。 初始计时器代码是否与稍后重复的代码不同?

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

    我假设黄色轨迹线是 TACCR2输出、蓝色轨迹线是示波器快照中的 TACCR1输出。 我在《MSP430x2xx 系列用户指南》中的图12-9中尝试了这一点。 我可以看到蓝色脉冲和第二个黄色脉冲如何相互相反地继续、从而启用死区。

    假设首先执行设置代码、然后是 Test_Volt ()中的代码。 通过将 TACCR1设置为0、可在设置代码中使 TACCR2等于 TACCR0。 这可能是一个未定义状态、导致您看到的情况、因为您使用的是向上/向下模式、该模式将 TACCR1和 TACCR2输出围绕 TACCR0进行集中。 我不确定如果 TACCR2等于 TACCR0会发生什么情况、因为 TACCR2旨在小于 TACCR0以提供以 TACCR0为中心的脉冲。 如果它相等、它可能会尝试同时升高和降低!

    尝试在 设置代码中将 TACCR1从0增加到1。 我怀疑您不会看到这种奇怪的行为、因为 TACCR2将小于 TACCR0。

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

    volatile int Test_Rail(volatile int m)
    {
        volatile int i = 0;
        TA0CTL = TASSEL_2 + MC_3;
        TACCR1 = 1;
        TACCR2 = (TACCR0 - TACCR1);
        TA0CTL = TASSEL_2 + MC_3;
        TACCR1 = 20;
        TACCR2 = (TACCR0 - TACCR1);
        for (i=0;i<5;)                     // Code to loop and count 5 pwm periods
        {
        while ((TACTL & TAIFG) == 1)
        {i++;
        TACTL &= ~TAIFG;
        break;
        }
        }
        TA0CTL = TASSEL_2 + MC_0 + TACLR;
        TACCR1 = 0;
        TACCR2 = (TACCR0 - TACCR1);
        TA0CTL = TASSEL_2 + MC_3;
        for (i=0;i<3;)                     // Code to loop and count 3 pwm periods
            {
            while ((TACTL & TAIFG) == 1)
            {i++;
            TACTL &= ~TAIFG;
            break;
            }
            }
    
    
        ADC10CTL1 |= INCH_1;                //Select Analog Input
        ADC10CTL0 |= ENC + ADC10SC;         // Sampling and conversion start
        __bis_SR_register(CPUOFF + GIE);
               if (ADC10MEM < 512)
               {
               P1OUT &= ~BIT0;              // Turn off 1 LED
               P1OUT |=BIT1;                // Turn on 2 LED
               ADC10CTL0 &= ~ENC;           // Stop ADC
               ADC10CTL1 &= ~ INCH_15;      // Clear ADC Pin Select
               m = 1;
               return m;
               }
               else{
               P1OUT |= BIT0;               // Turn on 1 LED
               ADC10CTL0 &= ~ENC;           // Stop ADC
               ADC10CTL1 &= ~ INCH_15;}     // Clear ADC Pin Select
               m = 0;
               return m;
    }

    我昨天在看到您的回复之前就讨论过这个问题、设置 TACCR1 = 1似乎会有所帮助。 我还更改了代码、如果测试失败、则不会在测试部分循环。 当它被设置回环时、第一个脉冲看起来是它应该的一半时间、而一半时间将是一个长脉冲、如图所示。  

    在侧注中、我注意到将 DCO 设置为1MHz 或高达16MHz 似乎对我的开关频率没有影响。 我认为时钟已经连接了吗?

     我在开始时使用以下代码来设置时钟。 也许我在这里做错了。

    //Setup Clock
    DCOCTL = 0; // Select lowest DCOx and MODx settings
    BCSCTL1 = CALBC1_16MHZ; // Set DCO to 16MHz
    DCOCTL = CALDCO_16MHZ;

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

    请记住、TAIFG 会在 TACCR1输出脉冲的中间进行设置、因此它不会像 TACCR2那样是一个完整周期。 我只需使用 TACCR1和 TACCR2 < TACCR0来设置计时器一次、启动计时器并测量输出。

    TI Resource Explorer 中有多个 PWM 示例 可能会有所帮助。 您还可以找到时钟示例。 如果您更改 DCO 频率并且看不到定时器周期的变化、那么我怀疑 SMCLK 不等于 MCLK。 TASSEL_2选择 SMCLK、而不是 MCLK。

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

    我设法清除了校准内存、这反过来又导致我的代码的第二行调用这些值来加载时钟设置无用。