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/MSP430FR2311:使用 TimerB0创建延迟

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/677209/ccs-msp430fr2311-creating-delay-using-timerb0

器件型号:MSP430FR2311

工具/软件:Code Composer Studio

我正在控制伺服电机、我的目标是使其逆时针旋转1秒、停止1分钟、然后顺时针移动1秒。 在注释代码中,我使用__delay_cycles ()使其在3秒间隔内工作。 但我知道这效率很低、我想使用计时器来使这些延迟生效。 我使用 TB1 (使用 SMCLK)设置 PWM 周期和占空比。

如何将 TB0与 ACLK 一起使用来设置一个定时器并使我的延迟工作以实现我的目标?

2.另外,我不确定是否正确设置了中断。

当我运行这个代码时、伺服不会移动大约2秒钟、然后顺时针移动而不停止。

提前感谢您。

#include 

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
//配置 GPIO
P2DIR |= BIT0;//+ BIT1;
P2SEL0 |= BIT0;//+ BIT1;
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

TB1CCR0 = 20000–1; // PWM 周期为20ms 或(20,000/100,000Hz)
TB1CTL = TBSSEL_SMCLK | MC__UP | TBCLR;// SMCLK、向上计数模式、清除 TBR

TB0CCTL1 = CAP_COMPARE + CCIE; //比较模式+启用中断
TB0CTL = TBSSEL_ACLK | CNTL__16 | MC__Continuous | TBCLR;//使用 ACLK、最大计数器长度(TBxR) 16位、连续模式、启动计时器

// if (TB1CCR1=1800){
_delay_cycles (3000000); //伺服逆时针移动3秒
TB1CCTL1 = OUTMOD_7; // CCR1复位/置位
TB1CCR1 = 1550; //停止伺服

if (TB1CCR1=1550){
_DELAY_CYCLES (600000000); //伺服停止600秒(10分钟)
TB1CCTL1 = OUTMOD_7; // CCR1复位/置位
TB1CCR1 = 1300; //移动伺服 CW

if (TB1CCR1=1300){
_delay_cycles (3000000); //伺服顺时针移动3秒
TB1CCTL1 = OUTMOD_7; // CCR1复位/置位
TB1CCR1 = 1550; //停止伺服
}

_bis_SR_register (LPM0_bits); //输入 LPM0
__no_operation();
}
}
*/
while (1){
_bis_SR_register (LPM0_bits + GIE); //输入 LPM0
__no_operation(); //用于调试器
TB1CCTL1 = OUTMOD_7; // CCR1复位/置位
TB1CCR1 = 1550; //停止伺服

TB0CCR0 = 32767; //我不确定这是否在做任何事情
TB1CCTL1 = OUTMOD_7; // CCR1复位/置位
TB1CCR1 = 1300; //顺时针移动伺服
}
}


//Timer_B1 TBCCR1中断矢量处理程序例程
#pragma vector = TIMER0_B1_Vector
__interrupt void TIMER0_B1_ISR (void)
{
switch (__even_in_range (TB0IV、TB0IV_TBIFG))
}{
案例 TB0IV_NONE:break;//Vector 0:无中断
案例 TB0IV_TBCCR1: //向量2:TBCCR1 CCIFG。 中断源:捕捉/比较 R1。 中断标志:TBxCCR1 CCIFG。
TB1CCTL1 = OUTMOD_7; // CCR1复位/置位
TB1CCR1 = 1800; // CCR1 PWM 占空比,逆时针启动伺服

_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS + GIE);//退出 LPM0

中断;
案例 TB0IV_TBCCR2:中断;//向量4:TBCCR2 CCIFG
案例 TB0IV_TBIFG:中断;//向量6:TBIFG。
默认值:中断;

}
} 

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

    简单:

    1.将定时器设置为自由运行;

    2.在定时器 ISR 中、递增计数器;

    3.编写一个例程,将定时器和计数器结合起来,以读取时间。

    在您的应用中、使用上面提到的计时器例程为您的进程设置时间戳。

    您完成了。