下一站是上岸 2023-07-10 00:18 采纳率: 66.7%
浏览 23

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);
}


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-10 04:14
    关注
    • 你可以参考下这篇文章:基于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);
      }
      

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

    评论

报告相同问题?

问题事件

  • 创建了问题 7月10日

悬赏问题

  • ¥15 微信小程序 前端页面内容搜索
  • ¥15 cpu是如何判断当前指令已经执行完毕,然后去执行下条指令的
  • ¥15 C++Codeinject远线程注入
  • ¥15 安装visual studio2022时visualstudiosetup启动不了,闪退。问题代号0x0和0x1389
  • ¥30 java spring boot2.5.3版本websocket连不上
  • ¥15 angular js调外部链接查看pdf
  • ¥15 openFOAM DPMFoam
  • ¥15 将查询到的值,赋值到table指定行中
  • ¥50 docker容器内部启动shell脚本多命令
  • ¥15 请问python的selenium怎么设置referer