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.

[参考译文] MSP430FR6043:TimerB0

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1458083/msp430fr6043-timerb0

器件型号:MSP430FR6043

工具与软件:

您好!

我将从 Tb0.4生成 PWM 脉冲。  

    param.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
    param.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_4;
    param.timerPeriod = timePeriod-1;
    param.timerInterruptEnable_TBIE = TIMER_B_CCIE_CCR0_INTERRUPT_DISABLE;
    param.captureCompareInterruptEnable_CCR0_CCIE =
            TIMER_B_CCIE_CCR0_INTERRUPT_DISABLE;
    param.timerClear = TIMER_B_DO_CLEAR;
    param.startTimer = false;
    
    Timer_B_initUpMode(TIMER_B0_BASE, &param);

    //Initialize compare mode to generate PWM1

    param1.compareRegister = TIMER_B_CAPTURECOMPARE_REGISTER_4;
    param1.compareInterruptEnable = TIMER_B_CCIE_CCR0_INTERRUPT_DISABLE;
    param1.compareOutputMode =  TIMER_B_OUTPUTMODE_SET_RESET;
    param1.compareValue = timePeriod*0;
    Timer_B_initCompareMode(TIMER_B0_BASE, &param1);

执行一次 100us、 我必须将占空比0%更改为100%(比较值)。 使用 TimerA0生成100us 循环。

#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR (void){

#if 1
    if(flag==1)
    {

        if(dCuS<50)
        {
            Dutycycle=(timePeriod*dcArray1[dCuS]);
            if(Dutycycle!=0)
            {

                Timer_B_setCompareValue(TB0_BASE,TIMER_B_CAPTURECOMPARE_REGISTER_4,(uint16_t)Dutycycle);
                dCuS+=1;
            }
            else
            {

                Timer_B_setCompareValue(TB0_BASE,TIMER_B_CAPTURECOMPARE_REGISTER_4,0);
                dCuS+=1;
            }
        }
        else
        {
            Timer_B_setCompareValue(TB0_BASE,TIMER_B_CAPTURECOMPARE_REGISTER_4,timePeriod*0.50);

            dCuS=1;
        }

        count+=1;
    }
#endif

    Timer_A_clearTimerInterrupt(TIMER_A0_BASE);
}

当在示波器中观察到每个波形时、我观察到 PWM 生成中出现一个骤降/尖峰、这正在影响我的整体波形。

如何纠正此问题?

此致、

Sarwath

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

    每50个 TA0周期、您在占空比为50%的情况下注入一个 TB0周期。 根据 TB0计数是恰好小于还是大于50%的时间段、这可能会导致50%的脉冲或150%的脉冲、因为后者的情况下更新"错过了"预期的计数器值。

    通常、这可以通过使用 CLLD (=1) TimerB 功能将比较器更新与计时器周期协调来解决。 然而、FR6043会受到 TB25勘误表[参考勘误表(SLAZ715B)第14页]的影响、该表表明(实际上)计时器始终运行、就像 CLLD=0一样(这就是您现在拥有的状态)。

    下一个最佳解决方案是使用 TB0本身在软件中协调更新:不是在 TA0_0中断中直接更新 TB0CCR4、将预期的值存储在一个变量中、然后在 TB0周期开始时从该变量到 TB0CCR4有一个(新) TB0_0 ISR 副本。 但如果时间足够长、可能不构成实际问题、这会带来延迟风险。

    [编辑:修复了一些寄存器名称。]