L298N如何使步进电机停住

stc12c5a60s2控制L298N驱动步进电机,我想使步进电机转45度停止。如何解决啊

#include <stc12C5A60S2.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int  u16;

sbit TCRT1 = P2^2;  //颜色识别
sbit TCRT2 = P2^3;    //避障识别
sbit buzzer = P1^5; //蜂鸣器

u16 count = 0;
float targetAngle = 45.000; // 目标转动角度为90度
float currentAngle = 0.000; // 当前已转动角度为0

u8 code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时针旋转相序表
u8 code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时针旋转相序表

void    IO_Init()
{
    P0M1 = 0; P0M0 = 0;
    P1M1 = 0; P1M0 = 0;
    P2M1 = 0; P2M0 = 0;
}

void delay(unsigned int time) {
    unsigned int i, j;
    for (i = 0; i < time; i++) {
        for (j = 0; j < 10; j++);
    }
}

void buzzer_Init()
{
    buzzer = 1;
}

void forward()
{
    u16 i; 
    for(i=0;i<8;i++)
        {
            P1=(P1 & 0xF0) | CW[i];        
            delay(200);
        }    
}


void back(){
    u16 i; 
    for(i=0;i<8;i++)
        {
            P1=(P1 & 0xF0) | CCW[i];        
            delay(200);            
        }    
}

void stop(){
    P1=P1&0xF0;
}

void Motor_Ctrl_Angle(int direction, int angle)
{
    u16 j;
    if(direction == 1)
    {
        for(j=0;j<64*angle/45;j++) 
        {
            forward();//正转
        }
         stop();//停止
  }
    else
    {
        for(j=0;j<64*angle/45;j++) 
        {
            back();//反转
        }
         stop();//停止
    }
}


void main()
{
    //IO_Init();
    buzzer_Init();
                /*if(TCRT1 == 1 && TCRT2 == 1)        //避障识别到棋子且该棋子为黑子
            {
                Motor_Ctrl_Angle(0,45);
                
                //Motor_Ctrl_Angle(0,0);
            }
            else if(TCRT1 == 1 && TCRT2 == 0)
            {
                Motor_Ctrl_Angle(1,45);
                delay(20);                
            }
            else{
                buzzer = 0;
                delay(2000);
                buzzer = ~buzzer;
            }*/
        Motor_Ctrl_Angle(0,45);
}


  • 你可以参考下这篇文章:基于STC89C51和L298N的42步进电机控制
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    根据参考资料中的段落2和段落3,L298N可以作为电机驱动,用来控制直流电机的旋转方向和速度。而步进电机相对于直流电机略有不同,它是通过控制电流或脉冲来控制旋转角度的。

    步进电机一般有两种驱动方式:单相步进电机和双相步进电机。双相步进电机比较常见,可以通过控制相序和脉冲信号来控制旋转角度。

    对于L298N驱动步进电机,可以使用以下步骤来实现旋转到指定角度并停止的功能:

    1. 连接硬件: 将步进电机的两个线圈分别连接到L298N驱动器的OUT1-OUT4引脚,分别对应IN1-IN4引脚。
    2. 初始化引脚: 在代码中初始化L298N所使用的引脚为输出模式。
    3. 设置旋转角度和步长: 根据步进电机的类型和旋转角度,计算出每一步所需移动的角度。例如,如果步进电机是1.8度/步的双相步进电机,并且你想旋转45度,那么你将需要旋转45 / 1.8 = 25步。
    4. 设置旋转方向: 根据旋转角度的正负确定旋转方向。如果旋转角度为正,则设置引脚IN1和IN3为HIGH,IN2和IN4为LOW;如果旋转角度为负,则设置引脚IN1和IN3为LOW,IN2和IN4为HIGH。
    5. 使步进电机旋转: 使用循环语句控制步进电机旋转所需的步数,并在每一步之间添加适当的延迟,以控制步进电机旋转的速度。
    6. 停止步进电机旋转: 在完成指定步数的旋转后,将引脚IN1、IN2、IN3和IN4都设置为LOW,以停止步进电机的旋转。

    下面是一个示例代码,用于旋转步进电机到指定角度并停止:

    #include <Wire.h>
    
    // 定义引脚连接
    #define IN1 2
    #define IN2 3
    #define IN3 4
    #define IN4 5
    
    // 定义步进电机类型和旋转角度
    #define STEPS_PER_REVOLUTION 200   // 步进电机的步数/转
    #define DEGREES_PER_STEP 1.8       // 步进电机的角度/步
    #define DESIRED_ANGLE 45           // 旋转到的目标角度
    
    void setup() {
      // 初始化引脚为输出模式
      pinMode(IN1, OUTPUT);
      pinMode(IN2, OUTPUT);
      pinMode(IN3, OUTPUT);
      pinMode(IN4, OUTPUT);
    }
    
    void loop() {
      // 计算旋转所需的步数
      int steps = DESIRED_ANGLE / DEGREES_PER_STEP;
    
      // 设置旋转方向
      if (DESIRED_ANGLE > 0) {
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
      } else {
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
      }
    
      // 旋转步进电机
      for (int i = 0; i < steps; i++) {
        // 顺时针旋转
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        delay(5);
    
        // 逆时针旋转
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        delay(5);
      }
    
      // 停止步进电机旋转
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
    
      // 停止一段时间后再次旋转
      delay(1000);
    }
    

    请根据实际需要修改引脚连接和其他参数,以适应你的具体情况。