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.

[参考译文] CCS/MSP430FR4133:如何获取PWM计数

Guru**** 2589265 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/635464/ccs-msp430fr4133-how-to-get-pwm-count

部件号:MSP430FR4133

工具/软件:Code Composer Studio

大家好,请帮我在这里输入如何获取PWM中断计数的代码


Int计数=0;
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P1DIR || BIT7;//将引脚1.0 设置为输出方向。
P1SEL0 |= BIT7;//选择引脚1.0 作为PWM输出。
TA0CCR0 = 1000-1;//将计时器A0捕获/比较0寄存器中的周期设置为1000 us。
TA0CCTL1 = OUTMOD_7;
TA0CCR1 = 800;//电源打开的时间(以微秒为单位)。 这是一半的时间,这就转换为50 % 占空比。
TA0CTL = tassel_2 + MC_1;//tassel_2选择SMCLK作为时钟源,而MC_1则告诉它计数到TA0CCR0中的值。
__bis_sr_register(LPM0_bits);//切换到低功耗模式0。


}

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

    您好,

    如果要计算PWM周期数,可以使用Timer0_A中断,因为PWM信号来自Timer0_A 可以通过添加以下代码来完成此操作:

    // Timer0_A3中断向量(TAIV)处理程序
    #if defined(__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector=TIMER0_A1_Vector
    __interrupt TIMER0_A1_ISR(void)
    #Elif defined)(_____GIMERm_)
    void _attribute_
    
    编译器0(void TIMER0_IMER0_Isr_interr_interrupt 0 (void
    #endif
    {
    Switch(__偶 数_in_range(TA0IV,TA0IV_TAIFG))
    {
    CASE TA0IV_NONE:
    中断; //不中断
    案例TA0IV_TACR1:
    中断; // CCR1
    CASE TA0IV_TACCR2:
    中断; // CCR2
    案例TA0IV_3:
    中断; //保留
    案例TA0IV_4:
    中断; //保留
    案例TA0IV_5:
    中断; //保留
    案例TA0IV_6:
    中断; //保留
    CASE TA0IV_TAIFG: //计时器计数时设置TAIFG
    ++计数; //在UP模式下通过TA0CCR0
    中断;
    默认:
    中断;
    }
    } 

    您还需要修改代码行设置TA0CTL以清除当前计时器值并启用中断。

    TA0CTL = tassel_2 | MC_1 | TCLR | TAIE; 

    中断格式来自 msp430fr413x_ta0_04.c 代码示例。

    此致,

    Ryan

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

    此程序可以工作,但我需要GPIO引脚1.5 中断计数,我将PWM输出给GPIO引脚WFP 1.5 ,此程序仅计算计时器计数  

    #include <MSP4S.h>

    无符号长整型计数=0;
    void PWM_Config (void);
    int i;
    内部主(无效)

    WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
    P1DIR || BIT0;//将WFP 1.0 设置为输出方向
    //P2DIR = 0x00;
    P1REN = BIT5;
    P1OUT ~BIT0;//将WFP 1.0 设置为0 (LED熄灭)

    P1IES = 0x00;//从低到高转换

    P1IE |= BIT5;//已启用WFP 1.2 中断

    P1IFG &=~BIT5;//已清除WFP 1.2 IFG

    PM5CTL0 &=~LOCKLPM2;
    //while (1)
    //{
    PWM_Config();

    __bis_sr_register(LPM0_bits);//输入带中断的LPM0
    __no_operation();


    //}
    }


    //端口1中断服务例程

    #pragma vector = Port1_vector
    __interrupt void Port1_ISR(void)

    P1OUT = 0x01;// LED打开
    //P1DIR = BIT5;

    IF (!(P1IN和BIT5))

    //count++;
    while (!(P1IN和BIT5));
    }
    P1OUT = 0x00;
    P1IFG &=~BIT5;

    }

    void PWM_Config (void)(无效)

    P1DIR || BIT7;//将引脚1.0 设置为输出方向。
    P1SEL0 |= BIT7;//选择引脚1.0 作为PWM输出。
    TA0CCR0 = 1000-1;//将计时器A0捕获/比较0寄存器中的周期设置为1000 us。
    TA0CCTL1 = OUTMOD_7;
    TA0CCR1 = 500;//电源打开的时间(以微秒为单位)。 这是一半的时间,这就转换为50 % 占空比。
    TA0CTL = tassel_2 | MC_1 | TCLR | TAIE;//tassel_2选择SMCLK作为时钟源,并且MC_1指示它计数到TA0CCR0中的值。

    //__bis_sr_register (LPM0_bits);
    //__no_operation();//用于调试器
    //__bis_sr_register( GIE );


    }

    // Timer0_A3中断向量(TAIV)处理程序
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=TIMER0_A3_vector
    __interrupt void TIMER0_A3_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (TIMER0_A3_vector))) TIMER0_A3_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

    Switch(__偶 数_in_range(TA0IV,TA0IV_TAIFG))

    CASE TA0IV_NONE:
    中断;//不中断
    案例TA0IV_TACR1:
    Break;// CCR1
    CASE TA0IV_TACCR2:
    Break;// CCR2
    案例TA0IV_3:
    休息;//已保留
    案例TA0IV_4:
    休息;//已保留
    案例TA0IV_5:
    休息;//已保留
    案例TA0IV_6:
    休息;//已保留
    CASE TA0IV_TAIFG://计时器计数时设置TAIFG
    ++计数;//在UP模式下通过TA0CCR0
    中断;
    默认:
    中断;
    }
    }

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