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.

[参考译文] MSP430FR2311:伺服电机

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1008816/msp430fr2311-servo-motor

器件型号:MSP430FR2311

大家好、TI 社区、  

我正在使用 msp430fr2311以顺时针和逆时针方向运行伺服电机3秒、其间暂停6秒。  

我正在尝试以下代码、但它对我完全不起作用。 如果您能让我知道我的错误位置、那会很棒。  

感谢你能抽出时间。  

#include <msp430.h>

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;                 // Stop WDT
    // Configure GPIO
    P2DIR |= BIT0 + BIT1;
    P2SEL0 |= BIT0 + BIT1;
    // Disable the GPIO power-on default high-impedance mode to activate
    // previously configured port settings
    PM5CTL0 &= ~LOCKLPM5;

    TB1CCR0 = 20000-1;                        // PWM Period is 20ms or (20,000/1,000,000 Hz)
    TB1CTL = TBSSEL__SMCLK | MC__UP | TBCLR;  // SMCLK, up mode, clear TBR

    TB0CCTL1 = CAP__COMPARE + CCIE;                             // compare mode + enable interrupts
   TB0CTL = TBSSEL__ACLK  | CNTL__16 | MC__CONTINUOUS | TBCLR   ; //use ACLK, max counter length (TBxR) 16bits, continuous mode, start timer
   // TB0CTL = TBSSEL__ACLK | MC__CONTINUOUS;

    if (TB1CCR1==1800){
        __delay_cycles(3000000);                  // servo moves ccw for 3 seconds
        TB1CCTL1 = OUTMOD_7;                      // CCR1 reset/set
        TB1CCR1 = 1550;                           // Stop the servo

        if (TB1CCR1==1550){
        __delay_cycles(6000000);                //Servo is stopped for 6 seconds
        TB1CCTL1 = OUTMOD_7;                      // CCR1 reset/set
        TB1CCR1 = 1300;                           //Move servo cw

        if(TB1CCR1==1300){
            __delay_cycles(3000000);              //servo moves cw for 3 seconds
            TB1CCTL1 = OUTMOD_7;                  // CCR1 reset/set
            TB1CCR1 = 1550;                       // Stop the servo
                         }

        __bis_SR_register(LPM0_bits);             // Enter LPM0
        __no_operation();
                           }
                        }

    while(1) {
    __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0
    __no_operation();                         // For debugger

    /*
    TB1CCTL1 = OUTMOD_7;                      // CCR1 reset/set
    TB1CCR1 = 1550;                           // Stop the servo

    TB0CCR0 = 32767;                          //I'm not sure this is doing anything
    TB1CCTL1 = OUTMOD_7;                      // CCR1 reset/set
    TB1CCR1 = 1300;                           // move servo Clockwise
    */
    }
}


//Timer_B1 TBCCR1 Interrupt Vector Handler Routine
#pragma vector = TIMER0_B1_VECTOR
__interrupt void TIMER0_B1_ISR (void)
{
  switch(__even_in_range(TB0IV,TB0IV_TBIFG))
  {
      case TB0IV_NONE: break;  //Vector 0: No interrupt
      case TB0IV_TBCCR1:       //Vector 2: TBCCR1 CCIFG. Interrupt source:capture/compare R1. Interrupt Flag: TBxCCR1 CCIFG.
          TB1CCTL1 = OUTMOD_7;                      // CCR1 reset/set
          TB1CCR1 = 1800;                           // CCR1 PWM duty cycle, start servo Counterclockwise

          __bic_SR_register_on_exit(LPM0_bits + GIE); //exit LPM0

          break;
      case TB0IV_TBCCR2: break;//Vector 4: TBCCR2 CCIFG
      case TB0IV_TBIFG: break; //Vector 6: TBIFG.
      default: break;

  }
}

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

    它现在有什么作用? 根据读数、我预计它空闲2秒、然后移动 CCW 并保持在该状态。

    我怀疑您希望 TB1CCR1上的所有这些比较都处于 while (1)循环中。 因为它们只执行一次--实际上是零次,因为 TB1CCR1==0。

    您的 while (1)循环将每2秒唤醒一次。 考虑使用计数器作为时钟、并使您的 CCR1在特定值处发生更改、例如 CCR1在2处更改、然后在(2+6)中间更改、然后在(2+6+2)处更改 CW。

    如果您使用的是 Launchpad、则可能应移除 J11 (P2.0 LED)上的跳线。

    您是否相当确定您的伺服运行在3.3V 电压下? 许多只能在5V 下运行。

    未经请求:

    >_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//退出 LPM0

    这会在 main()中禁用 GIE,最终会使您遇到问题。 尝试:

    >_BIC_SR_REGISTER_ON_EXIT  (LPM0_BITS);//EXIT LPM0

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

    感谢您的回复。  

    我的电机当前根本不会移动。 它在5V 电压下工作。  

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

    如果是5V 伺服、那么您的3.3V"高"PWM 电平可能不会在伺服中注册为"高"(Vil)。

    您可以引入3V->5V 电压转换器芯片来解决此问题。   购买支持3V 电压的小型伺服可能会更快/更便宜。 这里是 Adafruit 的一个

    https://www.adafruit.com/product/169

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

    感谢您的回复。 那么、没有可供我参考的使用 MSP430控制5V 伺服电机的示例代码?  

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

    3V/5V 是电气的、因此不同的代码不起作用。 您可以尝试使用3V 为伺服供电、看看会发生什么情况。 它可能起作用、也可能不起作用、但这是一个快速实验。

    我尚未看到 TI 提供的任何示例代码来执行此操作。 您可能可以搜索 GitHub。 我想您已经获得了所需的代码段、您只需重新排列即可。 (我在上面提到了几种可能性。)