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.

[参考译文] MSP430FR4133:具有 ULN2003驱动程序问题的步进电机

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1190801/msp430fr4133-stepper-motor-w-uln2003-driver-issues

器件型号:MSP430FR4133

您好!  

过去几天、我一直尝试使用 ULN2003驱动器来控制步进电机(BYJ48)、但没有成功、步进电机移动速度非常缓慢、振动回和回波、下面是我非常简单的代码:

void main(void)
{
    WDTCTL = WDTPW | WDTHOLD; // Stop WDT
    // Stepper Pin 1 = GPIO_PIN3, Pin2 = GPIO_PIN4, etc.
    GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6);
    
    while(1) 
    {   
      for(int i = 0; i < 12; i++) 
      {
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);    
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000); 
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000); 
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
      }
      
      GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN3);
      GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
      GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
      GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
      __delay_cycles(1000);
      
      for(int j = 0; j < 12; j++) 
      {
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);    
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000); 
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000); 
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);
      }
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN5);
        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6);
        __delay_cycles(1000);            
    };   
    // __bis_SR_register(LPM0_bits); // Enter LPM0
}

其中 GPIO_PIN3为 IN1、GPIO_PIN4 = IN2、GPIO_PIN5 = IN3、GPIO_PIN6 = IN4。

我还使用外部电源为电机供电。  

我只想让步进电机连续360度旋转。  我正在关注此视频以供参考...  https://www.electronicwings.com/ti-launchpad/stepper-motor-interfacing-with-msp-exp430g2-ti-launchpad

它基于 Arduino、但代码是等效的。  

非常感谢您的帮助

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

    您好、Aaron、

    由于您使用的是 FRAM 器件(与您所查看的演示中没有的器件不同)、您能否尝试在第5行和第7行之间添加这一行代码、以便我们可以确保正确启用所有 GPIO?

    PMM_unlockLPM5();

    请告诉我这是否会改变代码的执行等

    最棒的
    Amruta

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

    您好! 感谢您的回复:)  

    使用 PMM_unlockLPM5()时,步进电机似乎表现出相同的行为。  

    此致

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

    器件之间存在一些差异、并在本指南中检查了一下、该说明在加电时 LOCKLPM5被清除。

    延迟比链接示例中的延迟(100ms)短得多、因此可能会超过最大步进速率。 请查看数据表以了解步进电机的情况。

    电源是复杂的。 即使 MSP430和步进电机使用单独的电源、通过将其信号接地连接到安全接地的电源也很容易获得意外的共享接地。

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

    大家好、感谢您的回答。  

    我尝试将延迟增加到100ms、但没有改变、电机不会移动。 我还检查了两个接地端的导通性、没有任何东西。  

    我不相信我的代码与同等 Arduino 示例有很大不同、除非我在这里遗漏了什么?

    此致、

    Aaron

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

    在将 Arduino 样式引脚引用转换为引脚编号、然后转换为您正在使用的引脚编号时、我发现很可能出现错误。 深入了解单极步进电机的参考、并仔细检查是否以正确的顺序发送正确的脉冲。

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

    您好、Aaron、

    您是否能够按照 David 的上述建议检查脉冲顺序?

    Amruta  

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

    大家好、我认为:  

    我已经仔细检查了布线配置、我相信这是微控制器输出的步进序列  

    但我还没有尝试过完全步进。

    参考:

    www.idc-online.com/.../Step_Sequence_of_Stepper_Motor.pdf

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

    您好、Aaron、

    从它的外观来看、您发送的顺序中有一些内容不正确、请参阅下面的内容。

    您是否有某种方法来监控此输出的源?

    Amruta