请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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。 默认值:中断; } }